From cf0fffed43d0ca7618cd0013411151e057b7a32a Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Mon, 18 May 2026 12:35:26 -0300 Subject: RNT interface Co-authored-by: Estevan Castilho --- lib/management/multigroup.ml | 64 ++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 41 deletions(-) (limited to 'lib/management/multigroup.ml') diff --git a/lib/management/multigroup.ml b/lib/management/multigroup.ml index cfde4c1..f115d97 100644 --- a/lib/management/multigroup.ml +++ b/lib/management/multigroup.ml @@ -4,19 +4,12 @@ class multigroup ~name:(init_name : Conventions.Name.t) = - let init_hash = Conventions.Hash.hash_text init_name in - object (self) + object (_self) val name : Conventions.Name.t = init_name - val hash : Conventions.Hash.t = init_hash - val previous_version : Conventions.Hash.t option = None - val tree_pointer : Conventions.Hash.t option = None val relations : Relation.relation BatMap.String.t = BatMap.String.empty val timestamp : float = Unix.gettimeofday () method name = name - method hash = hash - method previous_version = previous_version - method tree_pointer = tree_pointer method relations = relations method timestamp = timestamp @@ -24,35 +17,15 @@ class multigroup ~name:(init_name : Conventions.Name.t) = method get_relation_names = BatMap.String.fold (fun n _ acc -> n :: acc) relations [] method has_relation rel_name = BatMap.String.mem rel_name relations - (* Derive the B+ tree root hash from sorted relation hashes. *) - method private compute_tree_pointer rels = - BatMap.String.fold - (fun _n (r : Relation.relation) acc -> acc ^ r#hash) - rels "" - |> Conventions.Hash.hash_text - - method private compute_hash tp = - Conventions.Hash.hash_text (name ^ tp) - - method private advance rels = - let tp = self#compute_tree_pointer rels in - {< hash = self#compute_hash tp; - previous_version = (if hash = "" then None else Some hash); - tree_pointer = Some tp; - relations = rels; - timestamp = Unix.gettimeofday () >} - method add_relation (rel : Relation.relation) = - let rels = BatMap.String.add rel#name rel relations in - self#advance rels + {< relations = BatMap.String.add rel#name rel relations >} method remove_relation rel_name = - if not (BatMap.String.mem rel_name relations) then self - else self#advance (BatMap.String.remove rel_name relations) + {< relations = BatMap.String.remove rel_name relations >} method update_relation (rel : Relation.relation) = - if not (BatMap.String.mem rel#name relations) then self - else self#advance (BatMap.String.add rel#name rel relations) + if not (BatMap.String.mem rel#name relations) then {< >} + else {< relations = BatMap.String.add rel#name rel relations >} method serialize () : Storable.Multigroup.t = { @@ -61,23 +34,32 @@ class multigroup ~name:(init_name : Conventions.Name.t) = } end -let deserialize (_bytes : bytes) : (multigroup, string) result = +let deserialize (bytes : bytes) : (multigroup, string) result = + (* Reconstruct a multigroup from its persisted payload. + Only name, schema, and tree_pointer (Merkle root) are restored per + relation. Constraints are not yet round-tripped — see the TODO in + storable.ml for the constraint serialisation plan. *) try - let stored = Storable.Multigroup.of_bytes _bytes in + let stored = Storable.Multigroup.of_bytes bytes in let db = new multigroup ~name:stored.name in let db = List.fold_left - (fun db rel -> - let membership_criteria = - Constraint.build_membership_criteria ~_name:rel.Storable.Relation.name + (fun mg rel -> + let relation = + new Relation.stored + ~name:rel.Storable.Relation.name ~schema:rel.schema + ~constraints:None + ~cardinality:Conventions.Cardinality.AlephZero + ~lineage:None + ~provenance:None + ~membership_criteria:(fun _ -> true) in let relation = - new Relation.stored ~name:rel.name ~schema:rel.schema ~constraints:None - ~cardinality:Conventions.Cardinality.ConstrainedFinite - ~membership_criteria ~lineage:None ~provenance:None + if rel.tree_pointer = "" then relation + else relation#set_tree_pointer (Some rel.tree_pointer) in - db#add_relation relation) + mg#add_relation (relation :> Relation.relation)) db stored.relations in Ok db -- cgit v1.2.3