You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.9 KiB
80 lines
2.9 KiB
module JurisprudenceSearch |
|
def jurisprudence_search(search_params) |
|
search_params.each { |k, v| params[k] = v.gsub(/“|”/, '"') if v.is_a?(String) } |
|
fulltext_fields = %i[reference_number title short_title].freeze |
|
|
|
search = Cdao::Jurisprudence.search do |
|
fulltext search_params[:q], fields: fulltext_fields if search_params[:q].present? |
|
|
|
%i[reference_number title short_title].each do |field| |
|
fulltext search_params[field], fields: [field], query_phrase_slop: 1 if search_params[field].present? |
|
end |
|
|
|
if search_params[:year_start].present? && search_params[:year_end].present? |
|
with(:year).between(search_params[:year_start].to_i..search_params[:year_start].to_i) |
|
end |
|
|
|
if search_params[:year_start].present? && search_params[:year_end].blank? |
|
with(:year, search_params[:year_start].to_i) |
|
end |
|
|
|
with(:subject_ids).any_of(search_params[:subject_ids].split(",").map(&:strip).map(&:to_i)) if search_params[:subject_ids].present? |
|
|
|
with(:citation_finders_names).any_of(sanitize_citer_finder_param(search_params[:citation_finder])) if search_params[:citation_finder].present? |
|
|
|
without(:id).any_of(search_params[:exclude_ids]) if search_params[:exclude_ids].present? |
|
|
|
with(:is_only_in_premium_libraries, false) |
|
|
|
if search_params[:sort_by].blank? |
|
order_by :search_year, :desc |
|
order_by :reference_number, :desc |
|
order_by :search_doc_date, :desc |
|
end |
|
|
|
paginate page: search_params[:page] || 1, per_page: search_params[:per_page] || 20 |
|
end |
|
|
|
search |
|
end |
|
|
|
def sanitize_citer_finder_param(citation_finder_param) |
|
citation_finder = [] |
|
params_vol = [] |
|
params_type = [] |
|
params_page = [] |
|
params[:citation_finder].scan(/\b((\d+\-?\w?)\s(SCRA|PhilRep|Phil|\S+)\.?,?\s?([-,\d\s]+)?)\b/i).map do |cit_fin| |
|
params_vol << cit_fin[1].gsub(/\s+/, "").gsub(/\A0*/, "") |
|
params_type.concat(case cit_fin[2] |
|
when /SCRA/i |
|
["SCRA"] |
|
when /(PhilRep|Phil)\.?,?/i |
|
["Phil"] |
|
else |
|
[] |
|
end |
|
) |
|
cit_fin[3].scan(/\d+-?\d*/).each do |page| |
|
if page.match?(/-/) |
|
page_range = [] |
|
page.scan(/\d+?\d*/).each do |each_page| |
|
page_range << each_page.to_i |
|
end |
|
params_page.concat((page_range[0]..page_range[1]).to_a) |
|
else |
|
params_page << page.to_i if params_page.index(page.to_i).blank? |
|
end |
|
end if cit_fin[3].present? |
|
end |
|
|
|
params_type.compact.each do |type| |
|
citation_finder << "#{params_vol[0] if params_vol.present?} #{type}" if params_page.blank? |
|
params_page.compact.uniq.each do |page| |
|
citation_finder << "#{params_vol[0] if params_vol.present?} #{type} #{page}" |
|
end |
|
end |
|
|
|
return [] if citation_finder.blank? |
|
citation_finder |
|
end |
|
end
|
|
|