aboutsummaryrefslogtreecommitdiffstats
path: root/lib/prelude
diff options
context:
space:
mode:
Diffstat (limited to 'lib/prelude')
-rw-r--r--lib/prelude/catalog.ml44
-rw-r--r--lib/prelude/standard.ml12
2 files changed, 51 insertions, 5 deletions
diff --git a/lib/prelude/catalog.ml b/lib/prelude/catalog.ml
index ce36f1e..743d397 100644
--- a/lib/prelude/catalog.ml
+++ b/lib/prelude/catalog.ml
@@ -1,13 +1,13 @@
(** System catalog helpers. Pure definitions — no storage access, no
- manipulation dependency. Consumed by {!Manipulation.Make} to bootstrap and
- maintain the six catalog relations that make the database self-describing.
-*)
+ manipulation dependency. Consumed by {!Manipulation.Make} and
+ {!Catalog.Make} to bootstrap the catalog relations that make each multigroup
+ self-describing. *)
(* TODO: on_rel_name and timing_rel_name are defined and seeded but never
written to by any executor. They appear to be stubs for trigger/timing
metadata that was never implemented. *)
-let catalog_prefix = "sakura:"
+let catalog_prefix = "public:"
let relation_rel_name = catalog_prefix ^ "relation"
let domain_rel_name = catalog_prefix ^ "domain"
let attribute_rel_name = catalog_prefix ^ "attribute"
@@ -16,7 +16,10 @@ let on_rel_name = catalog_prefix ^ "on"
let timing_rel_name = catalog_prefix ^ "timing"
let branch_rel_name = catalog_prefix ^ "branch"
let head_rel_name = catalog_prefix ^ "head"
+let multigroup_rel_name = catalog_prefix ^ "multigroup"
+let schema_rel_name = catalog_prefix ^ "schema"
+(** Relations present in every multigroup's catalog. *)
let catalog_relation_names =
[
relation_rel_name;
@@ -25,9 +28,16 @@ let catalog_relation_names =
constraint_rel_name;
on_rel_name;
timing_rel_name;
+ schema_rel_name;
]
-let is_catalog_relation name = List.mem name catalog_relation_names
+(** Relations exclusive to the sakura meta-multigroup. *)
+let sakura_only_relation_names = [ multigroup_rel_name ]
+
+let all_catalog_relation_names =
+ catalog_relation_names @ sakura_only_relation_names
+
+let is_catalog_relation name = List.mem name all_catalog_relation_names
let relation_schema : Schema.t = Schema.empty |> Schema.add "name" "string"
let domain_schema : Schema.t = Schema.empty |> Schema.add "name" "string"
@@ -43,7 +53,10 @@ let constraint_schema : Schema.t =
let on_schema : Schema.t = Schema.empty |> Schema.add "event" "string"
let timing_schema : Schema.t = Schema.empty |> Schema.add "timing" "string"
+let multigroup_schema : Schema.t = Schema.empty |> Schema.add "name" "string"
+let schema_schema : Schema.t = Schema.empty |> Schema.add "name" "string"
+(** Definitions seeded into every multigroup. *)
let catalog_definitions =
[
(relation_rel_name, relation_schema);
@@ -52,8 +65,12 @@ let catalog_definitions =
(constraint_rel_name, constraint_schema);
(on_rel_name, on_schema);
(timing_rel_name, timing_schema);
+ (schema_rel_name, schema_schema);
]
+(** Extra definitions seeded only into the sakura meta-multigroup. *)
+let sakura_only_definitions = [ (multigroup_rel_name, multigroup_schema) ]
+
(* TODO: all tuple builders use Obj.magic to coerce string values into
Attribute.value (Obj.t). This is the same UB pattern fixed in standard.ml;
should use Obj.repr instead. *)
@@ -115,3 +132,20 @@ let build_timing_tuple timing : Tuple.materialized =
Tuple.AttributeMap.singleton "timing"
{ Attribute.value = Obj.magic timing };
}
+
+let build_multigroup_tuple mg_name : Tuple.materialized =
+ {
+ Tuple.relation = multigroup_rel_name;
+ attributes =
+ Tuple.AttributeMap.singleton "name"
+ { Attribute.value = Obj.magic mg_name };
+ }
+
+let build_schema_tuple schema_name : Tuple.materialized =
+ {
+ Tuple.relation = schema_rel_name;
+ attributes =
+ Tuple.AttributeMap.singleton "name"
+ { Attribute.value = Obj.magic schema_name };
+ }
+
diff --git a/lib/prelude/standard.ml b/lib/prelude/standard.ml
index 6822f19..2a507e5 100644
--- a/lib/prelude/standard.ml
+++ b/lib/prelude/standard.ml
@@ -328,3 +328,15 @@ let divide_natural : Relation.t =
~generator:(Some generator) ~membership_criteria
~provenance:(Relation.Provenance.Base "divide")
~lineage:(Relation.Lineage.Base "divide")
+
+let prelude_relations =
+ [ less_than_natural
+ ; less_than_or_equal_natural
+ ; greater_than_natural
+ ; greater_than_or_equal_natural
+ ; equal_natural
+ ; not_equal_natural
+ ; plus_natural
+ ; times_natural
+ ; minus_natural
+ ; divide_natural ]