lib/sparql/algebra/expression/function_call/extension.ex

defmodule SPARQL.Algebra.FunctionCall.Extension do
  defstruct name: nil,
            arguments: [],
            distinct: false

  alias SPARQL.Algebra.FunctionCall

  defimpl SPARQL.Algebra.Expression do
    def evaluate(%SPARQL.Algebra.FunctionCall.Extension{
                    name: name, arguments: arguments, distinct: distinct},
                  data, execution) do
      case SPARQL.ExtensionFunction.Registry.extension_function(name) do
        nil ->
          # TODO: What should happen when no function_extension found?
          :error

        extension_function ->
          with {:ok, evaluated_arguments} <-
                 FunctionCall.evaluate_arguments(arguments, data, execution) do
            extension_function.call(distinct, evaluated_arguments, data, execution)
          end
      end
    end

    def variables(_function_call) do
      # TODO: return used and/or introduced variables???
    end
  end

end