class EagleSearch::Interpreter::Filter

Constants

LOGICAL_OPERATORS

Public Class Methods

new(filters) click to toggle source
# File lib/eagle_search/interpreter/filter.rb, line 5
def initialize(filters)
  @filters = filters
end

Public Instance Methods

payload() click to toggle source
# File lib/eagle_search/interpreter/filter.rb, line 9
def payload
  @payload ||= generate_payload(@filters)
end

Private Instance Methods

elasticsearch_filter_hash(field, field_value) click to toggle source
# File lib/eagle_search/interpreter/filter.rb, line 36
def elasticsearch_filter_hash(field, field_value)
  case field_value
  when Array
    { terms: { field => field_value } }
  when Hash
    if field_value.keys.any? { |key| %i(lt gt lte gte).include?(key.to_sym) }
      { range: { field => field_value } }
    end
  when Range
    { range: { field => { gte: field_value.min, lte: field_value.max } } }
  when Regexp
    { regexp: { field => field_value.source } }
  when nil
    { missing: { field: field } }
  else
    { term: { field => field_value } }
  end
end
generate_payload(filters) click to toggle source
# File lib/eagle_search/interpreter/filter.rb, line 14
def generate_payload(filters)
  payload = {}

  filters.each do |key, value|
    key = key.to_sym

    if LOGICAL_OPERATORS.include?(key)
      payload = { bool: { LOGICAL_OPERATORS[key] => [] } }

      if value.is_a?(Array)
        value.each { |filter| payload[:bool][LOGICAL_OPERATORS[key]] << generate_payload(filter) }
      else
        value.each { |field, field_value| payload[:bool][LOGICAL_OPERATORS[key]] << generate_payload({ field => field_value }) }
      end
    else
      payload = elasticsearch_filter_hash(key, value)
    end
  end

  payload
end