Current section
Files
Jump to
Current section
Files
src/aarondb@shared@store.erl
-module(aarondb@shared@store).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aarondb/shared/store.gleam").
-export([find_datoms/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/aarondb/shared/store.gleam", 9).
?DOC(
" Retrieves datoms matching a pattern from the database indices.\n"
" Rich Hickey alignment: \"The index is an implementation detail of the fact store.\"\n"
).
-spec find_datoms(
aarondb@shared@state:db_state(),
{aarondb@shared@ast:part(), binary(), aarondb@shared@ast:part()}
) -> list(aarondb@fact:datom()).
find_datoms(Db_state, Pattern) ->
case aarondb@storage:query_datoms(erlang:element(2, Db_state), Pattern) of
{ok, Datoms} when Datoms =/= [] ->
Datoms;
_ ->
{E, A, V} = Pattern,
case {E, A, V} of
{{uid, Eid}, Attr, {val, Val}} ->
aarondb@index:get_datoms_by_entity_attr_val(
erlang:element(3, Db_state),
Eid,
Attr,
Val
);
{{lookup, _}, _, {val, _}} ->
[];
{{uid, Eid@1}, Attr@1, {var, _}} ->
aarondb@index:get_datoms_by_entity_attr(
erlang:element(3, Db_state),
Eid@1,
Attr@1
);
{{var, _}, Attr@2, {val, Val@1}} ->
aarondb@index:get_datoms_by_val(
erlang:element(4, Db_state),
Attr@2,
Val@1
);
{{var, _}, Attr@3, {var, _}} ->
aarondb@index:filter_by_attribute(
erlang:element(4, Db_state),
Attr@3
);
{{uid, Eid@2}, _, _} ->
aarondb@index:filter_by_entity(
erlang:element(3, Db_state),
Eid@2
);
{{var, _}, _, _} ->
aarondb@index:get_all_datoms(erlang:element(3, Db_state));
{_, _, _} ->
[]
end
end.