Simplify CreateTable and CreateIndex signatures

This commit is contained in:
Asdine El Hrychy
2019-11-01 15:14:52 +01:00
parent 3edd813b7e
commit e5ad58de93
3 changed files with 51 additions and 44 deletions

View File

@@ -141,7 +141,7 @@ func (stmt createTableStmt) Run(tx *Tx, args []driver.NamedValue) (Result, error
return res, errors.New("missing table name") return res, errors.New("missing table name")
} }
_, err := tx.CreateTable(stmt.tableName, nil) err := tx.CreateTable(stmt.tableName, nil)
if stmt.ifNotExists && err == ErrTableAlreadyExists { if stmt.ifNotExists && err == ErrTableAlreadyExists {
err = nil err = nil
} }
@@ -181,7 +181,7 @@ func (stmt createIndexStmt) Run(tx *Tx, args []driver.NamedValue) (Result, error
return res, errors.New("missing field name") return res, errors.New("missing field name")
} }
_, err := tx.CreateIndex(index.Options{ err := tx.CreateIndex(index.Options{
Unique: stmt.unique, Unique: stmt.unique,
IndexName: stmt.indexName, IndexName: stmt.indexName,
TableName: stmt.tableName, TableName: stmt.tableName,

29
db.go
View File

@@ -259,21 +259,21 @@ type TableConfig struct {
// CreateTable creates a table with the given name. // CreateTable creates a table with the given name.
// If it already exists, returns ErrTableAlreadyExists. // If it already exists, returns ErrTableAlreadyExists.
func (tx Tx) CreateTable(name string, cfg *TableConfig) (*Table, error) { func (tx Tx) CreateTable(name string, cfg *TableConfig) error {
if cfg == nil { if cfg == nil {
cfg = new(TableConfig) cfg = new(TableConfig)
} }
err := tx.tcfgStore.Insert(name, *cfg) err := tx.tcfgStore.Insert(name, *cfg)
if err != nil { if err != nil {
return nil, err return err
} }
err = tx.tx.CreateStore(name) err = tx.tx.CreateStore(name)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "failed to create table %q", name) return errors.Wrapf(err, "failed to create table %q", name)
} }
return tx.GetTable(name) return nil
} }
// GetTable returns a table by name. The table instance is only valid for the lifetime of the transaction. // GetTable returns a table by name. The table instance is only valid for the lifetime of the transaction.
@@ -320,25 +320,25 @@ func buildIndexName(name string) string {
// CreateIndex creates an index with the given name. // CreateIndex creates an index with the given name.
// If it already exists, returns ErrTableAlreadyExists. // If it already exists, returns ErrTableAlreadyExists.
func (tx Tx) CreateIndex(opts index.Options) (*Index, error) { func (tx Tx) CreateIndex(opts index.Options) error {
it, err := tx.GetTable(indexStoreName) it, err := tx.GetTable(indexStoreName)
if err != nil { if err != nil {
return nil, err return err
} }
_, err = tx.GetTable(opts.TableName) _, err = tx.GetTable(opts.TableName)
if err != nil { if err != nil {
return nil, err return err
} }
idxName := buildIndexName(opts.IndexName) idxName := buildIndexName(opts.IndexName)
_, err = it.GetRecord([]byte(idxName)) _, err = it.GetRecord([]byte(idxName))
if err == nil { if err == nil {
return nil, ErrIndexAlreadyExists return ErrIndexAlreadyExists
} }
if err != ErrRecordNotFound { if err != ErrRecordNotFound {
return nil, err return err
} }
idxOpts := indexOptions{ idxOpts := indexOptions{
@@ -349,17 +349,8 @@ func (tx Tx) CreateIndex(opts index.Options) (*Index, error) {
} }
_, err = it.Insert(&idxOpts) _, err = it.Insert(&idxOpts)
if err != nil {
return nil, err
}
return &Index{ return err
Index: index.New(tx.tx, opts),
IndexName: idxOpts.IndexName,
TableName: idxOpts.TableName,
FieldName: idxOpts.FieldName,
Unique: idxOpts.Unique,
}, nil
} }
// GetIndex returns an index by name. // GetIndex returns an index by name.

View File

@@ -141,7 +141,9 @@ func newTestDB(t testing.TB) (*genji.Tx, func()) {
func newTestTable(t testing.TB) (*genji.Table, func()) { func newTestTable(t testing.TB) (*genji.Table, func()) {
tx, fn := newTestDB(t) tx, fn := newTestDB(t)
tb, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err)
tb, err := tx.GetTable("test")
require.NoError(t, err) require.NoError(t, err)
return tb, fn return tb, fn
@@ -152,13 +154,15 @@ func TestTxCreateIndex(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
_, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err) require.NoError(t, err)
idx, err := tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.NoError(t, err) require.NoError(t, err)
idx, err := tx.GetIndex("idxFoo")
require.NoError(t, err)
require.NotNil(t, idx) require.NotNil(t, idx)
}) })
@@ -166,15 +170,15 @@ func TestTxCreateIndex(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
_, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.Equal(t, genji.ErrIndexAlreadyExists, err) require.Equal(t, genji.ErrIndexAlreadyExists, err)
@@ -184,7 +188,7 @@ func TestTxCreateIndex(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
_, err := tx.CreateIndex(index.Options{ err := tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.Equal(t, genji.ErrTableNotFound, err) require.Equal(t, genji.ErrTableNotFound, err)
@@ -196,10 +200,10 @@ func TestTxDropIndex(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
_, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.NoError(t, err) require.NoError(t, err)
@@ -223,7 +227,9 @@ func TestTxDropIndex(t *testing.T) {
func TestTxReIndex(t *testing.T) { func TestTxReIndex(t *testing.T) {
newTestTableFn := func(t *testing.T) (*genji.Tx, *genji.Table, func()) { newTestTableFn := func(t *testing.T) (*genji.Tx, *genji.Table, func()) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
tb, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err)
tb, err := tx.GetTable("test")
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
@@ -234,13 +240,13 @@ func TestTxReIndex(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "a", IndexName: "a",
TableName: "test", TableName: "test",
FieldName: "a", FieldName: "a",
}) })
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "b", IndexName: "b",
TableName: "test", TableName: "test",
FieldName: "b", FieldName: "b",
@@ -303,9 +309,14 @@ func TestReIndexAll(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
tb1, err := tx.CreateTable("test1", nil) err := tx.CreateTable("test1", nil)
require.NoError(t, err) require.NoError(t, err)
tb2, err := tx.CreateTable("test2", nil) tb1, err := tx.GetTable("test1")
require.NoError(t, err)
err = tx.CreateTable("test2", nil)
require.NoError(t, err)
tb2, err := tx.GetTable("test2")
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
@@ -321,13 +332,13 @@ func TestReIndexAll(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "t1a", IndexName: "t1a",
TableName: "test1", TableName: "test1",
FieldName: "a", FieldName: "a",
}) })
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "t2a", IndexName: "t2a",
TableName: "test2", TableName: "test2",
FieldName: "a", FieldName: "a",
@@ -554,13 +565,15 @@ func TestTableInsert(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
_, err := tx.CreateTable("test", nil) err := tx.CreateTable("test", nil)
require.NoError(t, err) require.NoError(t, err)
idx, err := tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
IndexName: "idxFoo", TableName: "test", FieldName: "foo", IndexName: "idxFoo", TableName: "test", FieldName: "foo",
}) })
require.NoError(t, err) require.NoError(t, err)
idx, err := tx.GetIndex("idxFoo")
require.NoError(t, err)
tb, err := tx.GetTable("test") tb, err := tx.GetTable("test")
require.NoError(t, err) require.NoError(t, err)
@@ -737,26 +750,29 @@ func TestTableIndexes(t *testing.T) {
tx, cleanup := newTestDB(t) tx, cleanup := newTestDB(t)
defer cleanup() defer cleanup()
tb, err := tx.CreateTable("test1", nil) err := tx.CreateTable("test1", nil)
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateTable("test2", nil) tb, err := tx.GetTable("test1")
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateTable("test2", nil)
require.NoError(t, err)
err = tx.CreateIndex(index.Options{
Unique: true, Unique: true,
IndexName: "idx1a", IndexName: "idx1a",
TableName: "test1", TableName: "test1",
FieldName: "a", FieldName: "a",
}) })
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
Unique: false, Unique: false,
IndexName: "idx1b", IndexName: "idx1b",
TableName: "test1", TableName: "test1",
FieldName: "b", FieldName: "b",
}) })
require.NoError(t, err) require.NoError(t, err)
_, err = tx.CreateIndex(index.Options{ err = tx.CreateIndex(index.Options{
Unique: false, Unique: false,
IndexName: "ifx2a", IndexName: "ifx2a",
TableName: "test2", TableName: "test2",