lib/query_builder.ex

defmodule EctoShorts.QueryBuilder do
  @moduledoc "Behaviour for query building from filter tuples"

  @type filter_tuple :: {filter_type :: atom, value :: any}
  @type accumulator_query :: Ecto.Query.t

  @doc "Adds to accumulator query with filter_type and value"
  @callback create_schema_filter(filter_tuple, accumulator_query) :: Ecto.Query.t

  @spec create_schema_filter(module, filter_tuple, accumulator_query) :: Ecto.Query.t
  def create_schema_filter(builder, filter_tuple, query) do
    builder.create_schema_filter(filter_tuple, query)
  end

  @spec query_schema(Ecto.Queryable.t) :: Ecto.Queryable.t()
  @doc "Pulls the schema from a query"
  def query_schema(%{from: %{source: {_, schema}}}), do: query_schema(schema)
  def query_schema(%{from: %{query: %{from: {_, schema}}}}), do: schema
  def query_schema(query), do: query
end