refactor(dctx): sort table columns and indexes for deterministic output

This commit is contained in:
2026-04-26 12:50:39 +02:00
parent c0880cb076
commit 8c50ef03b1

View File

@@ -4,6 +4,7 @@ import (
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"os" "os"
"sort"
"strings" "strings"
"github.com/google/uuid" "github.com/google/uuid"
@@ -155,8 +156,15 @@ func (w *Writer) mapTableFields(table *models.Table) models.DCTXTable {
}, },
} }
columnNames := make([]string, 0, len(table.Columns))
for name := range table.Columns {
columnNames = append(columnNames, name)
}
sort.Strings(columnNames)
i := 0 i := 0
for _, column := range table.Columns { for _, colName := range columnNames {
column := table.Columns[colName]
dctxTable.Fields[i] = w.mapField(column) dctxTable.Fields[i] = w.mapField(column)
i++ i++
} }
@@ -165,12 +173,27 @@ func (w *Writer) mapTableFields(table *models.Table) models.DCTXTable {
} }
func (w *Writer) mapTableKeys(table *models.Table) []models.DCTXKey { func (w *Writer) mapTableKeys(table *models.Table) []models.DCTXKey {
keys := make([]models.DCTXKey, len(table.Indexes)) indexes := make([]*models.Index, 0, len(table.Indexes))
i := 0
for _, index := range table.Indexes { for _, index := range table.Indexes {
keys[i] = w.mapKey(index, table) indexes = append(indexes, index)
i++
} }
// Stable ordering for deterministic output and test reproducibility:
// primary keys first, then lexicographic by index name.
sort.Slice(indexes, func(i, j int) bool {
iPrimary := strings.HasSuffix(indexes[i].Name, "_pkey")
jPrimary := strings.HasSuffix(indexes[j].Name, "_pkey")
if iPrimary != jPrimary {
return iPrimary
}
return indexes[i].Name < indexes[j].Name
})
keys := make([]models.DCTXKey, len(indexes))
for i, index := range indexes {
keys[i] = w.mapKey(index, table)
}
return keys return keys
} }