aboutsummaryrefslogtreecommitdiffstats
path: root/lib/drl/executor.ml
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-06-23 23:53:26 -0300
committerGitHub <noreply@github.com>2026-06-23 23:53:26 -0300
commitc284fcd570342c31bc21169960579a20a763e32e (patch)
treece7485055116d794c55090ad0978e0b3f5ff4c2a /lib/drl/executor.ml
parentb81586ee4a0543a5f9866586c78dccdd6328934a (diff)
downloadSakura-c284fcd570342c31bc21169960579a20a763e32e.tar.gz
Sakura-c284fcd570342c31bc21169960579a20a763e32e.zip
Format
Diffstat (limited to 'lib/drl/executor.ml')
-rw-r--r--lib/drl/executor.ml49
1 files changed, 24 insertions, 25 deletions
diff --git a/lib/drl/executor.ml b/lib/drl/executor.ml
index fffea19..6ff3551 100644
--- a/lib/drl/executor.ml
+++ b/lib/drl/executor.ml
@@ -3,7 +3,10 @@ module Make (NT : Nt.S) = struct
open Condition
let parse_error error = condition "parse-error" error empty
- let relation_not_found name = condition "relation-not-found" "Relation not found" ("name" |=| (of_string name))
+
+ let relation_not_found name =
+ condition "relation-not-found" "Relation not found" ("name" |=| of_string name)
+
let unsupported_operator msg = condition "unsupported-operator" msg empty
end
@@ -13,33 +16,30 @@ module Make (NT : Nt.S) = struct
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
- (ctx : Sublanguage_context.t)
- (q : Ast.query) : (Nt.plan_node, Condition.t) result =
+ let rec compile (ctx : Sublanguage_context.t) (q : Ast.query) : (Nt.plan_node, Condition.t) result
+ =
match q with
- | Ast.Base name ->
- (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.Base name -> (
+ 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 ctx q1 in
let* p2 = compile ctx q2 in
- Ok (Nt.Join { left = p1; right = p2; on_attrs })
+ Ok (Nt.Join {left= p1; right= p2; on_attrs})
| Ast.Take (n, q) ->
let* p = compile ctx q in
- Ok (Nt.Take { limit = n; source = p })
+ Ok (Nt.Take {limit= n; source= p})
| Ast.Project (attrs, q) ->
let* p = compile ctx q in
- Ok (Nt.Project { attrs; source = p })
+ 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 "Const: literal relations not yet reachable by VM; use Base")
| _ ->
- Error (Error.unsupported_operator
- "Select/Rename/Union/Diff/Cartesian require VM operators not yet implemented")
+ Error
+ (Error.unsupported_operator
+ "Select/Rename/Union/Diff/Cartesian require VM operators not yet implemented" )
let page_limit = 16
@@ -47,17 +47,16 @@ module Make (NT : Nt.S) = struct
(Sublanguage_types.result, Condition.t) result =
let* plan = compile ctx q in
let rel_name = "query_result" in
- let* stream = NT.execute_query plan ~rel_name
- in
+ let* stream = NT.execute_query plan ~rel_name in
let rec drain acc count =
- if count >= page_limit then (List.rev acc, true)
+ if count >= page_limit then List.rev acc, true
else
match NT.stream_next stream with
- | Error _ -> (List.rev acc, false)
- | Ok None -> (List.rev acc, false)
+ | Error _ -> List.rev acc, false
+ | Ok None -> List.rev acc, false
| Ok (Some t) -> drain (t :: acc) (count + 1)
in
- let (rows, has_more) = drain [] 0 in
+ let rows, has_more = drain [] 0 in
ignore (NT.stream_close stream);
- Ok (Sublanguage_types.Cursor { cursor_id = "0"; rows; has_more })
+ Ok (Sublanguage_types.Cursor {cursor_id= "0"; rows; has_more})
end