Packages

A high-performance, analytical Datalog engine for Gleam

Current section

Files

Jump to
aarondb src aarondb@rag.erl
Raw

src/aarondb@rag.erl

-module(aarondb@rag).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aarondb/rag.gleam").
-export([build_query/1]).
-export_type([semantic_intent/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type semantic_intent() :: {concept_recall, binary(), float(), integer()} |
{connected_concept, integer(), binary(), binary()} |
{evidence_graph, integer(), integer(), integer()}.
-file("src/aarondb/rag.gleam", 79).
-spec add_clause(aarondb@q:query_builder(), aarondb@shared@ast:body_clause()) -> aarondb@q:query_builder().
add_clause(Builder, Clause) ->
{query_builder,
erlang:element(2, Builder),
lists:append(erlang:element(3, Builder), [Clause]),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder)}.
-file("src/aarondb/rag.gleam", 83).
-spec set_limit(aarondb@q:query_builder(), integer()) -> aarondb@q:query_builder().
set_limit(Builder, Lim) ->
{query_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
{some, Lim},
erlang:element(6, Builder)}.
-file("src/aarondb/rag.gleam", 25).
?DOC(
" Compiles a semantic intent into a pure AaronDB Query AST.\n"
" Time Complexity: O(1) AST generation.\n"
" Space Complexity: O(1) AST size.\n"
).
-spec build_query(semantic_intent()) -> aarondb@shared@ast:'query'().
build_query(Intent) ->
Builder = case Intent of
{concept_recall, Ctx, Threshold, Lim} ->
_pipe = aarondb@q:select([<<"?engram"/utf8>>]),
_pipe@1 = add_clause(
_pipe,
{cognitive,
aarondb@q:s(Ctx),
aarondb@q:s(Ctx),
Threshold,
<<"?engram"/utf8>>}
),
set_limit(_pipe@1, Lim);
{connected_concept, From_id, Target_ctx, Edge} ->
_pipe@2 = aarondb@q:select([<<"?path"/utf8>>, <<"?engram"/utf8>>]),
_pipe@3 = add_clause(
_pipe@2,
{cognitive,
aarondb@q:s(Target_ctx),
aarondb@q:s(Target_ctx),
0.5,
<<"?engram"/utf8>>}
),
add_clause(
_pipe@3,
{shortest_path,
{uid, aarondb@fact:ref(From_id)},
aarondb@q:v(<<"?engram"/utf8>>),
Edge,
<<"?path"/utf8>>,
none,
{some, 5}}
);
{evidence_graph, A_id, B_id, Max_depth} ->
_pipe@4 = aarondb@q:select([<<"?path"/utf8>>]),
add_clause(
_pipe@4,
{shortest_path,
{uid, aarondb@fact:ref(A_id)},
{uid, aarondb@fact:ref(B_id)},
<<"engram/supports"/utf8>>,
<<"?path"/utf8>>,
none,
{some, Max_depth}}
)
end,
{'query',
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder)}.