Files
chaisql/internal/query/statement/reindex_test.go
2021-12-04 23:42:43 +05:30

92 lines
2.3 KiB
Go

package statement_test
import (
"testing"
"github.com/genjidb/genji/internal/testutil"
"github.com/genjidb/genji/internal/testutil/assert"
"github.com/genjidb/genji/internal/tree"
"github.com/genjidb/genji/types"
"github.com/stretchr/testify/require"
)
func TestReIndex(t *testing.T) {
tests := []struct {
name string
query string
expectReIndexed []string
fails bool
}{
{"ReIndex all", `REINDEX`, []string{"idx_test1_a", "idx_test1_b", "idx_test2_a", "idx_test2_b"}, false},
{"ReIndex table", `REINDEX test2`, []string{"idx_test2_a", "idx_test2_b"}, false},
{"ReIndex index", `REINDEX idx_test1_a`, []string{"idx_test1_a"}, false},
{"ReIndex unknown", `REINDEX doesntexist`, []string{}, true},
{"ReIndex read-only", `REINDEX __genji_catalog`, []string{}, false},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
db, tx, cleanup := testutil.NewTestTx(t)
defer cleanup()
testutil.MustExec(t, db, tx, `
CREATE TABLE test1;
CREATE TABLE test2;
CREATE INDEX idx_test1_a ON test1(a);
CREATE INDEX idx_test1_b ON test1(b);
CREATE INDEX idx_test2_a ON test2(a);
CREATE INDEX idx_test2_b ON test2(b);
INSERT INTO test1(a, b) VALUES (1, 'a'), (2, 'b');
INSERT INTO test2(a, b) VALUES (3, 'c'), (4, 'd');
`)
// truncate all indexes
c := db.Catalog
for _, idxName := range c.ListIndexes("") {
idx, err := c.GetIndex(tx, idxName)
assert.NoError(t, err)
err = idx.Truncate()
assert.NoError(t, err)
}
err := testutil.Exec(db, tx, test.query)
if test.fails {
assert.Error(t, err)
return
}
assert.NoError(t, err)
for _, idxName := range db.Catalog.ListIndexes("") {
idx, err := db.Catalog.GetIndex(tx, idxName)
assert.NoError(t, err)
info, err := db.Catalog.GetIndexInfo(idxName)
assert.NoError(t, err)
shouldBeIndexed := false
for _, name := range test.expectReIndexed {
if name == info.IndexName {
shouldBeIndexed = true
break
}
}
i := 0
err = idx.Tree.Iterate(nil, false, func(tree.Key, types.Value) error {
i++
return nil
})
assert.NoError(t, err)
if shouldBeIndexed {
require.Equal(t, 2, i)
} else {
require.Equal(t, 0, i)
}
}
assert.NoError(t, err)
})
}
}