aboutsummaryrefslogtreecommitdiffstats
path: root/lib/drl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/drl')
-rw-r--r--lib/drl/executor.ml28
1 files changed, 18 insertions, 10 deletions
diff --git a/lib/drl/executor.ml b/lib/drl/executor.ml
index 5f820c8..fffea19 100644
--- a/lib/drl/executor.ml
+++ b/lib/drl/executor.ml
@@ -10,34 +10,42 @@ module Make (NT : Nt.S) = struct
let ( let* ) = Result.bind
(* Compile a DRL AST query to a Tarski VM plan node tree.
- Every base relation reference must be fully qualified ([<mg>:<rel>]);
- [resolve] maps an FQN to its absolute RNT path. *)
+ A qualified base reference ([<mg>:<rel>]) resolves through [ctx.resolve]
+ to its stored-relation path; an unqualified name resolves to the
+ session-scoped ephemeral binding created by DML [Define]. *)
let rec compile
- (resolve : ?branch:string -> Qualified_name.t -> string)
+ (ctx : Sublanguage_context.t)
(q : Ast.query) : (Nt.plan_node, Condition.t) result =
match q with
| Ast.Base name ->
- let* fqn = Qualified_name.try_parse name in
- Ok (Nt.Scan { path = resolve fqn; args = [] })
+ (match Qualified_name.try_parse name with
+ | Error _ ->
+ Ok (Nt.Scan
+ { path = Sublanguage_context.ephemeral_path ctx name;
+ args = [] })
+ | Ok fqn -> Ok (Nt.Scan { path = ctx.resolve fqn; args = [] }))
| Ast.Join (on_attrs, q1, q2) ->
- let* p1 = compile resolve q1 in
- let* p2 = compile resolve q2 in
+ let* p1 = compile ctx q1 in
+ let* p2 = compile ctx q2 in
Ok (Nt.Join { left = p1; right = p2; on_attrs })
| Ast.Take (n, q) ->
- let* p = compile resolve q in
+ let* p = compile ctx q in
Ok (Nt.Take { limit = n; source = p })
+ | Ast.Project (attrs, q) ->
+ let* p = compile ctx q in
+ Ok (Nt.Project { attrs; source = p })
| Ast.Const _ ->
Error (Error.unsupported_operator
"Const: literal relations not yet reachable by VM; use Base")
| _ ->
Error (Error.unsupported_operator
- "Select/Project/Rename/Union/Diff/Cartesian require VM operators not yet implemented")
+ "Select/Rename/Union/Diff/Cartesian require VM operators not yet implemented")
let page_limit = 16
let execute (ctx : Sublanguage_context.t) (q : Ast.query) :
(Sublanguage_types.result, Condition.t) result =
- let* plan = compile ctx.resolve q in
+ let* plan = compile ctx q in
let rel_name = "query_result" in
let* stream = NT.execute_query plan ~rel_name
in