Current section
Files
Jump to
Current section
Files
src/galchemy@orm@materializer.erl
-module(galchemy@orm@materializer).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src\\galchemy\\orm\\materializer.gleam").
-export([with_identity_map/2, row/3, identity_map/1, new/1, registry/1, materialize_with_hooks/3, materialize/2, materialize_many/2, materialize_many_with_hooks/3]).
-export_type([row_data/0, materializer/0, materialization_error/0, materialization_hook_error/1]).
-type row_data() :: {row_data,
galchemy@schema@relation:table_ref(),
list(galchemy@session@unit_of_work:field_value())}.
-type materializer() :: {materializer,
galchemy@orm@mapper_registry:mapper_registry(),
galchemy@orm@identity_map:identity_map()}.
-type materialization_error() :: {registry_error,
galchemy@orm@mapper_registry:registry_error()} |
{entity_error, galchemy@orm@entity:entity_error()} |
{identity_map_error, galchemy@orm@identity_map:identity_map_error()}.
-type materialization_hook_error(KHK) :: {materialization_error,
materialization_error()} |
{hook_error, KHK}.
-file("src\\galchemy\\orm\\materializer.gleam", 36).
-spec with_identity_map(
galchemy@orm@mapper_registry:mapper_registry(),
galchemy@orm@identity_map:identity_map()
) -> materializer().
with_identity_map(Registry, Identities) ->
{materializer, Registry, Identities}.
-file("src\\galchemy\\orm\\materializer.gleam", 43).
-spec row(binary(), binary(), list(galchemy@session@unit_of_work:field_value())) -> row_data().
row(Schema_name, Table_name, Fields) ->
{row_data,
galchemy@schema@relation:table_ref(Schema_name, Table_name),
Fields}.
-file("src\\galchemy\\orm\\materializer.gleam", 137).
-spec identity_map(materializer()) -> galchemy@orm@identity_map:identity_map().
identity_map(Materializer) ->
erlang:element(3, Materializer).
-file("src\\galchemy\\orm\\materializer.gleam", 32).
-spec new(galchemy@orm@mapper_registry:mapper_registry()) -> materializer().
new(Registry) ->
{materializer, Registry, galchemy@orm@identity_map:empty()}.
-file("src\\galchemy\\orm\\materializer.gleam", 141).
-spec registry(materializer()) -> galchemy@orm@mapper_registry:mapper_registry().
registry(Materializer) ->
erlang:element(2, Materializer).
-file("src\\galchemy\\orm\\materializer.gleam", 187).
-spec map_hook_error({ok, galchemy@orm@entity:entity()} | {error, KIR}) -> {ok,
galchemy@orm@entity:entity()} |
{error, materialization_hook_error(KIR)}.
map_hook_error(Value) ->
case Value of
{ok, Inner} ->
{ok, Inner};
{error, Error} ->
{error, {hook_error, Error}}
end.
-file("src\\galchemy\\orm\\materializer.gleam", 196).
-spec result_try(
{ok, KIX} | {error, KIY},
fun((KIX) -> {ok, KJB} | {error, KIY})
) -> {ok, KJB} | {error, KIY}.
result_try(Value, Next) ->
case Value of
{ok, Inner} ->
Next(Inner);
{error, Error} ->
{error, Error}
end.
-file("src\\galchemy\\orm\\materializer.gleam", 62).
-spec materialize_with_hooks(
materializer(),
row_data(),
galchemy@orm@hook:entity_hooks(KHO)
) -> {ok, {galchemy@orm@entity:entity(), materializer()}} |
{error, materialization_hook_error(KHO)}.
materialize_with_hooks(Materializer, Row_data, Hooks) ->
{row_data, Table_ref, Fields} = Row_data,
case galchemy@orm@mapper_registry:get(
erlang:element(2, Materializer),
erlang:element(2, Table_ref),
erlang:element(3, Table_ref)
) of
{error, Error} ->
{error, {materialization_error, {registry_error, Error}}};
{ok, Metadata} ->
case galchemy@orm@entity:materialize(Metadata, Fields) of
{error, Error@1} ->
{error, {materialization_error, {entity_error, Error@1}}};
{ok, Next_entity} ->
case galchemy@orm@entity:identity(Next_entity) of
{error, Error@2} ->
{error,
{materialization_error, {entity_error, Error@2}}};
{ok, Next_identity} ->
case galchemy@orm@identity_map:get(
erlang:element(3, Materializer),
erlang:element(2, Metadata),
Next_identity
) of
{some, Existing_entity} ->
{ok, {Existing_entity, Materializer}};
none ->
result_try(
begin
_pipe = galchemy@orm@hook:after_load(
Hooks,
Next_entity
),
map_hook_error(_pipe)
end,
fun(Hooked_entity) ->
case galchemy@orm@identity_map:insert(
erlang:element(3, Materializer),
Hooked_entity
) of
{error, Error@3} ->
{error,
{materialization_error,
{identity_map_error,
Error@3}}};
{ok, Next_identities} ->
{ok,
{Hooked_entity,
{materializer,
erlang:element(
2,
Materializer
),
Next_identities}}}
end
end
)
end
end
end
end.
-file("src\\galchemy\\orm\\materializer.gleam", 51).
-spec materialize(materializer(), row_data()) -> {ok,
{galchemy@orm@entity:entity(), materializer()}} |
{error, materialization_error()}.
materialize(Materializer, Row_data) ->
case materialize_with_hooks(
Materializer,
Row_data,
galchemy@orm@hook:none()
) of
{ok, Value} ->
{ok, Value};
{error, {materialization_error, Error}} ->
{error, Error};
{error, {hook_error, _}} ->
erlang:error(#{gleam_error => panic,
message => <<"unreachable hook error for hook.none()"/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"galchemy/orm/materializer"/utf8>>,
function => <<"materialize"/utf8>>,
line => 58})
end.
-file("src\\galchemy\\orm\\materializer.gleam", 145).
-spec materialize_many_loop(
materializer(),
list(row_data()),
list(galchemy@orm@entity:entity())
) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} |
{error, materialization_error()}.
materialize_many_loop(Materializer, Rows, Acc) ->
case Rows of
[] ->
{ok, {lists:reverse(Acc), Materializer}};
[Next_row | Rest] ->
result_try(
materialize(Materializer, Next_row),
fun(_use0) ->
{Next_entity, Next_materializer} = _use0,
materialize_many_loop(
Next_materializer,
Rest,
[Next_entity | Acc]
)
end
)
end.
-file("src\\galchemy\\orm\\materializer.gleam", 119).
-spec materialize_many(materializer(), list(row_data())) -> {ok,
{list(galchemy@orm@entity:entity()), materializer()}} |
{error, materialization_error()}.
materialize_many(Materializer, Rows) ->
materialize_many_loop(Materializer, Rows, []).
-file("src\\galchemy\\orm\\materializer.gleam", 163).
-spec materialize_many_with_hooks_loop(
materializer(),
list(row_data()),
galchemy@orm@hook:entity_hooks(KIK),
list(galchemy@orm@entity:entity())
) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} |
{error, materialization_hook_error(KIK)}.
materialize_many_with_hooks_loop(Materializer, Rows, Hooks, Acc) ->
case Rows of
[] ->
{ok, {lists:reverse(Acc), Materializer}};
[Next_row | Rest] ->
result_try(
materialize_with_hooks(Materializer, Next_row, Hooks),
fun(_use0) ->
{Next_entity, Next_materializer} = _use0,
materialize_many_with_hooks_loop(
Next_materializer,
Rest,
Hooks,
[Next_entity | Acc]
)
end
)
end.
-file("src\\galchemy\\orm\\materializer.gleam", 126).
-spec materialize_many_with_hooks(
materializer(),
list(row_data()),
galchemy@orm@hook:entity_hooks(KHY)
) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} |
{error, materialization_hook_error(KHY)}.
materialize_many_with_hooks(Materializer, Rows, Hooks) ->
materialize_many_with_hooks_loop(Materializer, Rows, Hooks, []).