-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 ).