aboutsummaryrefslogtreecommitdiffstats
path: root/src/operations.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/operations.erl')
-rw-r--r--src/operations.erl15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/operations.erl b/src/operations.erl
new file mode 100644
index 0000000..7846caf
--- /dev/null
+++ b/src/operations.erl
@@ -0,0 +1,15 @@
+-module(operations).
+-export([select/2, project/2, cartesian_product/2]).
+
+%% @doc Selection - filter tuples based on a predicate
+%% `Predicate` is a function that takes a tuple and returns true/false
+select(Relation, Predicate) ->
+ sets:filter(Predicate, Relation).
+
+%% @doc Projection - select specific attributes from a relation
+%% Note that `AttributeNames` can have duplicate keys, which are ignored
+project(Relation, AttributeNames) when is_list(AttributeNames) ->
+ sets:map(fun (Tuple) -> maps:with(AttributeNames, Tuple) end, Relation).
+
+cartesian_product(Relation1, Relation2) ->
+ sets:from_list([maps:merge(Tuple1, Tuple2) || Tuple1 <- sets:to_list(Relation1), Tuple2 <- sets:to_list(Relation2)], [{version, 2}]).