Consolidate duplicate item registry records

This commit is contained in:
2026-08-06 13:28:12 +00:00
parent f1b120b590
commit 2ee6b495e1
3 changed files with 355 additions and 802 deletions

View File

@@ -212,13 +212,16 @@ func preprocessRecords(input dnd.ItemRegistry, order shared.SourceRefOrder) ([]n
warnings = append(warnings, contracts.Warning{Scope: itemScope(index), ReasonCode: ReasonCodeItemIDRecomputed, Message: fmt.Sprintf("input index %d: item ID recomputed from %s", index, diagnostics.Quote(item.Name))})
}
}
groups := exactDuplicateGroups(records)
groups := comparisonNameGroups(records)
output := make([]normalizedRecord, 0, len(groups))
for _, members := range groups {
retained := cloneRecord(records[members[0]])
for _, member := range members[1:] {
retained.item.SourceRefs = append(retained.item.SourceRefs, records[member].item.SourceRefs...)
retained.inputIndexes = append(retained.inputIndexes, records[member].inputIndexes...)
}
retained.item.SourceRefs = order.Canonicalize(retained.item.SourceRefs)
retained.item.ID = identity.DeriveID(retained.item.Name)
retained.inputIndexes = sortedUniqueIndexes(retained.inputIndexes)
output = append(output, retained)
if len(members) > 1 {
@@ -236,14 +239,14 @@ func normalizeRecord(input dnd.Item, order shared.SourceRefOrder) (dnd.Item, boo
return output, input.Name != output.Name, !reflect.DeepEqual(input.SourceRefs, output.SourceRefs)
}
func exactDuplicateGroups(records []normalizedRecord) [][]int {
func comparisonNameGroups(records []normalizedRecord) [][]int {
groups := make([][]int, 0, len(records))
for index, record := range records {
key := identity.ComparisonKey(record.item.Name)
found := false
for groupIndex, members := range groups {
first := records[members[0]]
if identity.ComparisonKey(first.item.Name) == key && reflect.DeepEqual(first.item.SourceRefs, record.item.SourceRefs) {
if identity.ComparisonKey(first.item.Name) == key {
groups[groupIndex] = append(groups[groupIndex], index)
found = true
break