Sha256: 2d8b6cce1993c10bc4b566755f649f2d8a0a018c87dd50da8dd0eba1d425d536

Contents?: true

Size: 1.47 KB

Versions: 2

Compression:

Stored size: 1.47 KB

Contents

require 'parsing_nesting/tree'

module BlacklightAdvancedSearch
  # Can extract query elements from rails #params query params, and then parse
  # them and convert them into a solr query with #to_solr
  #
  # #keyword_queries and #filters, which just return extracted elements of query
  # params, may also be useful in display etc.
  class QueryParser
    attr_reader :config, :search_state

    def initialize(search_state, config)
      @search_state = search_state
      @config = config
    end

    def to_solr
      @to_solr ||= begin
        {
          q: process_query(config)
        }
      end
    end

    # Returns "AND" or "OR", how #keyword_queries will be combined
    def keyword_op
      op = search_state.params[:op]&.to_sym || :must

      if op == :should
        'OR'
      else
        'AND'
      end
    end

    def keyword_queries
      search_state.clause_params.values.select { |clause| clause[:query].present? }
    end

    def process_query(config)
      queries = keyword_queries.map do |clause|
        field = clause[:field]
        query = clause[:query]

        ParsingNesting::Tree.parse(query, config.advanced_search[:query_parser]).to_query(local_param_hash(field, config))
      end
      queries.join(" #{keyword_op} ")
    end

    def local_param_hash(key, config)
      field_def = config.search_fields[key] || {}

      (field_def[:solr_adv_parameters] || field_def[:solr_parameters] || {}).merge(field_def[:solr_local_parameters] || {})
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
blacklight_advanced_search-8.0.0.alpha2 lib/blacklight_advanced_search/advanced_query_parser.rb
blacklight_advanced_search-8.0.0.alpha1 lib/blacklight_advanced_search/advanced_query_parser.rb