Index mapping assembly for composition and overlays

This commit is contained in:
2026-09-29 17:03:02 +00:00
parent 27df838513
commit 8d9a3a8dfa
6 changed files with 153 additions and 14 deletions

View File

@@ -58,8 +58,14 @@ func composeDocuments(inputs ...*document.Node) (*composedDocument, []Diagnostic
collected.append(input, Path{})
}
checked := make(map[string]struct{}, len(collected.byPath))
for _, claim := range collected.ordered {
claims := collected.byPath[claim.path.String()]
pointer := claim.path.String()
if _, seen := checked[pointer]; seen {
continue
}
checked[pointer] = struct{}{}
claims := collected.byPath[pointer]
if len(claims) < 2 || allMappingClaims(claims) {
continue
}
@@ -67,8 +73,9 @@ func composeDocuments(inputs ...*document.Node) (*composedDocument, []Diagnostic
}
root := document.Clone(inputs[0])
index := new(mappingIndex)
for _, input := range inputs[1:] {
mergeDisjointMappings(root, input)
mergeDisjointMappings(root, input, index)
}
applications := make([]historyApplication, 0, len(inputs))
for _, input := range inputs {
@@ -109,18 +116,18 @@ func allMappingClaims(claims []compositionClaim) bool {
return true
}
func mergeDisjointMappings(target, incoming *document.Node) {
func mergeDisjointMappings(target, incoming *document.Node, index *mappingIndex) {
for _, incomingEntry := range incoming.Mapping {
index := documentEntryIndex(target.Mapping, incomingEntry.Key)
if index < 0 {
position := index.find(target, incomingEntry.Key)
if position < 0 {
cloned := incomingEntry
cloned.Value = document.Clone(incomingEntry.Value)
target.Mapping = append(target.Mapping, cloned)
index.append(target, cloned)
continue
}
// Claim validation guarantees that the only remaining overlap is a
// mapping pair. Empty mappings naturally contribute no child entries.
mergeDisjointMappings(target.Mapping[index].Value, incomingEntry.Value)
mergeDisjointMappings(target.Mapping[position].Value, incomingEntry.Value, index)
}
}