aboutsummaryrefslogtreecommitdiffstats
path: root/lib/management/diff.ml
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-05-11 23:10:27 -0300
committerGitHub <noreply@github.com>2026-05-11 23:10:27 -0300
commite3d3e20dfea253de291d5b31059cd55c0eaabf02 (patch)
tree82cf0d46ea3768171c8a87630cab5011d1ccf2a1 /lib/management/diff.ml
parent4fdf3392868c72ff4c33b70d165a177e97f2fece (diff)
downloadSakura-e3d3e20dfea253de291d5b31059cd55c0eaabf02.tar.gz
Sakura-e3d3e20dfea253de291d5b31059cd55c0eaabf02.zip
Multigroup unified reference for hierarchical access
Diffstat (limited to 'lib/management/diff.ml')
-rw-r--r--lib/management/diff.ml70
1 files changed, 0 insertions, 70 deletions
diff --git a/lib/management/diff.ml b/lib/management/diff.ml
deleted file mode 100644
index 8fca0af..0000000
--- a/lib/management/diff.ml
+++ /dev/null
@@ -1,70 +0,0 @@
-(** Structural delta between two Database.t states. Computes what changed from
- ancestor -> target at the relation level. *)
-
-type relation_diff =
- | RelationAdded of Relation.t
- | RelationRemoved of string
- | RelationModified of {
- name : string;
- added_tuples : Conventions.Hash.t list;
- removed_tuples : Conventions.Hash.t list;
- schema_changed : bool;
- }
-
-type t = {
- ancestor : Conventions.Hash.t;
- left : Conventions.Hash.t;
- right : Conventions.Hash.t;
- relation_diffs : relation_diff list;
-}
-
-module StringSet = Set.Make (String)
-
-let relation_keys rel =
- match rel.Relation.tree with
- | None -> StringSet.empty
- | Some tree -> StringSet.of_list (Merkle.keys tree)
-
-(** Compute relation-level diffs from ancestor → target. *)
-let diff ~ancestor ~(target : Database.t) =
- let ancestor_names =
- Database.get_relation_names ancestor |> StringSet.of_list
- in
- let target_names = Database.get_relation_names target |> StringSet.of_list in
- let all_names = StringSet.union ancestor_names target_names in
- StringSet.fold
- (fun name acc ->
- let in_ancestor = StringSet.mem name ancestor_names in
- let in_target = StringSet.mem name target_names in
- match (in_ancestor, in_target) with
- | false, true -> (
- match Database.get_relation target name with
- | Some rel -> RelationAdded rel :: acc
- | None -> acc)
- | true, false -> RelationRemoved name :: acc
- | true, true -> (
- match
- ( Database.get_relation ancestor name,
- Database.get_relation target name )
- with
- | Some anc_rel, Some tgt_rel ->
- (* Compare hashes — if identical, no diff *)
- if anc_rel.Relation.hash = tgt_rel.Relation.hash then acc
- else
- let anc_keys = relation_keys anc_rel in
- let tgt_keys = relation_keys tgt_rel in
- let added_tuples =
- StringSet.diff tgt_keys anc_keys |> StringSet.elements
- in
- let removed_tuples =
- StringSet.diff anc_keys tgt_keys |> StringSet.elements
- in
- let schema_changed =
- anc_rel.Relation.schema <> tgt_rel.Relation.schema
- in
- RelationModified
- { name; added_tuples; removed_tuples; schema_changed }
- :: acc
- | _ -> acc)
- | false, false -> acc (* impossible *))
- all_names []