Current section
Files
Jump to
Current section
Files
src/galchemy@session@execution.erl
-module(galchemy@session@execution).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src\\galchemy\\session\\execution.gleam").
-export([queries/1, execute/2]).
-export_type([executed_query/1, flush_execution/1, execution_error/1]).
-type executed_query(KNF) :: {executed_query, galchemy@ast@query:'query'(), KNF}.
-type flush_execution(KNG) :: {flush_execution,
list(executed_query(KNG)),
list(executed_query(KNG)),
list(executed_query(KNG))}.
-type execution_error(KNH) :: {session_error,
galchemy@session@unit_of_work:session_error()} |
{query_error, KNH}.
-file("src\\galchemy\\session\\execution.gleam", 43).
-spec queries(flush_execution(KNQ)) -> list(executed_query(KNQ)).
queries(Execution) ->
_pipe = erlang:element(2, Execution),
_pipe@1 = lists:append(_pipe, erlang:element(3, Execution)),
lists:append(_pipe@1, erlang:element(4, Execution)).
-file("src\\galchemy\\session\\execution.gleam", 70).
-spec cleared_session(galchemy@session@unit_of_work:session()) -> galchemy@session@unit_of_work:session().
cleared_session(Session) ->
{session, Snapshot, _, _, _} = Session,
galchemy@session@unit_of_work:new(Snapshot).
-file("src\\galchemy\\session\\execution.gleam", 75).
-spec map_error({ok, KOG} | {error, KOH}, fun((KOH) -> KOK)) -> {ok, KOG} |
{error, KOK}.
map_error(Value, Mapper) ->
case Value of
{ok, Inner} ->
{ok, Inner};
{error, Error} ->
{error, Mapper(Error)}
end.
-file("src\\galchemy\\session\\execution.gleam", 82).
-spec result_try(
{ok, KON} | {error, KOO},
fun((KON) -> {ok, KOR} | {error, KOO})
) -> {ok, KOR} | {error, KOO}.
result_try(Value, Next) ->
case Value of
{ok, Inner} ->
Next(Inner);
{error, Error} ->
{error, Error}
end.
-file("src\\galchemy\\session\\execution.gleam", 49).
-spec execute_queries(
list(galchemy@ast@query:'query'()),
fun((galchemy@ast@query:'query'()) -> {ok, KNV} | {error, KNW}),
list(executed_query(KNV))
) -> {ok, list(executed_query(KNV))} | {error, execution_error(KNW)}.
execute_queries(Queries, Executor, Acc) ->
case Queries of
[] ->
{ok, lists:reverse(Acc)};
[Next_query | Rest] ->
result_try(
begin
_pipe = Executor(Next_query),
map_error(_pipe, fun(Field@0) -> {query_error, Field@0} end)
end,
fun(Next_result) ->
execute_queries(
Rest,
Executor,
[{executed_query, Next_query, Next_result} | Acc]
)
end
)
end.
-file("src\\galchemy\\session\\execution.gleam", 22).
-spec execute(
galchemy@session@unit_of_work:session(),
fun((galchemy@ast@query:'query'()) -> {ok, KNI} | {error, KNJ})
) -> {ok, {flush_execution(KNI), galchemy@session@unit_of_work:session()}} |
{error, execution_error(KNJ)}.
execute(Session, Executor) ->
result_try(
begin
_pipe = galchemy@session@unit_of_work:flush_plan(Session),
map_error(_pipe, fun(Field@0) -> {session_error, Field@0} end)
end,
fun(Plan) ->
result_try(
execute_queries(erlang:element(2, Plan), Executor, []),
fun(Inserts) ->
result_try(
execute_queries(erlang:element(3, Plan), Executor, []),
fun(Updates) ->
result_try(
execute_queries(
erlang:element(4, Plan),
Executor,
[]
),
fun(Deletes) ->
{ok,
{{flush_execution,
Inserts,
Updates,
Deletes},
cleared_session(Session)}}
end
)
end
)
end
)
end
).