Packages

A high-performance, analytical Datalog engine for Gleam

Current section

Files

Jump to
aarondb src aarondb@engine@virtual.erl
Raw

src/aarondb@engine@virtual.erl

-module(aarondb@engine@virtual).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aarondb/engine/virtual.gleam").
-export([solve/5]).
-file("src/aarondb/engine/virtual.gleam", 35).
-spec bind_outputs(
gleam@dict:dict(binary(), aarondb@fact:value()),
list(binary()),
list(aarondb@fact:value())
) -> {ok, gleam@dict:dict(binary(), aarondb@fact:value())} | {error, nil}.
bind_outputs(Ctx, Outputs, Row) ->
case erlang:length(Outputs) =:= erlang:length(Row) of
true ->
_pipe = gleam@list:zip(Outputs, Row),
gleam@list:try_fold(
_pipe,
Ctx,
fun(Acc, Pair) ->
{Var, Val} = Pair,
case gleam_stdlib:map_get(Acc, Var) of
{ok, Existing} ->
case Existing =:= Val of
true ->
{ok, Acc};
false ->
{error, nil}
end;
{error, _} ->
{ok, gleam@dict:insert(Acc, Var, Val)}
end
end
);
false ->
{error, nil}
end.
-file("src/aarondb/engine/virtual.gleam", 59).
-spec resolve_part(
aarondb@shared@ast:part(),
gleam@dict:dict(binary(), aarondb@fact:value())
) -> gleam@option:option(aarondb@fact:value()).
resolve_part(Part, Ctx) ->
case Part of
{var, Name} ->
gleam@option:from_result(gleam_stdlib:map_get(Ctx, Name));
{val, Val} ->
{some, Val};
{uid, Uid} ->
{some, {ref, Uid}};
{attr_val, S} ->
{some, {str, S}};
{lookup, {_, Val@1}} ->
{some, Val@1}
end.
-file("src/aarondb/engine/virtual.gleam", 8).
-spec solve(
aarondb@shared@state:db_state(),
binary(),
list(aarondb@shared@ast:part()),
list(binary()),
gleam@dict:dict(binary(), aarondb@fact:value())
) -> list(gleam@dict:dict(binary(), aarondb@fact:value())).
solve(Db_state, Predicate, Args, Outputs, Ctx) ->
Resolved_args = gleam@list:try_map(
Args,
fun(Arg) -> _pipe = resolve_part(Arg, Ctx),
gleam@option:to_result(_pipe, nil) end
),
case Resolved_args of
{ok, Vals} ->
case gleam_stdlib:map_get(erlang:element(23, Db_state), Predicate) of
{ok, Adapter} ->
_pipe@1 = Adapter(Vals),
gleam@list:filter_map(
_pipe@1,
fun(Row) -> bind_outputs(Ctx, Outputs, Row) end
);
{error, _} ->
[]
end;
{error, _} ->
[]
end.