From 5e3449db63c8e2153f331286d7f0c58abc342b46 Mon Sep 17 00:00:00 2001 From: aniket Date: Thu, 2 Oct 2025 15:48:59 +0530 Subject: [PATCH] chore: added normal index in sql schema --- pkg/sqlschema/index.go | 75 +++++++++++++++++++++++++++++++++++++ pkg/sqlschema/index_test.go | 25 +++++++++++++ 2 files changed, 100 insertions(+) diff --git a/pkg/sqlschema/index.go b/pkg/sqlschema/index.go index 1988b1fd5e21..458c9dbaddfe 100644 --- a/pkg/sqlschema/index.go +++ b/pkg/sqlschema/index.go @@ -114,3 +114,78 @@ func (index *UniqueIndex) ToDropSQL(fmter SQLFormatter) []byte { return sql } + +type NormalIndex struct { + TableName TableName + ColumnNames []ColumnName + name string +} + +func (index *NormalIndex) Name() string { + if index.name != "" { + return index.name + } + + var b strings.Builder + b.WriteString(IndexTypeIndex.String()) + b.WriteString("_") + b.WriteString(string(index.TableName)) + b.WriteString("_") + for i, column := range index.ColumnNames { + if i > 0 { + b.WriteString("_") + } + b.WriteString(string(column)) + } + return b.String() +} + +func (index *NormalIndex) Named(name string) Index { + copyOfColumnNames := make([]ColumnName, len(index.ColumnNames)) + copy(copyOfColumnNames, index.ColumnNames) + + return &NormalIndex{ + TableName: index.TableName, + ColumnNames: copyOfColumnNames, + name: name, + } +} + +func (*NormalIndex) Type() IndexType { + return IndexTypeIndex +} + +func (index *NormalIndex) Columns() []ColumnName { + return index.ColumnNames +} + +func (index *NormalIndex) ToCreateSQL(fmter SQLFormatter) []byte { + sql := []byte{} + + sql = append(sql, "CREATE INDEX IF NOT EXISTS "...) + sql = fmter.AppendIdent(sql, index.Name()) + sql = append(sql, " ON "...) + sql = fmter.AppendIdent(sql, string(index.TableName)) + sql = append(sql, " ("...) + + for i, column := range index.ColumnNames { + if i > 0 { + sql = append(sql, ", "...) + } + + sql = fmter.AppendIdent(sql, string(column)) + } + + sql = append(sql, ")"...) + + return sql +} + +func (index *NormalIndex) ToDropSQL(fmter SQLFormatter) []byte { + sql := []byte{} + + sql = append(sql, "DROP INDEX IF EXISTS "...) + sql = fmter.AppendIdent(sql, index.Name()) + + return sql +} diff --git a/pkg/sqlschema/index_test.go b/pkg/sqlschema/index_test.go index ae554cb88879..f0532d0ad035 100644 --- a/pkg/sqlschema/index_test.go +++ b/pkg/sqlschema/index_test.go @@ -38,6 +38,31 @@ func TestIndexToCreateSQL(t *testing.T) { }, sql: `CREATE UNIQUE INDEX IF NOT EXISTS "my_index" ON "users" ("id", "name", "email")`, }, + { + name: "Normal_1Column", + index: &NormalIndex{ + TableName: "users", + ColumnNames: []ColumnName{"org_id"}, + }, + sql: `CREATE INDEX IF NOT EXISTS "ix_users_org_id" ON "users" ("org_id")`, + }, + { + name: "Normal_2Columns", + index: &NormalIndex{ + TableName: "users", + ColumnNames: []ColumnName{"org_id", "status"}, + }, + sql: `CREATE INDEX IF NOT EXISTS "ix_users_org_id_status" ON "users" ("org_id", "status")`, + }, + { + name: "Normal_3Columns_Named", + index: &NormalIndex{ + TableName: "route_policy", + ColumnNames: []ColumnName{"org_id", "enabled", "kind"}, + name: "idx_custom_name", + }, + sql: `CREATE INDEX IF NOT EXISTS "idx_custom_name" ON "route_policy" ("org_id", "enabled", "kind")`, + }, } for _, testCase := range testCases {