Method: NoBrainer::Criteria::Where::IndexFinder#find_strategy_union

Defined in:
lib/no_brainer/criteria/where.rb

#find_strategy_unionObject



510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
# File 'lib/no_brainer/criteria/where.rb', line 510

def find_strategy_union
  strategies = ast.clauses.map do |inner_ast|
    inner_ast = MultiOperator.new(:and, [inner_ast]) unless inner_ast.is_a?(MultiOperator)
    raise 'fatal' unless inner_ast.op == :and
    self.class.new(criteria, inner_ast).find_strategy
  end

  return nil if strategies.any?(&:nil?)

  rql_proc = lambda do |base_rql|
    strategies.map do |strategy|
      rql = strategy.rql_proc.call(base_rql)
      rql = rql.filter { |doc| strategy.ast.to_rql(doc) } if strategy.ast.try(:clauses).present?
      rql
    end.reduce(:union).distinct
  end

  Strategy.new(self, :union, strategies.map(&:index), nil, rql_proc)
end