class ConceptQL::Operators::Union

Public Instance Methods

flattened() click to toggle source
# File lib/conceptql/operators/union.rb, line 23
def flattened
  exprs = []
  upstreams.each do |x|
    if x.is_a?(Union)
      exprs.concat x.flattened.upstreams
    else
      exprs << x
    end
  end
  dup_values(exprs)
end
optimized() click to toggle source
# File lib/conceptql/operators/union.rb, line 35
def optimized
  first, *rest = flattened.upstreams
  exprs = [first]

  rest.each do |expression|
    add = true
    exprs.length.times do |i|
      exp = exprs[i]
      if exprs[i].unionable?(expression)
        exprs[i] = exp.union(expression, all: true)
        add = false
        break
      end
    end
    exprs << expression if add
  end

  dup_values(exprs.map{|x| x.is_a?(Operator) ? x.optimized : x})
end
query(db) click to toggle source
# File lib/conceptql/operators/union.rb, line 15
def query(db)
  upstreams.map do |expression|
    expression.evaluate(db).from_self
  end.inject do |q, query|
    q.union(query, all: true)
  end
end