Current section
Files
Jump to
Current section
Files
src/aarondb@engine@rules.erl
-module(aarondb@engine@rules).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aarondb/engine/rules.gleam").
-export([derive_all_facts/6]).
-file("src/aarondb/engine/rules.gleam", 155).
-spec insert_if_new(
gleam@set:set(aarondb@fact:datom()),
gleam@set:set(aarondb@fact:datom()),
binary(),
integer(),
aarondb@fact:value()
) -> gleam@set:set(aarondb@fact:datom()).
insert_if_new(All_derived, Acc, Attribute, Eid_val, Val) ->
D = {datom, {entity_id, Eid_val}, Attribute, Val, 0, 0, 0, assert},
case gleam@set:contains(All_derived, D) of
true ->
Acc;
false ->
gleam@set:insert(Acc, D)
end.
-file("src/aarondb/engine/rules.gleam", 178).
-spec merge_stores(
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk()))),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))
) -> gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk()))).
merge_stores(S1, S2) ->
case {S1, S2} of
{{some, M1}, {some, M2}} ->
{some, maps:merge(M1, M2)};
{{some, _}, none} ->
S1;
{none, {some, _}} ->
S2;
{none, none} ->
none
end.
-file("src/aarondb/engine/rules.gleam", 126).
-spec solve_rule_body_semi_naive(
aarondb@shared@state:db_state(),
list(aarondb@shared@ast:body_clause()),
gleam@set:set(aarondb@fact:datom()),
gleam@option:option(integer()),
gleam@option:option(integer()),
fun((aarondb@shared@state:db_state(), aarondb@shared@ast:body_clause(), gleam@dict:dict(binary(), aarondb@fact:value()), gleam@set:set(aarondb@fact:datom()), gleam@option:option(integer()), gleam@option:option(integer())) -> {list(gleam@dict:dict(binary(), aarondb@fact:value())),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))})
) -> {list(gleam@dict:dict(binary(), aarondb@fact:value())),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))}.
solve_rule_body_semi_naive(
Db_state,
Body,
All_derived,
As_of_tx,
As_of_valid,
Solve_clause_with_derived
) ->
gleam@list:fold(
Body,
{[maps:new()], none},
fun(Acc, Clause_i) ->
{Ctxs, Current_store} = Acc,
gleam@list:fold(
Ctxs,
{[], Current_store},
fun(Inner_acc, Ctx) ->
{Acc_ctxs, Acc_store} = Inner_acc,
{New_ctxs, Clause_store} = Solve_clause_with_derived(
Db_state,
Clause_i,
Ctx,
All_derived,
As_of_tx,
As_of_valid
),
{lists:append(Acc_ctxs, New_ctxs),
merge_stores(Acc_store, Clause_store)}
end
)
end
).
-file("src/aarondb/engine/rules.gleam", 68).
-spec do_derive_recursive(
aarondb@shared@state:db_state(),
list(aarondb@shared@ast:rule()),
gleam@option:option(integer()),
gleam@option:option(integer()),
gleam@set:set(aarondb@fact:datom()),
gleam@set:set(aarondb@fact:datom()),
boolean(),
fun((aarondb@shared@state:db_state(), aarondb@shared@ast:body_clause(), gleam@dict:dict(binary(), aarondb@fact:value()), gleam@set:set(aarondb@fact:datom()), gleam@option:option(integer()), gleam@option:option(integer())) -> {list(gleam@dict:dict(binary(), aarondb@fact:value())),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))}),
fun((aarondb@shared@ast:part(), gleam@dict:dict(binary(), aarondb@fact:value())) -> gleam@option:option(aarondb@fact:value()))
) -> gleam@set:set(aarondb@fact:datom()).
do_derive_recursive(
Db_state,
Rules,
As_of_tx,
As_of_valid,
All_derived,
Last_new_derived,
First_run,
Solve_clause_with_derived,
Resolve_part_optional
) ->
case not First_run andalso (gleam@set:size(Last_new_derived) =:= 0) of
true ->
All_derived;
false ->
Next_new = gleam@list:fold(
Rules,
gleam@set:new(),
fun(Acc, R) ->
{Results, _} = solve_rule_body_semi_naive(
Db_state,
erlang:element(3, R),
All_derived,
As_of_tx,
As_of_valid,
Solve_clause_with_derived
),
gleam@list:fold(
Results,
Acc,
fun(Inner_acc, Ctx) ->
E = Resolve_part_optional(
erlang:element(1, erlang:element(2, R)),
Ctx
),
V = Resolve_part_optional(
erlang:element(3, erlang:element(2, R)),
Ctx
),
case {E, V} of
{{some, {ref, {entity_id, Eid_val}}},
{some, Val}} ->
insert_if_new(
All_derived,
Inner_acc,
erlang:element(2, erlang:element(2, R)),
Eid_val,
Val
);
{{some, {int, Eid_val@1}}, {some, Val@1}} ->
insert_if_new(
All_derived,
Inner_acc,
erlang:element(2, erlang:element(2, R)),
Eid_val@1,
Val@1
);
{_, _} ->
Inner_acc
end
end
)
end
),
case gleam@set:size(Next_new) =:= 0 of
true ->
All_derived;
false ->
do_derive_recursive(
Db_state,
Rules,
As_of_tx,
As_of_valid,
gleam@set:union(All_derived, Next_new),
Next_new,
false,
Solve_clause_with_derived,
Resolve_part_optional
)
end
end.
-file("src/aarondb/engine/rules.gleam", 46).
-spec do_derive(
aarondb@shared@state:db_state(),
list(aarondb@shared@ast:rule()),
gleam@option:option(integer()),
gleam@option:option(integer()),
gleam@set:set(aarondb@fact:datom()),
fun((aarondb@shared@state:db_state(), aarondb@shared@ast:body_clause(), gleam@dict:dict(binary(), aarondb@fact:value()), gleam@set:set(aarondb@fact:datom()), gleam@option:option(integer()), gleam@option:option(integer())) -> {list(gleam@dict:dict(binary(), aarondb@fact:value())),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))}),
fun((aarondb@shared@ast:part(), gleam@dict:dict(binary(), aarondb@fact:value())) -> gleam@option:option(aarondb@fact:value()))
) -> gleam@set:set(aarondb@fact:datom()).
do_derive(
Db_state,
Rules,
As_of_tx,
As_of_valid,
Derived,
Solve_clause_with_derived,
Resolve_part_optional
) ->
do_derive_recursive(
Db_state,
Rules,
As_of_tx,
As_of_valid,
Derived,
Derived,
true,
Solve_clause_with_derived,
Resolve_part_optional
).
-file("src/aarondb/engine/rules.gleam", 27).
-spec derive_all_facts(
aarondb@shared@state:db_state(),
list(aarondb@shared@ast:rule()),
gleam@option:option(integer()),
gleam@option:option(integer()),
fun((aarondb@shared@state:db_state(), aarondb@shared@ast:body_clause(), gleam@dict:dict(binary(), aarondb@fact:value()), gleam@set:set(aarondb@fact:datom()), gleam@option:option(integer()), gleam@option:option(integer())) -> {list(gleam@dict:dict(binary(), aarondb@fact:value())),
gleam@option:option(gleam@dict:dict(binary(), list(aarondb@storage@internal:storage_chunk())))}),
fun((aarondb@shared@ast:part(), gleam@dict:dict(binary(), aarondb@fact:value())) -> gleam@option:option(aarondb@fact:value()))
) -> gleam@set:set(aarondb@fact:datom()).
derive_all_facts(
Db_state,
Rules,
As_of_tx,
As_of_valid,
Solve_clause_with_derived,
Resolve_part_optional
) ->
do_derive(
Db_state,
Rules,
As_of_tx,
As_of_valid,
gleam@set:new(),
Solve_clause_with_derived,
Resolve_part_optional
).