From d1dc0ccbef7a6c737e9f65f24d0f21e730f1b4d3 Mon Sep 17 00:00:00 2001 From: Vladimir Garvardt Date: Sun, 1 Jun 2014 02:35:56 +0400 Subject: [PATCH] AddUniqueIndex --- README.md | 8 +++++++- main.go | 7 ++++++- main_test.go | 8 ++++++++ scope_private.go | 9 +++++++-- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cecff94d..b729f92b 100644 --- a/README.md +++ b/README.md @@ -930,7 +930,13 @@ db.Table("users").Select("users.name, emails.email").Joins("left join emails on db.Model(User{}).AddIndex("idx_user_name", "name") // multiple column index -db.Model(User{}).AddIndex("idx_user_name", "name", "age") +db.Model(User{}).AddIndex("idx_user_name_age", "name", "age") + +// single column unique index +db.Model(User{}).AddUniqueIndex("idx_user_name", "name") + +// multiple column unique index +db.Model(User{}).AddUniqueIndex("idx_user_name_age", "name", "age") ``` ## Run Raw SQL diff --git a/main.go b/main.go index 1c99150d..d655855c 100644 --- a/main.go +++ b/main.go @@ -315,7 +315,12 @@ func (s *DB) DropColumn(column string) *DB { } func (s *DB) AddIndex(indexName string, column ...string) *DB { - s.clone().NewScope(s.Value).addIndex(indexName, column...) + s.clone().NewScope(s.Value).addIndex(false, indexName, column...) + return s +} + +func (s *DB) AddUniqueIndex(indexName string, column ...string) *DB { + s.clone().NewScope(s.Value).addIndex(true, indexName, column...) return s } diff --git a/main_test.go b/main_test.go index 00796db9..78e79f23 100644 --- a/main_test.go +++ b/main_test.go @@ -2026,7 +2026,15 @@ func TestIndices(t *testing.T) { if err := db.Model(&UserCompany{}).RemoveIndex("idx_user_company_user").Error; err != nil { t.Errorf("Got error when tried to remove index: %+v", err) } + if err := db.Model(&UserCompany{}).AddIndex("idx_user_company_user_company", "user_id", "company_id").Error; err != nil { t.Errorf("Got error when tried to create index: %+v", err) } + if err := db.Model(&UserCompany{}).RemoveIndex("idx_user_company_user_company").Error; err != nil { + t.Errorf("Got error when tried to remove index: %+v", err) + } + + if err := db.Model(&UserCompany{}).AddUniqueIndex("idx_user_company_user_company", "user_id", "company_id").Error; err != nil { + t.Errorf("Got error when tried to create index: %+v", err) + } } diff --git a/scope_private.go b/scope_private.go index 8bfbf437..49c43d43 100644 --- a/scope_private.go +++ b/scope_private.go @@ -431,13 +431,18 @@ func (scope *Scope) dropColumn(column string) { scope.Raw(fmt.Sprintf("ALTER TABLE %v DROP COLUMN %v", scope.Quote(scope.TableName()), scope.Quote(column))).Exec() } -func (scope *Scope) addIndex(indexName string, column ...string) { +func (scope *Scope) addIndex(unique bool, indexName string, column ...string) { var columns []string for _, name := range column { columns = append(columns, scope.Quote(name)) } - scope.Raw(fmt.Sprintf("CREATE INDEX %v ON %v(%v);", indexName, scope.Quote(scope.TableName()), strings.Join(columns, ", "))).Exec() + sqlCreate := "CREATE INDEX" + if unique { + sqlCreate = "CREATE UNIQUE INDEX" + } + + scope.Raw(fmt.Sprintf("%s %v ON %v(%v);", sqlCreate, indexName, scope.Quote(scope.TableName()), strings.Join(columns, ", "))).Exec() } func (scope *Scope) removeIndex(indexName string) {