Current section

Files

Jump to
sorcery lib services store_adapter ecto query query.ex
Raw

lib/services/store_adapter/ecto/query/query.ex

defmodule Sorcery.StoreAdapter.Ecto.Query do
@moduledoc false
alias Sorcery.ReturnedEntities, as: RE
alias Ecto.Multi, as: M
alias Sorcery.StoreAdapter.Ecto.Query.BuildMulti
import Sorcery.Helpers.Maps
def run_query(inner_state, wheres, finds) do
repo = inner_state.args.repo_module
config = inner_state.config_module.config()
tk_map = config.schemas
ctx = %{
repo: repo,
config: config,
tk_map: tk_map,
finds: finds,
wheres: wheres,
multi: M.new()
}
ctx = BuildMulti.build_multi(ctx)
case repo.transaction(ctx.multi) do
{:ok, results} -> {:ok, transaction_to_re(results, ctx.wheres)}
err -> {:error, err}
end
end
# {{{ transaction_to_re
defp transaction_to_re(transaction, wheres) do
Enum.reduce(transaction, RE.new(), fn {lvark, li}, re ->
RE.put_entities(re, "#{lvark}", li)
end)
|> add_lvar_tks(wheres)
end
defp add_lvar_tks(re, wheres) do
Enum.reduce(wheres, re, fn %{tk: tk, lvar: lvar}, re ->
put_in_p(re, [:lvar_tks, "#{lvar}"], tk)
end)
end
# }}}
end