From 56492ad5f6f09d8c9f337d42803b64d1b9f0668b Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Mon, 27 Apr 2026 13:00:30 -0300 Subject: Introduce Multigroups (#65) --- lib/prelude/catalog.ml | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'lib/prelude/catalog.ml') 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 }; + } + -- cgit v1.2.3