class Skala::PrimoAdapter::Search::RequestTransformation::AddQueries

Public Instance Methods

call() click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 8
def call
  query_terms_node = transformation.inner_search_request.locate("PrimoSearchRequest/QueryTerms").first

  [source.queries, source.facet_queries].flatten.compact.presence.try(:each) do |_query|
    if primo_query = query_factory(_query)
      [primo_query].flatten(1).each do |_primo_query|
        query_terms_node << _primo_query
      end
    end
  end
end

Private Instance Methods

map_query_field(field) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 90
def map_query_field(field)
  case field
  when 'id' then 'rid'
  else
    field
  end
end
query_factory(query) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 22
def query_factory(query)
  case query.type.to_sym
  when :ids                 then query_from_ids_query(query)
  when :match               then query_from_match_query(query)
  when :query_string        then query_from_query_string_query(query)
  when :range               then query_from_range_query(query)
  when :simple_query_string then query_from_query_string_query(query) # supports also simple_query_string_query
  else raise "Unsupported query type!"
  end
end
query_from_ids_query(query) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 33
  def query_from_ids_query(query)
    query.query.map do |_id|
      Ox.parse(
        <<-xml.strip_heredoc
          <QueryTerm>
            <IndexField>#{map_query_field("id")}</IndexField>
            <PrecisionOperator>exact</PrecisionOperator>
            <Value>#{_id}</Value>
          </QueryTerm>
        xml
      )
    end
  end
query_from_match_query(query) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 47
  def query_from_match_query(query)
    Ox.parse(
      <<-xml.strip_heredoc
        <QueryTerm>
          <IndexField>#{map_query_field(query.field)}</IndexField>
          <PrecisionOperator>exact</PrecisionOperator>
          <Value>#{query.query}</Value>
        </QueryTerm>
      xml
    )
  end
query_from_query_string_query(query) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 71
  def query_from_query_string_query(query)
    normalized_query =
    if query.default_operator.upcase == "OR"
      query.query.split(" ").join(" OR ")
    else
      query.query
    end

    Ox.parse(
      <<-xml
        <QueryTerm>
          <IndexField>#{map_query_field(query.try(:default_field) || query.try(:fields).try(:first))}</IndexField>
          <PrecisionOperator>contains</PrecisionOperator>
          <Value>#{normalized_query}</Value>
        </QueryTerm>
      xml
    )
  end
query_from_range_query(query) click to toggle source
# File lib/skala/primo_adapter/search/request_transformation/add_queries.rb, line 59
  def query_from_range_query(query)
    Ox.parse(
      <<-xml
        <QueryTerm>
          <IndexField>#{query.field}</IndexField>
          <PrecisionOperator>exact</PrecisionOperator>
          <Value>[#{query.gte} TO #{query.lte}]</Value>
        </QueryTerm>
      xml
    )
  end