diff options
Diffstat (limited to 'lib/drl/executor.ml')
| -rw-r--r-- | lib/drl/executor.ml | 49 |
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 |
