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
|