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.
72 lines
2.5 KiB
72 lines
2.5 KiB
module DocumentSearch |
|
def document_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::Document.search do |
|
fulltext search_params[:q], fields: fulltext_fields, query_phrase_slop: 1 if search_params[:q].present? |
|
|
|
fulltext_fields.each do |field| |
|
fulltext search_params[field], fields: [field], query_phrase_slop: 1 if search_params[field].present? |
|
end |
|
|
|
with(:year, search_params[:year].to_i) if search_params[:year].present? |
|
|
|
without(:id).any_of(search_params[:exclude_ids]) if search_params[:exclude_ids].present? |
|
|
|
with(:citation_finders_names).any_of(sanitize_citer_finder_param(search_params[:citation_finder])) if search_params[:citation_finder].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 |