Skip to content

Commit ce40088

Browse files
sql/ydb: removed sync index type and added cover columns
1 parent e6ef71c commit ce40088

File tree

3 files changed

+167
-26
lines changed

3 files changed

+167
-26
lines changed

sql/ydb/attributes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ package ydb
88

99
import "ariga.io/atlas/sql/schema"
1010

11-
//[IndexAttributes] represents YDB-specific index attributes.
11+
// [IndexAttributes] represents YDB-specific index attributes.
1212
type IndexAttributes struct {
1313
schema.Attr
14-
Global bool // GLOBAL, LOCAL
15-
Sync bool // SYNC, ASYNC
14+
Async bool
15+
CoverColumns []string
1616
}

sql/ydb/migrate.go

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -290,30 +290,30 @@ func (s *state) addIndexes(src schema.Change, t *schema.Table, indexes ...*schem
290290
indexAttrs := IndexAttributes{}
291291
hasAttrs := sqlx.Has(index.Attrs, &indexAttrs)
292292

293-
b := s.Build("ALTER TABLE").
293+
builder := s.Build("ALTER TABLE").
294294
Table(t).
295295
P("ADD INDEX").
296-
Ident(index.Name)
297-
298-
if hasAttrs && !indexAttrs.Global {
299-
b.P("LOCAL")
300-
} else {
301-
b.P("GLOBAL")
302-
}
296+
Ident(index.Name).
297+
P("GLOBAL")
303298

304299
if index.Unique {
305-
b.P("UNIQUE")
300+
builder.P("UNIQUE")
306301
}
307302

308-
if hasAttrs && !indexAttrs.Sync {
309-
b.P("ASYNC")
303+
if hasAttrs && indexAttrs.Async {
304+
builder.P("ASYNC")
310305
} else {
311-
b.P("SYNC")
306+
builder.P("SYNC")
312307
}
313308

314-
b.P("ON")
309+
builder.P("ON")
310+
311+
s.indexParts(builder, index.Parts)
315312

316-
s.indexParts(b, index.Parts)
313+
if hasAttrs && len(indexAttrs.CoverColumns) > 0 {
314+
builder.P("COVER")
315+
s.indexCoverColumns(builder, indexAttrs.CoverColumns)
316+
}
317317

318318
reverseOp := s.Build("ALTER TABLE").
319319
Table(t).
@@ -322,7 +322,7 @@ func (s *state) addIndexes(src schema.Change, t *schema.Table, indexes ...*schem
322322
String()
323323

324324
s.append(&migrate.Change{
325-
Cmd: b.String(),
325+
Cmd: builder.String(),
326326
Source: src,
327327
Comment: fmt.Sprintf("create index %q to table: %q", index.Name, t.Name),
328328
Reverse: reverseOp,
@@ -396,19 +396,25 @@ func (s *state) indexDef(b *sqlx.Builder, idx *schema.Index) {
396396
}
397397

398398
// indexParts writes the index parts (columns) to the builder.
399-
func (s *state) indexParts(b *sqlx.Builder, parts []*schema.IndexPart) {
400-
b.Wrap(func(b *sqlx.Builder) {
401-
b.MapComma(parts, func(i int, b *sqlx.Builder) {
402-
switch part := parts[i]; {
403-
case part.C != nil:
404-
b.Ident(part.C.Name)
405-
case part.X != nil:
406-
b.WriteString(part.X.(*schema.RawExpr).X)
399+
func (s *state) indexParts(builder *sqlx.Builder, parts []*schema.IndexPart) {
400+
builder.Wrap(func(b *sqlx.Builder) {
401+
b.MapComma(parts, func(i int, builder *sqlx.Builder) {
402+
if parts[i].C != nil {
403+
builder.Ident(parts[i].C.Name)
407404
}
408405
})
409406
})
410407
}
411408

409+
// indexCoverColumns writes the cover columns to the builder.
410+
func (s *state) indexCoverColumns(builder *sqlx.Builder, coverColumns []string) {
411+
builder.Wrap(func(b *sqlx.Builder) {
412+
b.MapComma(coverColumns, func(i int, builder *sqlx.Builder) {
413+
builder.Ident(coverColumns[i])
414+
})
415+
})
416+
}
417+
412418
// append adds changes to the plan.
413419
func (s *state) append(c ...*migrate.Change) {
414420
s.Changes = append(s.Changes, c...)

sql/ydb/migrate_test.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,87 @@ func TestPlanChanges_AddIndex(t *testing.T) {
583583
},
584584
},
585585
},
586+
{
587+
name: "add async index",
588+
changes: []schema.Change{
589+
&schema.ModifyTable{
590+
T: usersTable,
591+
Changes: []schema.Change{
592+
&schema.AddIndex{
593+
I: func() *schema.Index {
594+
idx := schema.NewIndex("idx_name_async").AddColumns(usersTable.Columns[1])
595+
idx.Attrs = append(idx.Attrs, &IndexAttributes{Async: true})
596+
return idx
597+
}(),
598+
},
599+
},
600+
},
601+
},
602+
wantPlan: &migrate.Plan{
603+
Transactional: false,
604+
Changes: []*migrate.Change{
605+
{
606+
Cmd: "ALTER TABLE `users` ADD INDEX `idx_name_async` GLOBAL ASYNC ON (`name`)",
607+
Reverse: "ALTER TABLE `users` DROP INDEX `idx_name_async`",
608+
Comment: `create index "idx_name_async" to table: "users"`,
609+
},
610+
},
611+
},
612+
},
613+
{
614+
name: "add index with cover columns",
615+
changes: []schema.Change{
616+
&schema.ModifyTable{
617+
T: usersTable,
618+
Changes: []schema.Change{
619+
&schema.AddIndex{
620+
I: func() *schema.Index {
621+
idx := schema.NewIndex("idx_name_cover").AddColumns(usersTable.Columns[1])
622+
idx.Attrs = append(idx.Attrs, &IndexAttributes{CoverColumns: []string{"email"}})
623+
return idx
624+
}(),
625+
},
626+
},
627+
},
628+
},
629+
wantPlan: &migrate.Plan{
630+
Transactional: false,
631+
Changes: []*migrate.Change{
632+
{
633+
Cmd: "ALTER TABLE `users` ADD INDEX `idx_name_cover` GLOBAL SYNC ON (`name`) COVER (`email`)",
634+
Reverse: "ALTER TABLE `users` DROP INDEX `idx_name_cover`",
635+
Comment: `create index "idx_name_cover" to table: "users"`,
636+
},
637+
},
638+
},
639+
},
640+
{
641+
name: "add async index with cover columns",
642+
changes: []schema.Change{
643+
&schema.ModifyTable{
644+
T: usersTable,
645+
Changes: []schema.Change{
646+
&schema.AddIndex{
647+
I: func() *schema.Index {
648+
idx := schema.NewIndex("idx_name_async_cover").AddColumns(usersTable.Columns[1])
649+
idx.Attrs = append(idx.Attrs, &IndexAttributes{Async: true, CoverColumns: []string{"email", "id"}})
650+
return idx
651+
}(),
652+
},
653+
},
654+
},
655+
},
656+
wantPlan: &migrate.Plan{
657+
Transactional: false,
658+
Changes: []*migrate.Change{
659+
{
660+
Cmd: "ALTER TABLE `users` ADD INDEX `idx_name_async_cover` GLOBAL ASYNC ON (`name`) COVER (`email`, `id`)",
661+
Reverse: "ALTER TABLE `users` DROP INDEX `idx_name_async_cover`",
662+
Comment: `create index "idx_name_async_cover" to table: "users"`,
663+
},
664+
},
665+
},
666+
},
586667
{
587668
name: "add multiple indexes",
588669
changes: []schema.Change{
@@ -702,6 +783,60 @@ func TestPlanChanges_DropIndex(t *testing.T) {
702783
},
703784
},
704785
},
786+
{
787+
name: "drop async index",
788+
changes: []schema.Change{
789+
&schema.ModifyTable{
790+
T: usersTable,
791+
Changes: []schema.Change{
792+
&schema.DropIndex{
793+
I: func() *schema.Index {
794+
idx := schema.NewIndex("idx_name_async").AddColumns(usersTable.Columns[1])
795+
idx.Attrs = append(idx.Attrs, &IndexAttributes{Async: true})
796+
return idx
797+
}(),
798+
},
799+
},
800+
},
801+
},
802+
wantPlan: &migrate.Plan{
803+
Transactional: false,
804+
Changes: []*migrate.Change{
805+
{
806+
Cmd: "ALTER TABLE `users` DROP INDEX `idx_name_async`",
807+
Reverse: "ALTER TABLE `users` ADD INDEX `idx_name_async` GLOBAL ASYNC ON (`name`)",
808+
Comment: `drop index "idx_name_async" from table: "users"`,
809+
},
810+
},
811+
},
812+
},
813+
{
814+
name: "drop index with cover columns",
815+
changes: []schema.Change{
816+
&schema.ModifyTable{
817+
T: usersTable,
818+
Changes: []schema.Change{
819+
&schema.DropIndex{
820+
I: func() *schema.Index {
821+
idx := schema.NewIndex("idx_name_cover").AddColumns(usersTable.Columns[1])
822+
idx.Attrs = append(idx.Attrs, &IndexAttributes{CoverColumns: []string{"email"}})
823+
return idx
824+
}(),
825+
},
826+
},
827+
},
828+
},
829+
wantPlan: &migrate.Plan{
830+
Transactional: false,
831+
Changes: []*migrate.Change{
832+
{
833+
Cmd: "ALTER TABLE `users` DROP INDEX `idx_name_cover`",
834+
Reverse: "ALTER TABLE `users` ADD INDEX `idx_name_cover` GLOBAL SYNC ON (`name`) COVER (`email`)",
835+
Comment: `drop index "idx_name_cover" from table: "users"`,
836+
},
837+
},
838+
},
839+
},
705840
}
706841

707842
for _, tt := range tests {

0 commit comments

Comments
 (0)