Preserve matched record metadata after resolution
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user