Module: BlacklightAdvancedSearch::AdvancedSearchBuilder
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/blacklight_advanced_search/advanced_search_builder.rb
Constant Summary collapse
- PARSLET_FAILED_EXCEPTIONS =
Different versions of Parslet raise different exception classes, need to figure out which one exists to rescue
if defined? Parslet::UnconsumedInput [Parslet::UnconsumedInput].freeze else [Parslet::ParseFailed].freeze end
Instance Method Summary collapse
-
#add_adv_search_clauses(solr_parameters) ⇒ Object
Override the upstream adv.
-
#add_advanced_parse_q_to_solr(solr_parameters) ⇒ Object
This method can be included in the SearchBuilder to have us parse an ordinary entered :q for AND/OR/NOT and produce appropriate Solr query.
-
#add_advanced_search_to_solr(solr_parameters) ⇒ Object
this method is left for backwards compatibility.
-
#facets_for_advanced_search_form(solr_p) ⇒ Object
A Solr param filter that is NOT included by default in the chain, but is appended for advanced searches, to do a search for facets ignoring the current query, we want the facets as if the current query weren’t there.
- #is_advanced_search? ⇒ Boolean
Instance Method Details
#add_adv_search_clauses(solr_parameters) ⇒ Object
Override the upstream adv. search implementation to use our own
18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/blacklight_advanced_search/advanced_search_builder.rb', line 18 def add_adv_search_clauses(solr_parameters) return unless is_advanced_search? # If we've got the hint that we're doing an 'advanced' search, then # map that to solr #q, over-riding whatever some other logic may have set, yeah. advanced_query = BlacklightAdvancedSearch::QueryParser.new(search_state, blacklight_config) BlacklightAdvancedSearch.deep_merge!(solr_parameters, advanced_query.to_solr) unless advanced_query.keyword_queries.empty? # force :qt if set, fine if it's nil, we'll use whatever CatalogController # ordinarily uses. solr_parameters[:qt] = self.blacklight_config.advanced_search[:qt] solr_parameters[:defType] = "lucene" end end |
#add_advanced_parse_q_to_solr(solr_parameters) ⇒ Object
This method can be included in the SearchBuilder to have us parse an ordinary entered :q for AND/OR/NOT and produce appropriate Solr query.
Note: For syntactically invalid input, we’ll just skip the adv parse and send it straight to solr same as if advanced_parse_q were not being used.
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/blacklight_advanced_search/advanced_search_builder.rb', line 51 def add_advanced_parse_q_to_solr(solr_parameters) return if blacklight_params[:q].blank? || !blacklight_params[:q].respond_to?(:to_str) field_def = blacklight_config.search_fields[blacklight_params[:search_field]] || blacklight_config.default_search_field # If the individual field has advanced_parse_q suppressed, punt return if field_def[:advanced_parse] == false solr_direct_params = field_def[:solr_parameters] || {} solr_local_params = field_def[:solr_local_parameters] || {} # See if we can parse it, if we can't, we're going to give up # and just allow basic search, perhaps with a warning. begin adv_search_params = ParsingNesting::Tree.parse(blacklight_params[:q], blacklight_config.advanced_search[:query_parser]).to_single_query_params(solr_local_params) BlacklightAdvancedSearch.deep_merge!(solr_parameters, solr_direct_params) BlacklightAdvancedSearch.deep_merge!(solr_parameters, adv_search_params) rescue *PARSLET_FAILED_EXCEPTIONS => e # do nothing, don't merge our input in, keep basic search # optional TODO, display error message in flash here, but hard to # display a good one. return end end |
#add_advanced_search_to_solr(solr_parameters) ⇒ Object
this method is left for backwards compatibility.
33 34 |
# File 'lib/blacklight_advanced_search/advanced_search_builder.rb', line 33 def add_advanced_search_to_solr(solr_parameters) end |
#facets_for_advanced_search_form(solr_p) ⇒ Object
A Solr param filter that is NOT included by default in the chain, but is appended for advanced searches, to do a search for facets ignoring the current query, we want the facets as if the current query weren’t there.
Also adds any solr params set in blacklight_config.advanced_search
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/blacklight_advanced_search/advanced_search_builder.rb', line 84 def facets_for_advanced_search_form(solr_p) return unless search_state.controller&.action_name == "advanced_search" # ensure empty query is all records, to fetch available facets on entire corpus solr_p["q"] = '{!lucene}*:*' # explicitly use lucene defType since we are passing a lucene query above (and appears to be required for solr 7) solr_p["defType"] = 'lucene' # We only care about facets, we don't need any rows. solr_p["rows"] = "0" # Anything set in config as a literal if blacklight_config.advanced_search[:form_solr_parameters] solr_p.merge!(blacklight_config.advanced_search[:form_solr_parameters]) end end |
#is_advanced_search? ⇒ Boolean
13 14 15 |
# File 'lib/blacklight_advanced_search/advanced_search_builder.rb', line 13 def is_advanced_search? search_state.clause_params.any? end |