class ConceptQL::Operators::Intersect

Public Instance Methods

query(db) click to toggle source
# File lib/conceptql/operators/intersect.rb, line 15
def query(db)
  exprs = {}
  upstreams.each do |expression|
    evaled = expression.evaluate(db)
    expression.domains(db).each do |domain|
      (exprs[domain] ||= []) << evaled
    end
  end
  domained_queries = exprs.map do |domain, queries|
    queries.inject do |q, query|
      # Set columns so that impala's INTERSECT emulation doesn't use a query to determine them
      q.instance_variable_set(:@columns, query_cols)
      query.instance_variable_set(:@columns, query_cols)

      q.intersect(query)
    end
  end

  domained_queries.inject do |q, query|
    q.union(query, all: true)
  end
end