lib/sparql/algebra/expression/union.ex

defmodule SPARQL.Algebra.Union do
  defstruct [:expr1, :expr2]

  alias __MODULE__
  alias SPARQL.Algebra.Expression


  def result_set(results1, results2) do
    %SPARQL.Query.Result{
      variables: variables(results1.variables, results2.variables),
      results: results1.results ++ results2.results
    }
  end


  def variables(vars, []), do: vars

  def variables(vars1, [var | vars2]) do
    if var in vars1 do
      variables(vars1, vars2)
    else
      variables([var | vars1], vars2)
    end
  end


  defimpl Expression do
    def evaluate(union, data, execution) do
      Union.result_set(
        Expression.evaluate(union.expr1, data, execution),
        Expression.evaluate(union.expr2, data, execution))
    end

    def variables(union) do
      Union.variables(
        Expression.variables(union.expr1), Expression.variables(union.expr2))
    end
  end
end