From f4b8fc5382c160f6b12f4fe5c3ac9596f3677c6b Mon Sep 17 00:00:00 2001 From: Hein Date: Sat, 28 Feb 2026 19:52:04 +0200 Subject: [PATCH] feat(writers): add sortConstraints function to sort constraints by sequence and name --- pkg/writers/bun/template_data.go | 15 +++++++++++++++ pkg/writers/bun/writer.go | 4 ++-- pkg/writers/gorm/template_data.go | 15 +++++++++++++++ pkg/writers/gorm/writer.go | 4 ++-- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/pkg/writers/bun/template_data.go b/pkg/writers/bun/template_data.go index 4789942..2f017c7 100644 --- a/pkg/writers/bun/template_data.go +++ b/pkg/writers/bun/template_data.go @@ -216,6 +216,21 @@ func resolveFieldNameCollision(fieldName string) string { return fieldName } +// sortConstraints sorts constraints by sequence, then by name +func sortConstraints(constraints map[string]*models.Constraint) []*models.Constraint { + result := make([]*models.Constraint, 0, len(constraints)) + for _, c := range constraints { + result = append(result, c) + } + sort.Slice(result, func(i, j int) bool { + if result[i].Sequence > 0 && result[j].Sequence > 0 { + return result[i].Sequence < result[j].Sequence + } + return result[i].Name < result[j].Name + }) + return result +} + // sortColumns sorts columns by sequence, then by name func sortColumns(columns map[string]*models.Column) []*models.Column { result := make([]*models.Column, 0, len(columns)) diff --git a/pkg/writers/bun/writer.go b/pkg/writers/bun/writer.go index 174ab41..f77ec41 100644 --- a/pkg/writers/bun/writer.go +++ b/pkg/writers/bun/writer.go @@ -242,7 +242,7 @@ func (w *Writer) addRelationshipFields(modelData *ModelData, table *models.Table usedFieldNames := make(map[string]int) // For each foreign key in this table, add a belongs-to/has-one relationship - for _, constraint := range table.Constraints { + for _, constraint := range sortConstraints(table.Constraints) { if constraint.Type != models.ForeignKeyConstraint { continue } @@ -275,7 +275,7 @@ func (w *Writer) addRelationshipFields(modelData *ModelData, table *models.Table continue // Skip self } - for _, constraint := range otherTable.Constraints { + for _, constraint := range sortConstraints(otherTable.Constraints) { if constraint.Type != models.ForeignKeyConstraint { continue } diff --git a/pkg/writers/gorm/template_data.go b/pkg/writers/gorm/template_data.go index f773ac4..ae4f1c4 100644 --- a/pkg/writers/gorm/template_data.go +++ b/pkg/writers/gorm/template_data.go @@ -213,6 +213,21 @@ func resolveFieldNameCollision(fieldName string) string { return fieldName } +// sortConstraints sorts constraints by sequence, then by name +func sortConstraints(constraints map[string]*models.Constraint) []*models.Constraint { + result := make([]*models.Constraint, 0, len(constraints)) + for _, c := range constraints { + result = append(result, c) + } + sort.Slice(result, func(i, j int) bool { + if result[i].Sequence > 0 && result[j].Sequence > 0 { + return result[i].Sequence < result[j].Sequence + } + return result[i].Name < result[j].Name + }) + return result +} + // sortColumns sorts columns by sequence, then by name func sortColumns(columns map[string]*models.Column) []*models.Column { result := make([]*models.Column, 0, len(columns)) diff --git a/pkg/writers/gorm/writer.go b/pkg/writers/gorm/writer.go index 47695fd..a91796c 100644 --- a/pkg/writers/gorm/writer.go +++ b/pkg/writers/gorm/writer.go @@ -236,7 +236,7 @@ func (w *Writer) addRelationshipFields(modelData *ModelData, table *models.Table usedFieldNames := make(map[string]int) // For each foreign key in this table, add a belongs-to relationship - for _, constraint := range table.Constraints { + for _, constraint := range sortConstraints(table.Constraints) { if constraint.Type != models.ForeignKeyConstraint { continue } @@ -269,7 +269,7 @@ func (w *Writer) addRelationshipFields(modelData *ModelData, table *models.Table continue // Skip self } - for _, constraint := range otherTable.Constraints { + for _, constraint := range sortConstraints(otherTable.Constraints) { if constraint.Type != models.ForeignKeyConstraint { continue }