aboutsummaryrefslogblamecommitdiffstats
path: root/lib/dml/executor.ml
blob: fdc3c9f428379136205ebbcfe7c52254d477e8ec (plain) (tree)























                                                                                                
open Utilities.Result

let value_of = function Ast.Str s -> Value.String s | Ast.Int n -> Value.Integer n
let map_of bindings = List.to_seq bindings |> Utilities.StringMap.of_seq

let execute (ctx : Sublanguage_context.t) statement =
  let* {RNT.branch; _} = ctx.session#state in
  let relation = Drl.Executor.relation_path ("\\branch\\" ^ branch) in
  let* message =
    match statement with
    | Ast.Define {target; heading; tuples} ->
        let* path = relation target in
        let tuples =
          List.map (fun row -> List.map (fun (a, v) -> a, value_of v) row |> map_of) tuples
        in
        let* () = RNT.create ctx.kernel path (RNT.Relation {heading= map_of heading; tuples}) in
        Ok ("Defined " ^ target)
    | Ast.Drop {target} ->
        let* path = relation target in
        let* () = RNT.remove ctx.kernel path in
        Ok ("Dropped " ^ target)
  in
  let* () = ctx.session#set_branch_to branch in
  Ok (Sublanguage_types.Transition message)