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

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

Returns:

  • (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