From cdce84fd1acce4c216bc241fe5805da12c529a3c Mon Sep 17 00:00:00 2001 From: Vladimir Garvardt Date: Sun, 1 Jun 2014 02:12:31 +0400 Subject: [PATCH 1/2] AddIndex for multiple columns --- README.md | 12 +++++++++++- main.go | 4 ++-- main_test.go | 27 +++++++++++++++++++++++++++ scope_private.go | 12 +++++------- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 71dad237..cecff94d 100644 --- a/README.md +++ b/README.md @@ -923,6 +923,16 @@ for rows.Next() { db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results) ``` +## Indices + +```go +// single column index +db.Model(User{}).AddIndex("idx_user_name", "name") + +// multiple column index +db.Model(User{}).AddIndex("idx_user_name", "name", "age") +``` + ## Run Raw SQL ```go @@ -1032,7 +1042,7 @@ db.Where("email = ?", "x@example.org").Attrs(User{RegisteredIp: "111.111.111.111 share or not? transaction? * Github Pages * Includes -* AlertColumn, DropColumn, AddIndex, RemoveIndex +* AlertColumn, DropColumn # Author diff --git a/main.go b/main.go index 24f67621..1c99150d 100644 --- a/main.go +++ b/main.go @@ -314,8 +314,8 @@ func (s *DB) DropColumn(column string) *DB { return s } -func (s *DB) AddIndex(column string, indexName ...string) *DB { - s.clone().NewScope(s.Value).addIndex(column, indexName...) +func (s *DB) AddIndex(indexName string, column ...string) *DB { + s.clone().NewScope(s.Value).addIndex(indexName, column...) return s } diff --git a/main_test.go b/main_test.go index 7f7321f5..00796db9 100644 --- a/main_test.go +++ b/main_test.go @@ -83,6 +83,16 @@ type User struct { IgnoreStringSlice []string `sql:"-"` } +type UserCompany struct { + Id int64 + UserId int64 + CompanyId int64 +} + +func (t UserCompany) TableName() string { + return "user_companies" +} + type CreditCard struct { Id int8 Number string @@ -179,6 +189,7 @@ func init() { db.Exec("drop table roles") db.Exec("drop table companies") db.Exec("drop table animals") + db.Exec("drop table user_companies") if err = db.CreateTable(&Animal{}).Error; err != nil { panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) @@ -212,6 +223,10 @@ func init() { panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) } + if err = db.AutoMigrate(UserCompany{}).Error; err != nil { + panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) + } + var shortForm = "2006-01-02 15:04:05" t1, _ = time.Parse(shortForm, "2000-10-27 12:02:40") t2, _ = time.Parse(shortForm, "2002-01-01 00:00:00") @@ -2003,3 +2018,15 @@ func TestSelectWithEscapedFieldName(t *testing.T) { t.Errorf("Expected one name, but got: %d", len(names)) } } + +func TestIndices(t *testing.T) { + if err := db.Model(&UserCompany{}).AddIndex("idx_user_company_user", "user_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").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) + } +} diff --git a/scope_private.go b/scope_private.go index 2b39dddb..8bfbf437 100644 --- a/scope_private.go +++ b/scope_private.go @@ -431,15 +431,13 @@ 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(column string, names ...string) { - var indexName string - if len(names) > 0 { - indexName = names[0] - } else { - indexName = fmt.Sprintf("index_%v_on_%v", scope.TableName(), column) +func (scope *Scope) addIndex(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()), scope.Quote(column))).Exec() + scope.Raw(fmt.Sprintf("CREATE INDEX %v ON %v(%v);", indexName, scope.Quote(scope.TableName()), strings.Join(columns, ", "))).Exec() } func (scope *Scope) removeIndex(indexName string) { From d1dc0ccbef7a6c737e9f65f24d0f21e730f1b4d3 Mon Sep 17 00:00:00 2001 From: Vladimir Garvardt Date: Sun, 1 Jun 2014 02:35:56 +0400 Subject: [PATCH 2/2] 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) {