defmodule Ecto.Adapters.Mnesia.Query.Get do
@moduledoc """
Query builder for simple `Repo.get` like queries
"""
alias Ecto.Adapters.Mnesia.Query
alias Ecto.Adapters.Mnesia.Source
alias Ecto.Query.BooleanExpr
@behaviour Query
def query(select, _joins, [source]) do
q = fn [
%BooleanExpr{
expr: {:==, [], [{{:., [], [{:&, [], [_source_index]}, _field]}, [], []}, value]}
}
] ->
fn params ->
pk = unbind(value, params)
get_by_pk(source, pk, select)
end
end
{:cache, q}
end
defp unbind({:^, [], [index]}, params), do: Enum.at(params, index)
defp unbind(value, _params), do: value
defp get_by_pk(%Source{table: table} = source, pk, select) do
:mnesia.read(table, pk)
|> Enum.map(fn record ->
select.fields
|> Enum.map(fn
{{:., _type, [{:&, [], [_source_index]}, field]}, [], []} ->
elem(record, source.index[field])
end)
|> List.to_tuple()
end)
end
def sort(_orders_by, _select, _sources) do
fn results -> results end
end
def answers(_limit, _offset) do
fn results, _context -> results end
end
end