class Arelastic::Queries::Bool

Attributes

filter[RW]
must[RW]
must_not[RW]
options[RW]
should[RW]

Public Class Methods

new(options) click to toggle source
# File lib/arelastic/queries/bool.rb, line 5
def initialize(options)
  @must     = read_option! options, 'must'
  @filter   = read_option! options, 'filter'
  @should   = read_option! options, 'should'
  @must_not = read_option! options, 'must_not'
  @options  = options
end

Public Instance Methods

as_elastic() click to toggle source
# File lib/arelastic/queries/bool.rb, line 13
def as_elastic
  searches = {}

  {
    'must'     => must,
    'filter'   => filter,
    'should'   => should,
    'must_not' => must_not
  }.each do |k, v|
    if v.is_a?(Array)
      v = merge_expression(k, v, klass: Queries::HasParent, merge_test_method: :parent_type)
      v = merge_expression(k, v, klass: Queries::HasChild, merge_test_method: :type)
      v = merge_expression(k, v, klass: Queries::Nested, merge_test_method: :path_and_options)
    end

    searches[k] = convert_to_elastic(v) if v
  end

  { 'bool' => searches.update(options) }
end
merge_expression(clause, expr, klass:, merge_test_method:) click to toggle source
# File lib/arelastic/queries/bool.rb, line 34
def merge_expression(clause, expr, klass:, merge_test_method:)
  mergeable, other = expr.partition { |el| el.is_a?(klass) }
  merged = mergeable.group_by(&merge_test_method).flat_map do |_, group|
    if group.size > 1
      group.first.instance_variable_set("@query", self.class.new(clause => group.map(&:query)))
      group.first
    else
      group
    end
  end
  merged + other
end