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