mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-21 02:57:46 -05:00
replaced index types.Map with durable.IndexSet
This commit is contained in:
@@ -30,6 +30,7 @@ import (
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
eventsapi "github.com/dolthub/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb/durable"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/rowconv"
|
||||
@@ -302,15 +303,15 @@ func importSchema(ctx context.Context, dEnv *env.DoltEnv, apr *argparser.ArgPars
|
||||
return errhand.BuildDError("error: failed to create table.").AddCause(err).Build()
|
||||
}
|
||||
|
||||
indexData := empty
|
||||
var indexSet durable.IndexSet
|
||||
if tblExists {
|
||||
indexData, err = tbl.GetIndexData(ctx)
|
||||
indexSet, err = tbl.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return errhand.BuildDError("error: failed to create table.").AddCause(err).Build()
|
||||
}
|
||||
}
|
||||
|
||||
tbl, err = doltdb.NewTable(ctx, root.VRW(), sch, empty, indexData, nil)
|
||||
tbl, err = doltdb.NewTable(ctx, root.VRW(), sch, empty, indexSet, nil)
|
||||
if err != nil {
|
||||
return errhand.BuildDError("error: failed to create table.").AddCause(err).Build()
|
||||
}
|
||||
|
||||
@@ -118,8 +118,7 @@ func TestDocDiff(t *testing.T) {
|
||||
}
|
||||
|
||||
func CreateTestTable(vrw types.ValueReadWriter, tSchema schema.Schema, rowData types.Map) (*doltdb.Table, error) {
|
||||
empty, _ := types.NewMap(context.Background(), vrw)
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, tSchema, rowData, empty, nil)
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, tSchema, rowData, nil, nil)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -69,8 +69,7 @@ func createTestSchema(t *testing.T) schema.Schema {
|
||||
}
|
||||
|
||||
func CreateTestTable(vrw types.ValueReadWriter, tSchema schema.Schema, rowData types.Map) (*Table, error) {
|
||||
empty, _ := types.NewMap(context.Background(), vrw)
|
||||
tbl, err := NewTable(context.Background(), vrw, tSchema, rowData, empty, nil)
|
||||
tbl, err := NewTable(context.Background(), vrw, tSchema, rowData, nil, nil)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package durable
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/types"
|
||||
)
|
||||
|
||||
type IndexSet interface {
|
||||
// GetIndex gets an index from the set.
|
||||
GetIndex(ctx context.Context, name string) (types.Map, error)
|
||||
|
||||
// PutIndex puts an index into the set.
|
||||
// todo(andy): should this be immutable
|
||||
PutIndex(ctx context.Context, name string, idx types.Map) error
|
||||
|
||||
// DropIndex removes an index from the set.
|
||||
DropIndex(ctx context.Context, name string) error
|
||||
}
|
||||
|
||||
func NewIndexSet(ctx context.Context, vrw types.ValueReadWriter) IndexSet {
|
||||
empty, _ := types.NewMap(ctx, vrw)
|
||||
return &nomsIndexSet{
|
||||
indexes: empty,
|
||||
vrw: vrw,
|
||||
}
|
||||
}
|
||||
|
||||
func MapFromIndexSet(ic IndexSet) types.Map {
|
||||
return ic.(*nomsIndexSet).indexes
|
||||
}
|
||||
|
||||
type nomsIndexSet struct {
|
||||
indexes types.Map
|
||||
vrw types.ValueReadWriter
|
||||
}
|
||||
|
||||
var _ IndexSet = &nomsIndexSet{}
|
||||
|
||||
func (c *nomsIndexSet) GetIndex(ctx context.Context, name string) (types.Map, error) {
|
||||
v, ok, err := c.indexes.MaybeGet(ctx, types.String(name))
|
||||
if !ok {
|
||||
err = fmt.Errorf("index %s not found in IndexSet", name)
|
||||
}
|
||||
if err != nil {
|
||||
return types.Map{}, err
|
||||
}
|
||||
|
||||
v, err = v.(types.Ref).TargetValue(ctx, c.vrw)
|
||||
if err != nil {
|
||||
return types.Map{}, err
|
||||
}
|
||||
|
||||
return v.(types.Map), nil
|
||||
}
|
||||
|
||||
func (c *nomsIndexSet) PutIndex(ctx context.Context, name string, idx types.Map) (err error) {
|
||||
ref, err := refFromNomsValue(ctx, c.vrw, idx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.indexes, err = c.indexes.Edit().Set(types.String(name), ref).Map(ctx)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *nomsIndexSet) DropIndex(ctx context.Context, name string) (err error) {
|
||||
c.indexes, err = c.indexes.Edit().Remove(types.String(name)).Map(ctx)
|
||||
return err
|
||||
}
|
||||
@@ -60,9 +60,9 @@ type Table interface {
|
||||
SetTableRows(ctx context.Context, rows types.Map) (Table, error)
|
||||
|
||||
// GetIndexes returns the secondary indexes for this table.
|
||||
GetIndexes(ctx context.Context) (types.Map, error)
|
||||
GetIndexes(ctx context.Context) (IndexSet, error)
|
||||
// SetIndexes sets the secondary indexes for this table.
|
||||
SetIndexes(ctx context.Context, indexes types.Map) (Table, error)
|
||||
SetIndexes(ctx context.Context, indexes IndexSet) (Table, error)
|
||||
|
||||
// GetConflicts returns the merge conflicts for this table.
|
||||
GetConflicts(ctx context.Context) (conflict.ConflictSchema, types.Map, error)
|
||||
@@ -92,7 +92,7 @@ type nomsTable struct {
|
||||
var _ Table = nomsTable{}
|
||||
|
||||
// NewNomsTable makes a new Table.
|
||||
func NewNomsTable(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, rowData types.Map, indexData types.Map, autoIncVal types.Value) (Table, error) {
|
||||
func NewNomsTable(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, rowData types.Map, indexes IndexSet, autoIncVal types.Value) (Table, error) {
|
||||
schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, sch)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -108,7 +108,11 @@ func NewNomsTable(ctx context.Context, vrw types.ValueReadWriter, sch schema.Sch
|
||||
return nil, err
|
||||
}
|
||||
|
||||
indexesRef, err := refFromNomsValue(ctx, vrw, indexData)
|
||||
if indexes == nil {
|
||||
indexes = NewIndexSet(ctx, vrw)
|
||||
}
|
||||
|
||||
indexesRef, err := refFromNomsValue(ctx, vrw, MapFromIndexSet(indexes))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -251,30 +255,33 @@ func (t nomsTable) GetTableRows(ctx context.Context) (types.Map, error) {
|
||||
}
|
||||
|
||||
// GetIndexes implements Table.
|
||||
func (t nomsTable) GetIndexes(ctx context.Context) (types.Map, error) {
|
||||
indexesVal, ok, err := t.tableStruct.MaybeGet(indexesKey)
|
||||
func (t nomsTable) GetIndexes(ctx context.Context) (IndexSet, error) {
|
||||
iv, ok, err := t.tableStruct.MaybeGet(indexesKey)
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
return nil, err
|
||||
}
|
||||
if !ok {
|
||||
newEmptyMap, err := types.NewMap(ctx, t.vrw)
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
}
|
||||
return newEmptyMap, nil
|
||||
return NewIndexSet(ctx, t.vrw), nil
|
||||
}
|
||||
|
||||
indexesMap, err := indexesVal.(types.Ref).TargetValue(ctx, t.vrw)
|
||||
im, err := iv.(types.Ref).TargetValue(ctx, t.vrw)
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return indexesMap.(types.Map), nil
|
||||
return &nomsIndexSet{
|
||||
indexes: im.(types.Map),
|
||||
vrw: t.vrw,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// SetIndexes implements Table.
|
||||
func (t nomsTable) SetIndexes(ctx context.Context, indexesMap types.Map) (Table, error) {
|
||||
indexesRef, err := refFromNomsValue(ctx, t.vrw, indexesMap)
|
||||
func (t nomsTable) SetIndexes(ctx context.Context, indexes IndexSet) (Table, error) {
|
||||
if indexes == nil {
|
||||
indexes = NewIndexSet(ctx, t.vrw)
|
||||
}
|
||||
|
||||
indexesRef, err := refFromNomsValue(ctx, t.vrw, MapFromIndexSet(indexes))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -735,26 +735,16 @@ func (root *RootValue) CreateEmptyTable(ctx context.Context, tName string, sch s
|
||||
return nil, err
|
||||
}
|
||||
|
||||
emptyRef, err := WriteValAndGetRef(ctx, root.VRW(), empty)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ed := empty.Edit()
|
||||
indexes := durable.NewIndexSet(ctx, root.VRW())
|
||||
err = sch.Indexes().Iter(func(index schema.Index) (stop bool, err error) {
|
||||
// create an empty indexRowData map for every index
|
||||
ed.Set(types.String(index.Name()), emptyRef)
|
||||
// create an empty map for every index
|
||||
err = indexes.PutIndex(ctx, index.Name(), empty)
|
||||
return
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
indexes, err := ed.Map(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tbl, err := NewTable(ctx, root.VRW(), sch, empty, indexes, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -74,8 +74,8 @@ type Table struct {
|
||||
}
|
||||
|
||||
// NewTable creates a noms Struct which stores row data, index data, and schema.
|
||||
func NewTable(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, rowData types.Map, indexData types.Map, autoIncVal types.Value) (*Table, error) {
|
||||
dt, err := durable.NewNomsTable(ctx, vrw, sch, rowData, indexData, autoIncVal)
|
||||
func NewTable(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, rowData types.Map, indexes durable.IndexSet, autoIncVal types.Value) (*Table, error) {
|
||||
dt, err := durable.NewNomsTable(ctx, vrw, sch, rowData, indexes, autoIncVal)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -277,13 +277,13 @@ func (t *Table) ResolveConflicts(ctx context.Context, pkTuples []types.Value) (i
|
||||
}
|
||||
|
||||
// GetIndexData returns the internal index map which goes from index name to a ref of the row data map.
|
||||
func (t *Table) GetIndexData(ctx context.Context) (types.Map, error) {
|
||||
func (t *Table) GetIndexData(ctx context.Context) (durable.IndexSet, error) {
|
||||
return t.table.GetIndexes(ctx)
|
||||
}
|
||||
|
||||
// SetIndexData replaces the current internal index map, and returns an updated Table.
|
||||
func (t *Table) SetIndexData(ctx context.Context, indexesMap types.Map) (*Table, error) {
|
||||
table, err := t.table.SetIndexes(ctx, indexesMap)
|
||||
func (t *Table) SetIndexData(ctx context.Context, indexes durable.IndexSet) (*Table, error) {
|
||||
table, err := t.table.SetIndexes(ctx, indexes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -292,92 +292,66 @@ func (t *Table) SetIndexData(ctx context.Context, indexesMap types.Map) (*Table,
|
||||
|
||||
// GetIndexRowData retrieves the underlying map of an index, in which the primary key consists of all indexed columns.
|
||||
func (t *Table) GetIndexRowData(ctx context.Context, indexName string) (types.Map, error) {
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
}
|
||||
|
||||
indexMapRef, ok, err := indexesMap.MaybeGet(ctx, types.String(indexName))
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
}
|
||||
if !ok {
|
||||
return types.EmptyMap, fmt.Errorf("index `%s` is missing its data", indexName)
|
||||
}
|
||||
|
||||
indexMap, err := indexMapRef.(types.Ref).TargetValue(ctx, t.ValueReadWriter())
|
||||
if err != nil {
|
||||
return types.EmptyMap, err
|
||||
}
|
||||
|
||||
return indexMap.(types.Map), nil
|
||||
return indexes.GetIndex(ctx, indexName)
|
||||
}
|
||||
|
||||
// SetIndexRowData replaces the current row data for the given index and returns an updated Table.
|
||||
func (t *Table) SetIndexRowData(ctx context.Context, indexName string, indexRowData types.Map) (*Table, error) {
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
indexRowDataRef, err := WriteValAndGetRef(ctx, t.ValueReadWriter(), indexRowData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
indexesMap, err = indexesMap.Edit().Set(types.String(indexName), indexRowDataRef).Map(ctx)
|
||||
if err != nil {
|
||||
if err = indexes.PutIndex(ctx, indexName, indexRowData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return t.SetIndexData(ctx, indexesMap)
|
||||
return t.SetIndexData(ctx, indexes)
|
||||
}
|
||||
|
||||
// DeleteIndexRowData removes the underlying map of an index, along with its key entry. This should only be used
|
||||
// when removing an index altogether. If the intent is to clear an index's data, then use SetIndexRowData with
|
||||
// an empty map.
|
||||
func (t *Table) DeleteIndexRowData(ctx context.Context, indexName string) (*Table, error) {
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
key := types.String(indexName)
|
||||
if has, err := indexesMap.Has(ctx, key); err != nil {
|
||||
if err = indexes.DropIndex(ctx, indexName); err != nil {
|
||||
return nil, err
|
||||
} else if has {
|
||||
indexesMap, err = indexesMap.Edit().Remove(key).Map(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
return t.SetIndexData(ctx, indexesMap)
|
||||
return t.SetIndexData(ctx, indexes)
|
||||
}
|
||||
|
||||
// RenameIndexRowData changes the name for the index data. Does not verify that the new name is unoccupied. If the old
|
||||
// name does not exist, then this returns the called table without error.
|
||||
func (t *Table) RenameIndexRowData(ctx context.Context, oldIndexName, newIndexName string) (*Table, error) {
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
oldKey := types.String(oldIndexName)
|
||||
newKey := types.String(newIndexName)
|
||||
if indexRowData, ok, err := indexesMap.MaybeGet(ctx, oldKey); err != nil {
|
||||
im, err := indexes.GetIndex(ctx, oldIndexName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if ok {
|
||||
indexesMap, err = indexesMap.Edit().Set(newKey, indexRowData).Remove(oldKey).Map(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
return t.SetIndexData(ctx, indexesMap)
|
||||
if err = indexes.DropIndex(ctx, oldIndexName); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err = indexes.PutIndex(ctx, newIndexName, im); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return t.SetIndexData(ctx, indexes)
|
||||
}
|
||||
|
||||
// VerifyIndexRowData verifies that the index with the given name's data matches what the index expects.
|
||||
@@ -392,30 +366,22 @@ func (t *Table) VerifyIndexRowData(ctx context.Context, indexName string) error
|
||||
return fmt.Errorf("index `%s` does not exist", indexName)
|
||||
}
|
||||
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
indexMapRef, ok, err := indexesMap.MaybeGet(ctx, types.String(indexName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !ok {
|
||||
return fmt.Errorf("index `%s` is missing its data", indexName)
|
||||
}
|
||||
|
||||
indexMapValue, err := indexMapRef.(types.Ref).TargetValue(ctx, t.ValueReadWriter())
|
||||
im, err := indexes.GetIndex(ctx, indexName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
iter, err := indexMapValue.(types.Map).Iterator(ctx)
|
||||
iter, err := im.Iterator(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return index.VerifyMap(ctx, iter, indexMapValue.(types.Map).Format())
|
||||
return index.VerifyMap(ctx, iter, im.Format())
|
||||
}
|
||||
|
||||
// GetAutoIncrementValue returns the current AUTO_INCREMENT value for this table.
|
||||
|
||||
@@ -119,7 +119,7 @@ func createDocsTable(ctx context.Context, vrw types.ValueReadWriter, docs Docs)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newDocsTbl, err := doltdb.NewTable(ctx, vrw, DocsSchema, rowMap, empty, nil)
|
||||
newDocsTbl, err := doltdb.NewTable(ctx, vrw, DocsSchema, rowMap, nil, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -134,8 +134,7 @@ func TestAddNewerTextAndDocPkFromRow(t *testing.T) {
|
||||
}
|
||||
|
||||
func CreateTestTable(vrw types.ValueReadWriter, tSchema schema.Schema, rowData types.Map) (*doltdb.Table, error) {
|
||||
empty, _ := types.NewMap(context.Background(), vrw)
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, tSchema, rowData, empty, nil)
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, tSchema, rowData, nil, nil)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -78,10 +78,7 @@ func CreateEnvWithSeedData(t *testing.T) *env.DoltEnv {
|
||||
ai := sch.Indexes().AllIndexes()
|
||||
sch.Indexes().Merge(ai...)
|
||||
|
||||
empty, err := types.NewMap(ctx, vrw)
|
||||
require.NoError(t, err)
|
||||
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, empty, nil)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
tbl, err = editor.RebuildAllIndexes(ctx, tbl, editor.TestEditorOptions(vrw))
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb/durable"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/row"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
|
||||
@@ -111,9 +112,7 @@ func CreateTestTable(t *testing.T, dEnv *env.DoltEnv, tableName string, sch sche
|
||||
rowMap, err = me.Map(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
empty, err := types.NewMap(ctx, vrw)
|
||||
require.NoError(t, err)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, empty, nil)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
tbl, err = editor.RebuildAllIndexes(ctx, tbl, editor.TestEditorOptions(vrw))
|
||||
require.NoError(t, err)
|
||||
@@ -128,7 +127,7 @@ func CreateTestTable(t *testing.T, dEnv *env.DoltEnv, tableName string, sch sche
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func putTableToWorking(ctx context.Context, dEnv *env.DoltEnv, sch schema.Schema, rows types.Map, indexData types.Map, tableName string, autoVal types.Value) error {
|
||||
func putTableToWorking(ctx context.Context, dEnv *env.DoltEnv, sch schema.Schema, rows types.Map, indexData durable.IndexSet, tableName string, autoVal types.Value) error {
|
||||
root, err := dEnv.WorkingRoot(ctx)
|
||||
if err != nil {
|
||||
return doltdb.ErrNomsIO
|
||||
|
||||
@@ -20,6 +20,8 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb/durable"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dtestutils"
|
||||
@@ -330,11 +332,8 @@ func createTestTable(dEnv *env.DoltEnv, tableName string, sch schema.Schema, err
|
||||
if err != nil {
|
||||
errhand(err)
|
||||
}
|
||||
empty, err := types.NewMap(ctx, vrw)
|
||||
if err != nil {
|
||||
errhand(err)
|
||||
}
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, empty, nil)
|
||||
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, nil, nil)
|
||||
if err != nil {
|
||||
errhand(err)
|
||||
}
|
||||
@@ -361,7 +360,7 @@ func createTestTable(dEnv *env.DoltEnv, tableName string, sch schema.Schema, err
|
||||
}
|
||||
}
|
||||
|
||||
func putTableToWorking(ctx context.Context, dEnv *env.DoltEnv, sch schema.Schema, rows types.Map, indexData types.Map, tableName string, autoVal types.Value) error {
|
||||
func putTableToWorking(ctx context.Context, dEnv *env.DoltEnv, sch schema.Schema, rows types.Map, indexData durable.IndexSet, tableName string, autoVal types.Value) error {
|
||||
root, err := dEnv.WorkingRoot(ctx)
|
||||
if err != nil {
|
||||
return doltdb.ErrNomsIO
|
||||
|
||||
@@ -347,20 +347,17 @@ func setupMergeTest(t *testing.T) (types.ValueReadWriter, *doltdb.Commit, *doltd
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
emptyMap, err := types.NewMap(context.Background(), vrw)
|
||||
require.NoError(t, err)
|
||||
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, sch, initialRows, emptyMap, nil)
|
||||
tbl, err := doltdb.NewTable(context.Background(), vrw, sch, initialRows, nil, nil)
|
||||
require.NoError(t, err)
|
||||
tbl, err = editor.RebuildAllIndexes(context.Background(), tbl, editor.TestEditorOptions(vrw))
|
||||
require.NoError(t, err)
|
||||
|
||||
updatedTbl, err := doltdb.NewTable(context.Background(), vrw, sch, updatedRows, emptyMap, nil)
|
||||
updatedTbl, err := doltdb.NewTable(context.Background(), vrw, sch, updatedRows, nil, nil)
|
||||
require.NoError(t, err)
|
||||
updatedTbl, err = editor.RebuildAllIndexes(context.Background(), updatedTbl, editor.TestEditorOptions(vrw))
|
||||
require.NoError(t, err)
|
||||
|
||||
mergeTbl, err := doltdb.NewTable(context.Background(), vrw, sch, mergeRows, emptyMap, nil)
|
||||
mergeTbl, err := doltdb.NewTable(context.Background(), vrw, sch, mergeRows, nil, nil)
|
||||
require.NoError(t, err)
|
||||
mergeTbl, err = editor.RebuildAllIndexes(context.Background(), mergeTbl, editor.TestEditorOptions(vrw))
|
||||
require.NoError(t, err)
|
||||
@@ -434,9 +431,7 @@ func TestMergeCommits(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
sch, err := tbl.GetSchema(context.Background())
|
||||
assert.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), vrw)
|
||||
assert.NoError(t, err)
|
||||
expected, err := doltdb.NewTable(context.Background(), vrw, sch, expectedRows, emptyMap, nil)
|
||||
expected, err := doltdb.NewTable(context.Background(), vrw, sch, expectedRows, nil, nil)
|
||||
assert.NoError(t, err)
|
||||
expected, err = editor.RebuildAllIndexes(context.Background(), expected, editor.TestEditorOptions(vrw))
|
||||
assert.NoError(t, err)
|
||||
|
||||
@@ -114,7 +114,7 @@ func insertKeyedData(ctx context.Context, nbf *types.NomsBinFormat, oldTable *do
|
||||
}
|
||||
|
||||
// Create the new Table and rebuild all the indexes
|
||||
newTable, err := doltdb.NewTable(ctx, oldTable.ValueReadWriter(), newSchema, empty, empty, nil)
|
||||
newTable, err := doltdb.NewTable(ctx, oldTable.ValueReadWriter(), newSchema, empty, nil, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -510,7 +510,7 @@ func (t *WritableDoltTable) Truncate(ctx *sql.Context) (int, error) {
|
||||
return 0, err
|
||||
}
|
||||
// truncate table resets auto-increment value
|
||||
newTable, err := doltdb.NewTable(ctx, table.ValueReadWriter(), t.sch, empty, empty, nil)
|
||||
newTable, err := doltdb.NewTable(ctx, table.ValueReadWriter(), t.sch, empty, nil, nil)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb/durable"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dtestutils"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
@@ -533,12 +534,13 @@ func UpdateTables(t *testing.T, ctx context.Context, root *doltdb.RootValue, tbl
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
indexData, err := types.NewMap(ctx, root.VRW())
|
||||
var indexData durable.IndexSet
|
||||
require.NoError(t, err)
|
||||
if tbl != nil {
|
||||
indexData, err = tbl.GetIndexData(ctx)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
tbl, err = doltdb.NewTable(ctx, root.VRW(), sch, rowData, indexData, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -309,7 +309,7 @@ func RebuildAllIndexes(ctx context.Context, t *doltdb.Table, opts Options) (*dol
|
||||
return nil, err
|
||||
}
|
||||
|
||||
indexesMap, err := t.GetIndexData(ctx)
|
||||
indexes, err := t.GetIndexData(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -319,17 +319,12 @@ func RebuildAllIndexes(ctx context.Context, t *doltdb.Table, opts Options) (*dol
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rebuiltIndexRowDataRef, err := doltdb.WriteValAndGetRef(ctx, t.ValueReadWriter(), rebuiltIndexRowData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
indexesMap, err = indexesMap.Edit().Set(types.String(index.Name()), rebuiltIndexRowDataRef).Map(ctx)
|
||||
if err != nil {
|
||||
if err = indexes.PutIndex(ctx, index.Name(), rebuiltIndexRowData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return t.SetIndexData(ctx, indexesMap)
|
||||
return t.SetIndexData(ctx, indexes)
|
||||
}
|
||||
|
||||
func rebuildIndexRowData(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, tblRowData types.Map, index schema.Index, opts Options) (types.Map, error) {
|
||||
|
||||
@@ -838,8 +838,7 @@ func createTestSchema(t *testing.T) schema.Schema {
|
||||
}
|
||||
|
||||
func createTableWithoutIndexRebuilding(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, rowData types.Map) (*doltdb.Table, error) {
|
||||
empty, _ := types.NewMap(ctx, vrw)
|
||||
return doltdb.NewTable(ctx, vrw, sch, rowData, empty, nil)
|
||||
return doltdb.NewTable(ctx, vrw, sch, rowData, nil, nil)
|
||||
}
|
||||
|
||||
func rowsToIndexRows(t *testing.T, rows []row.Row, indexName schema.Index, indexAge schema.Index) (indexNameExpectedRows []row.Row, indexAgeExpectedRows []row.Row) {
|
||||
|
||||
@@ -42,7 +42,7 @@ func TestKeylessTableEditorConcurrency(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
opts := TestEditorOptions(db)
|
||||
@@ -150,7 +150,7 @@ func TestKeylessTableEditorConcurrencyPostInsert(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
opts := TestEditorOptions(db)
|
||||
@@ -257,7 +257,7 @@ func TestKeylessTableEditorWriteAfterFlush(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
opts := TestEditorOptions(db)
|
||||
@@ -338,7 +338,7 @@ func TestKeylessTableEditorDuplicateKeyHandling(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
opts := TestEditorOptions(db)
|
||||
@@ -437,7 +437,7 @@ func TestKeylessTableEditorMultipleIndexErrorHandling(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(ctx, db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
table, err = RebuildAllIndexes(ctx, table, opts)
|
||||
require.NoError(t, err)
|
||||
@@ -590,7 +590,7 @@ func TestKeylessTableEditorIndexCardinality(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(ctx, db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
table, err = RebuildAllIndexes(ctx, table, opts)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -53,7 +53,7 @@ func TestTableEditorConcurrency(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
for i := 0; i < tableEditorConcurrencyIterations; i++ {
|
||||
@@ -148,7 +148,7 @@ func TestTableEditorConcurrencyPostInsert(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
tableEditor, err := newPkTableEditor(context.Background(), table, tableSch, tableName, opts)
|
||||
@@ -241,7 +241,7 @@ func TestTableEditorWriteAfterFlush(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
tableEditor, err := newPkTableEditor(context.Background(), table, tableSch, tableName, opts)
|
||||
@@ -311,7 +311,7 @@ func TestTableEditorDuplicateKeyHandling(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(context.Background(), db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(context.Background(), db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
tableEditor, err := newPkTableEditor(context.Background(), table, tableSch, tableName, opts)
|
||||
@@ -398,7 +398,7 @@ func TestTableEditorMultipleIndexErrorHandling(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
emptyMap, err := types.NewMap(ctx, db)
|
||||
require.NoError(t, err)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, emptyMap, nil)
|
||||
table, err := doltdb.NewTable(ctx, db, tableSch, emptyMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
table, err = RebuildAllIndexes(ctx, table, opts)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -115,7 +115,6 @@ func TestKeylessTableReader(t *testing.T) {
|
||||
dEnv := dtu.CreateTestEnv()
|
||||
ctx := context.Background()
|
||||
vrw := dEnv.DoltDB.ValueReadWriter()
|
||||
empty := dtu.MustMap(t, vrw)
|
||||
|
||||
compareRows := func(t *testing.T, expected []sql.Row, rdr table.SqlTableReader) {
|
||||
for _, exp := range expected {
|
||||
@@ -131,7 +130,7 @@ func TestKeylessTableReader(t *testing.T) {
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
rowMap := makeBag(vrw, sch, test.rows...)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, empty, nil)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
rdr, err := table.NewTableReader(ctx, tbl)
|
||||
require.NoError(t, err)
|
||||
@@ -139,7 +138,7 @@ func TestKeylessTableReader(t *testing.T) {
|
||||
})
|
||||
t.Run(test.name+"_buffered", func(t *testing.T) {
|
||||
rowMap := makeBag(vrw, sch, test.rows...)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, empty, nil)
|
||||
tbl, err := doltdb.NewTable(ctx, vrw, sch, rowMap, nil, nil)
|
||||
require.NoError(t, err)
|
||||
rdr, err := table.NewBufferedTableReader(ctx, tbl)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -24,6 +24,7 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb/durable"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dtestutils"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/row"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
|
||||
@@ -81,11 +82,12 @@ func TestEndToEnd(t *testing.T) {
|
||||
|
||||
empty, err := types.NewMap(ctx, root.VRW())
|
||||
require.NoError(t, err)
|
||||
idxRef, err := types.NewRef(empty, root.VRW().Format())
|
||||
|
||||
indexes := durable.NewIndexSet(ctx, root.VRW())
|
||||
err = indexes.PutIndex(ctx, dtestutils.IndexName, empty)
|
||||
require.NoError(t, err)
|
||||
idxMap, err := types.NewMap(ctx, root.VRW(), types.String(dtestutils.IndexName), idxRef)
|
||||
require.NoError(t, err)
|
||||
tbl, err := doltdb.NewTable(ctx, root.VRW(), tt.sch, empty, idxMap, nil)
|
||||
|
||||
tbl, err := doltdb.NewTable(ctx, root.VRW(), tt.sch, empty, indexes, nil)
|
||||
require.NoError(t, err)
|
||||
root, err = root.PutTable(ctx, tableName, tbl)
|
||||
require.NoError(t, err)
|
||||
|
||||
Reference in New Issue
Block a user