Packages

SQL query builder core for Gleam

Current section

Files

Jump to
galchemy src galchemy@orm@identity_map.erl
Raw

src/galchemy@orm@identity_map.erl

-module(galchemy@orm@identity_map).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src\\galchemy\\orm\\identity_map.gleam").
-export([empty/0, values/1, values_for_table/2, entries/1, get/3, insert/2, remove/3, upsert/2]).
-export_type([identity_entry/0, identity_map/0, identity_map_error/0]).
-type identity_entry() :: {identity_entry,
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity(),
galchemy@orm@entity:entity()}.
-type identity_map() :: {identity_map, list(identity_entry())}.
-type identity_map_error() :: {entity_error, galchemy@orm@entity:entity_error()} |
{duplicate_identity,
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity()}.
-file("src\\galchemy\\orm\\identity_map.gleam", 24).
-spec empty() -> identity_map().
empty() ->
{identity_map, []}.
-file("src\\galchemy\\orm\\identity_map.gleam", 95).
-spec values(identity_map()) -> list(galchemy@orm@entity:entity()).
values(Map) ->
gleam@list:map(
erlang:element(2, Map),
fun(Entry) -> erlang:element(4, Entry) end
).
-file("src\\galchemy\\orm\\identity_map.gleam", 99).
-spec values_for_table(identity_map(), galchemy@schema@relation:table_ref()) -> list(galchemy@orm@entity:entity()).
values_for_table(Map, Table) ->
_pipe = erlang:element(2, Map),
_pipe@1 = gleam@list:filter(
_pipe,
fun(Entry) -> erlang:element(2, Entry) =:= Table end
),
gleam@list:map(_pipe@1, fun(Entry@1) -> erlang:element(4, Entry@1) end).
-file("src\\galchemy\\orm\\identity_map.gleam", 108).
-spec entries(identity_map()) -> list(identity_entry()).
entries(Map) ->
erlang:element(2, Map).
-file("src\\galchemy\\orm\\identity_map.gleam", 112).
-spec find_entry(
list(identity_entry()),
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity()
) -> gleam@option:option(identity_entry()).
find_entry(Entries, Table, Identity) ->
case Entries of
[] ->
none;
[Entry | Rest] ->
case (erlang:element(2, Entry) =:= Table) andalso (erlang:element(
3,
Entry
)
=:= Identity) of
true ->
{some, Entry};
false ->
find_entry(Rest, Table, Identity)
end
end.
-file("src\\galchemy\\orm\\identity_map.gleam", 76).
-spec get(
identity_map(),
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity()
) -> gleam@option:option(galchemy@orm@entity:entity()).
get(Map, Table, Identity) ->
case find_entry(erlang:element(2, Map), Table, Identity) of
{some, Entry} ->
{some, erlang:element(4, Entry)};
none ->
none
end.
-file("src\\galchemy\\orm\\identity_map.gleam", 28).
-spec insert(identity_map(), galchemy@orm@entity:entity()) -> {ok,
identity_map()} |
{error, identity_map_error()}.
insert(Map, Next_entity) ->
case galchemy@orm@entity:identity(Next_entity) of
{error, Error} ->
{error, {entity_error, Error}};
{ok, Next_identity} ->
Table_ref = erlang:element(2, erlang:element(2, Next_entity)),
case get(Map, Table_ref, Next_identity) of
{some, _} ->
{error, {duplicate_identity, Table_ref, Next_identity}};
none ->
{ok,
{identity_map,
lists:append(
erlang:element(2, Map),
[{identity_entry,
Table_ref,
Next_identity,
Next_entity}]
)}}
end
end.
-file("src\\galchemy\\orm\\identity_map.gleam", 128).
-spec remove_entry(
list(identity_entry()),
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity()
) -> list(identity_entry()).
remove_entry(Entries, Table, Identity) ->
case Entries of
[] ->
[];
[Entry | Rest] ->
case (erlang:element(2, Entry) =:= Table) andalso (erlang:element(
3,
Entry
)
=:= Identity) of
true ->
Rest;
false ->
[Entry | remove_entry(Rest, Table, Identity)]
end
end.
-file("src\\galchemy\\orm\\identity_map.gleam", 87).
-spec remove(
identity_map(),
galchemy@schema@relation:table_ref(),
galchemy@session@unit_of_work:identity()
) -> identity_map().
remove(Map, Table, Identity) ->
{identity_map, remove_entry(erlang:element(2, Map), Table, Identity)}.
-file("src\\galchemy\\orm\\identity_map.gleam", 144).
-spec upsert_entry(list(identity_entry()), identity_entry()) -> list(identity_entry()).
upsert_entry(Entries, Next_entry) ->
case Entries of
[] ->
[Next_entry];
[Entry | Rest] ->
case (erlang:element(2, Entry) =:= erlang:element(2, Next_entry))
andalso (erlang:element(3, Entry) =:= erlang:element(3, Next_entry)) of
true ->
[Next_entry | Rest];
false ->
[Entry | upsert_entry(Rest, Next_entry)]
end
end.
-file("src\\galchemy\\orm\\identity_map.gleam", 56).
-spec upsert(identity_map(), galchemy@orm@entity:entity()) -> {ok,
identity_map()} |
{error, identity_map_error()}.
upsert(Map, Next_entity) ->
case galchemy@orm@entity:identity(Next_entity) of
{error, Error} ->
{error, {entity_error, Error}};
{ok, Next_identity} ->
{ok,
{identity_map,
upsert_entry(
erlang:element(2, Map),
{identity_entry,
erlang:element(2, erlang:element(2, Next_entity)),
Next_identity,
Next_entity}
)}}
end.