lib/sparql/algebra/expression/distinct.ex

defmodule SPARQL.Algebra.Distinct do
  defstruct [:expr]

  alias SPARQL.Algebra.Expression
  alias SPARQL.Query.Result.SolutionMapping

  def result_set(%SPARQL.Query.Result{results: results} = result) do
    %SPARQL.Query.Result{result | results:
      results
      |> Stream.map(&SolutionMapping.remove_identity/1)
      |> Enum.uniq()
    }
  end

  defimpl Expression do
    def evaluate(distinct, data, execution) do
      Expression.evaluate(distinct.expr, data, execution)
      |> SPARQL.Algebra.Distinct.result_set()
    end

    def variables(distinct) do
      Expression.variables(distinct.expression)
    end
  end
end