Preserve matched record metadata after resolution

This commit is contained in:
2026-11-02 14:47:52 +00:00
parent c61597d137
commit 4549fbaeef
4 changed files with 92 additions and 3 deletions

View File

@@ -141,6 +141,15 @@ func cloneMetadata(metadata Metadata) Metadata {
func applyResolutionMetadata(metadata *Metadata, resolved resolutionResult, entry resolutionInput) {
finalPaths := make(map[string]*document.Node)
indexDocument(resolved.final, Path{}, finalPaths)
fields := make(map[string]FieldInfo, len(finalPaths))
walkDocument(resolved.final, Path{}, func(path Path, _ *document.Node) {
if prior, matched := resolved.correspondence.entryPath(path); matched {
if info, found := entry.lookup(prior); found {
fields[path.String()] = cloneFieldInfo(info)
}
}
})
metadata.fields = fields
snapshotCoverage, snapshotPointers := newResolutionCoverageIndexFromSnapshots(resolved.snapshots)
var deltaCoverage pathPrefixIndex
snapshotIDs := make([]int, len(resolved.deltas))
@@ -163,7 +172,7 @@ func applyResolutionMetadata(metadata *Metadata, resolved resolutionResult, entr
}
applyResolutionFieldOrigins(metadata.fields, resolved.snapshots, &deltaCoverage, snapshotIDs)
refreshResolutionFields(metadata.fields, finalPaths, resolved.final, entry, resolved.snapshots, snapshotCoverage)
refreshResolutionFields(metadata.fields, finalPaths, resolved.final, entry, resolved.snapshots, snapshotCoverage, resolved.correspondence)
}
func applyResolutionFieldOrigins(fields map[string]FieldInfo, snapshots []resolutionSnapshot, deltaIndex *pathPrefixIndex, snapshotIDs []int) {
@@ -192,7 +201,7 @@ func applyResolutionFieldOrigins(fields map[string]FieldInfo, snapshots []resolu
}
}
func refreshResolutionFields(fields map[string]FieldInfo, finalPaths map[string]*document.Node, final *document.Node, entry resolutionInput, snapshots []resolutionSnapshot, snapshotCoverage *resolutionCoverageIndex) {
func refreshResolutionFields(fields map[string]FieldInfo, finalPaths map[string]*document.Node, final *document.Node, entry resolutionInput, snapshots []resolutionSnapshot, snapshotCoverage *resolutionCoverageIndex, correspondence resolutionCorrespondence) {
for pointer := range fields {
if _, ok := finalPaths[pointer]; !ok {
delete(fields, pointer)
@@ -200,7 +209,9 @@ func refreshResolutionFields(fields map[string]FieldInfo, finalPaths map[string]
}
walkDocument(final, Path{}, func(path Path, node *document.Node) {
pointer := path.String()
entryInfo, entryFound := entry.lookup(path)
prior, matched := correspondence.entryPath(path)
entryInfo, entryFound := entry.lookup(prior)
entryFound = entryFound && matched
if info, ok := fields[pointer]; ok {
info.Explicit = entryFound && entryInfo.Explicit
info.Null = node.Kind == document.Null