diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-04-27 23:24:19 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-27 23:24:19 -0300 |
| commit | 97960adb8426e5270fe16b027e82a2c61674f821 (patch) | |
| tree | 03da5611898c06cd3868d4384ef4259005a29b69 /lib/drl | |
| parent | 56492ad5f6f09d8c9f337d42803b64d1b9f0668b (diff) | |
| download | Sakura-97960adb8426e5270fe16b027e82a2c61674f821.tar.gz Sakura-97960adb8426e5270fe16b027e82a2c61674f821.zip | |
Foreign call PRL (#67)
Diffstat (limited to 'lib/drl')
| -rw-r--r-- | lib/drl/executor.ml | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/lib/drl/executor.ml b/lib/drl/executor.ml index f1732eb..3ff4553 100644 --- a/lib/drl/executor.ml +++ b/lib/drl/executor.ml @@ -20,6 +20,19 @@ module Make (Storage : Management.Physical.S) = struct let wrap = Result.map_error (fun e -> AlgebraError e) let ast_value_to_abstract = Ast.value_to_abstract + let select_semijoin storage source filter = + let common = + List.filter_map + (fun (n, _) -> + if List.exists (fun (m, _) -> m = n) filter.Relation.schema + then Some n + else None) + source.Relation.schema + in + let source_attrs = List.map fst source.Relation.schema in + Result.bind (wrap (Alg.equijoin storage common source filter)) (fun joined -> + wrap (Alg.project storage source_attrs joined)) + let rec execute (storage : Storage.t) (db : Management.Database.t) (q : Ast.query) : (Relation.t, error) Result.t = let ( >>= ) = Result.bind in @@ -35,40 +48,32 @@ module Make (Storage : Management.Physical.S) = struct | Ast.Select (filter_q, source_q) -> execute storage db filter_q >>= fun filter -> execute storage db source_q >>= fun source -> - (* semijoin = project(source attrs, equijoin on common attrs) *) - let common = - List.filter_map - (fun (n, _) -> - if List.exists (fun (m, _) -> m = n) filter.Relation.schema then - Some n - else None) - source.Relation.schema - in - let source_attrs = List.map fst source.Relation.schema in - wrap (Alg.equijoin storage common source filter) >>= fun joined -> - wrap (Alg.project storage source_attrs joined) + select_semijoin storage source filter | Ast.Join (attrs, q1, q2) -> execute storage db q1 >>= fun r1 -> execute storage db q2 >>= fun r2 -> wrap (Alg.equijoin storage attrs r1 r2) | Ast.Project (attrs, q) -> - execute storage db q >>= fun rel -> wrap (Alg.project storage attrs rel) + execute storage db q >>= fun rel -> + wrap (Alg.project storage attrs rel) | Ast.Rename (renames, q) -> execute storage db q >>= fun rel -> wrap (Alg.rename storage renames rel) | Ast.Cartesian (q1, q2) -> execute storage db q1 >>= fun r1 -> execute storage db q2 >>= fun r2 -> - (* Cartesian product = join on no attrs *) wrap (Alg.equijoin storage [] r1 r2) | Ast.Union (q1, q2) -> execute storage db q1 >>= fun r1 -> - execute storage db q2 >>= fun r2 -> wrap (Alg.union storage r1 r2) + execute storage db q2 >>= fun r2 -> + wrap (Alg.union storage r1 r2) | Ast.Diff (q1, q2) -> execute storage db q1 >>= fun r1 -> - execute storage db q2 >>= fun r2 -> wrap (Alg.diff storage r1 r2) + execute storage db q2 >>= fun r2 -> + wrap (Alg.diff storage r1 r2) | Ast.Take (n, q) -> - execute storage db q >>= fun rel -> wrap (Alg.take storage n rel) + execute storage db q >>= fun rel -> + wrap (Alg.take storage n rel) end module Memory = Make (Management.Physical.Memory) |
