Current section
Files
Jump to
Current section
Files
lib/janus/utils.ex
defmodule Janus.Utils do
@moduledoc false
@doc """
Resolves a query or a schema to a `{query, schema}` pair.
If an `%Ecto.Query{}` is passed, the schema will be resolved from its
`:from` field.
If a schema is passed, the query will be resolved using
`Ecto.Queryable.to_query/1`.
"""
def resolve_query_and_schema!(%Ecto.Query{} = query) do
{query, resolve_schema!(query)}
end
def resolve_query_and_schema!({%Ecto.Query{} = query, schema}) do
{query, resolve_schema!(schema)}
end
def resolve_query_and_schema!(schema) when is_atom(schema) do
schema = resolve_schema!(schema)
{Ecto.Queryable.to_query(schema), schema}
end
def resolve_query_and_schema!(other) do
raise ArgumentError, "could not resolve query and schema from #{inspect(other)}"
end
defp resolve_schema!(%Ecto.Query{from: from}), do: resolve_schema!(from.source)
defp resolve_schema!(%Ecto.SubQuery{query: query}), do: resolve_schema!(query)
defp resolve_schema!({_, schema}), do: resolve_schema!(schema)
defp resolve_schema!(schema) when is_atom(schema) and not is_nil(schema), do: schema
defp resolve_schema!(other) do
raise ArgumentError, "could not resolve query and schema from #{inspect(other)}"
end
end