aboutsummaryrefslogtreecommitdiffstats
path: root/lib/drl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/drl')
-rw-r--r--lib/drl/executor.ml39
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)