From 49bbaa637f5d6f2525ba23b80c4bf6d75a912515 Mon Sep 17 00:00:00 2001 From: Ivan Ryabov Date: Thu, 14 Nov 2024 20:41:43 +1100 Subject: [PATCH] use map look-up for indexes (#7242) --- schema/index.go | 14 ++++++-------- schema/index_test.go | 14 +++++++++++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/schema/index.go b/schema/index.go index f4f36751..a90153f8 100644 --- a/schema/index.go +++ b/schema/index.go @@ -76,11 +76,12 @@ func (schema *Schema) ParseIndexes() map[string]Index { func (schema *Schema) LookIndex(name string) *Index { if schema != nil { indexes := schema.ParseIndexes() - for _, index := range indexes { - if index.Name == name { - return &index - } + if index, found := indexes[name]; found { + return &index + } + + for _, index := range indexes { for _, field := range index.Fields { if field.Name == name { return &index @@ -111,10 +112,7 @@ func parseFieldIndexes(field *Field) (indexes []Index, err error) { idx = len(tag) } - if idx != -1 { - name = tag[0:idx] - } - + name = tag[0:idx] if name == "" { subName := field.Name const key = "COMPOSITE" diff --git a/schema/index_test.go b/schema/index_test.go index 2f1e36af..9971562d 100644 --- a/schema/index_test.go +++ b/schema/index_test.go @@ -21,6 +21,9 @@ type UserIndex struct { Name7 string `gorm:"index:type"` Name8 string `gorm:"index:,length:10;index:,collate:utf8"` + CompName1 string `gorm:"index:,unique,composite:idx_compname_1,option:NULLS NOT DISTINCT;not null"` + CompName2 string `gorm:"index:,composite:idx_compname_1"` + // Composite Index: Flattened structure. Data0A string `gorm:"index:,composite:comp_id0"` Data0B string `gorm:"index:,composite:comp_id0"` @@ -154,6 +157,15 @@ func TestParseIndex(t *testing.T) { Field: &schema.Field{Name: "Data2B"}, }}, }, + "idx_user_indices_idx_compname_1": { + Class: "UNIQUE", + Name: "idx_user_indices_idx_compname_1", + Option: "NULLS NOT DISTINCT", + Fields: []schema.IndexOption{ + {Field: &schema.Field{Name: "CompName1", NotNull: true}}, + {Field: &schema.Field{Name: "CompName2"}}, + }, + }, } CheckIndices(t, results, user.ParseIndexes()) @@ -253,7 +265,7 @@ func CheckIndices(t *testing.T, expected, actual map[string]schema.Index) { } for i, ef := range ei.Fields { af := ai.Fields[i] - tests.AssertObjEqual(t, af, ef, "Name", "Unique", "UniqueIndex", "Expression", "Sort", "Collate", "Length") + tests.AssertObjEqual(t, af, ef, "Name", "Unique", "UniqueIndex", "Expression", "Sort", "Collate", "Length", "NotNull") } }) delete(actual, k)