diff --git a/go/libraries/doltcore/doltdocs/docs.go b/go/libraries/doltcore/doltdocs/docs.go index f3f982c8da..cf4ac657a8 100644 --- a/go/libraries/doltcore/doltdocs/docs.go +++ b/go/libraries/doltcore/doltdocs/docs.go @@ -35,7 +35,7 @@ var doltDocsColumns = schema.NewColCollection( schema.NewColumn(doltdb.DocPkColumnName, schema.DocNameTag, types.StringKind, true, schema.NotNullConstraint{}), schema.NewColumn(doltdb.DocTextColumnName, schema.DocTextTag, types.StringKind, false), ) -var Schema = schema.MustSchemaFromCols(doltDocsColumns) +var DocsSchema = schema.MustSchemaFromCols(doltDocsColumns) type Doc struct { Text []byte diff --git a/go/libraries/doltcore/doltdocs/docs_table.go b/go/libraries/doltcore/doltdocs/docs_table.go index a5708f1f36..cc98b07de4 100644 --- a/go/libraries/doltcore/doltdocs/docs_table.go +++ b/go/libraries/doltcore/doltdocs/docs_table.go @@ -24,7 +24,6 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/schema" "github.com/dolthub/dolt/go/libraries/doltcore/schema/encoding" "github.com/dolthub/dolt/go/libraries/doltcore/table" - "github.com/dolthub/dolt/go/libraries/doltcore/table/typed/noms" "github.com/dolthub/dolt/go/store/types" ) @@ -81,59 +80,58 @@ func updateDocsTable(ctx context.Context, docTbl *doltdb.Table, docs Docs) (*dol // createDocsTable creates a new in memory table that stores the given doc details. func createDocsTable(ctx context.Context, vrw types.ValueReadWriter, docs Docs) (*doltdb.Table, error) { - imt := table.NewInMemTable(Schema) + + rows := make([]row.Row, 0, len(docs)) // Determines if the table needs to be created at all and initializes a schema if it does. - createTable := false for _, doc := range docs { + if doc.Text != nil { - createTable = true docTaggedVals := row.TaggedValues{ schema.DocNameTag: types.String(doc.DocPk), schema.DocTextTag: types.String(doc.Text), } - docRow, err := row.New(types.Format_Default, Schema, docTaggedVals) - if err != nil { - return nil, err - } - err = imt.AppendRow(docRow) + r, err := row.New(types.Format_Default, DocsSchema, docTaggedVals) if err != nil { return nil, err } + rows = append(rows, r) } } - if createTable { - rd := table.NewInMemTableReader(imt) - wr := noms.NewNomsMapCreator(context.Background(), vrw, Schema) - - _, _, err := table.PipeRows(context.Background(), rd, wr, false) - if err != nil { - return nil, err - } - rd.Close(context.Background()) - wr.Close(context.Background()) - - schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, wr.GetSchema()) - - if err != nil { - return nil, ErrMarshallingSchema - } - - empty, err := types.NewMap(ctx, vrw) - if err != nil { - return nil, err - } - - newDocsTbl, err := doltdb.NewTable(ctx, vrw, schVal, wr.GetMap(), empty, nil) - if err != nil { - return nil, err - } - - return newDocsTbl, nil + if len(rows) == 0 { + return nil, nil } + empty, err := types.NewMap(ctx, vrw) + if err != nil { + return nil, err + } + + me := empty.Edit() + for _, r := range rows { + k, v := r.NomsMapKey(DocsSchema), r.NomsMapValue(DocsSchema) + me.Set(k, v) + } + + rowMap, err := me.Map(ctx) + if err != nil { + return nil, err + } + + schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, DocsSchema) + if err != nil { + return nil, err + } + + newDocsTbl, err := doltdb.NewTable(ctx, vrw, schVal, rowMap, empty, nil) + if err != nil { + return nil, err + } + + return newDocsTbl, nil + return nil, nil } diff --git a/go/libraries/doltcore/dtestutils/environment.go b/go/libraries/doltcore/dtestutils/environment.go index e3ce83e17a..57a1cb5142 100644 --- a/go/libraries/doltcore/dtestutils/environment.go +++ b/go/libraries/doltcore/dtestutils/environment.go @@ -23,9 +23,7 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" "github.com/dolthub/dolt/go/libraries/doltcore/env" "github.com/dolthub/dolt/go/libraries/doltcore/schema/encoding" - "github.com/dolthub/dolt/go/libraries/doltcore/table" "github.com/dolthub/dolt/go/libraries/doltcore/table/editor" - "github.com/dolthub/dolt/go/libraries/doltcore/table/typed/noms" "github.com/dolthub/dolt/go/libraries/utils/filesys" "github.com/dolthub/dolt/go/store/types" ) @@ -65,25 +63,28 @@ func CreateEnvWithSeedData(t *testing.T) *env.DoltEnv { ctx := context.Background() vrw := dEnv.DoltDB.ValueReadWriter() - rd := table.NewInMemTableReader(imt) - wr := noms.NewNomsMapCreator(ctx, vrw, sch) - _, _, err := table.PipeRows(ctx, rd, wr, false) + rowMap, err := types.NewMap(ctx, vrw) require.NoError(t, err) - err = rd.Close(ctx) + me := rowMap.Edit() + for i := 0; i < imt.NumRows(); i++ { + r, err := imt.GetRow(i) + require.NoError(t, err) + k, v := r.NomsMapKey(sch), r.NomsMapValue(sch) + me.Set(k, v) + } + rowMap, err = me.Map(ctx) require.NoError(t, err) - err = wr.Close(ctx) - require.NoError(t, err) - - ai := sch.Indexes().AllIndexes() - sch = wr.GetSchema() - sch.Indexes().Merge(ai...) schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, sch) require.NoError(t, err) empty, err := types.NewMap(ctx, vrw) require.NoError(t, err) - tbl, err := doltdb.NewTable(ctx, vrw, schVal, wr.GetMap(), empty, nil) + + ai := sch.Indexes().AllIndexes() + sch.Indexes().Merge(ai...) + + tbl, err := doltdb.NewTable(ctx, vrw, schVal, rowMap, empty, nil) require.NoError(t, err) tbl, err = editor.RebuildAllIndexes(ctx, tbl, editor.TestEditorOptions(vrw)) require.NoError(t, err) diff --git a/go/libraries/doltcore/dtestutils/schema.go b/go/libraries/doltcore/dtestutils/schema.go index f30cd9fd18..ba8423c375 100644 --- a/go/libraries/doltcore/dtestutils/schema.go +++ b/go/libraries/doltcore/dtestutils/schema.go @@ -29,7 +29,6 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/schema/encoding" "github.com/dolthub/dolt/go/libraries/doltcore/table" "github.com/dolthub/dolt/go/libraries/doltcore/table/editor" - "github.com/dolthub/dolt/go/libraries/doltcore/table/typed/noms" "github.com/dolthub/dolt/go/store/types" ) @@ -100,21 +99,24 @@ func CreateTestTable(t *testing.T, dEnv *env.DoltEnv, tableName string, sch sche ctx := context.Background() vrw := dEnv.DoltDB.ValueReadWriter() - rd := table.NewInMemTableReader(imt) - wr := noms.NewNomsMapCreator(ctx, vrw, sch) - _, _, err := table.PipeRows(ctx, rd, wr, false) + rowMap, err := types.NewMap(ctx, vrw) require.NoError(t, err) - err = rd.Close(ctx) - require.NoError(t, err) - err = wr.Close(ctx) + me := rowMap.Edit() + for i := 0; i < imt.NumRows(); i++ { + r, err := imt.GetRow(i) + require.NoError(t, err) + k, v := r.NomsMapKey(sch), r.NomsMapValue(sch) + me.Set(k, v) + } + rowMap, err = me.Map(ctx) require.NoError(t, err) schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, sch) require.NoError(t, err) empty, err := types.NewMap(ctx, vrw) require.NoError(t, err) - tbl, err := doltdb.NewTable(ctx, vrw, schVal, wr.GetMap(), empty, nil) + tbl, err := doltdb.NewTable(ctx, vrw, schVal, rowMap, empty, nil) require.NoError(t, err) tbl, err = editor.RebuildAllIndexes(ctx, tbl, editor.TestEditorOptions(vrw)) require.NoError(t, err) diff --git a/go/libraries/doltcore/dtestutils/testcommands/multienv.go b/go/libraries/doltcore/dtestutils/testcommands/multienv.go index bbf4d0b779..3a02e66e83 100644 --- a/go/libraries/doltcore/dtestutils/testcommands/multienv.go +++ b/go/libraries/doltcore/dtestutils/testcommands/multienv.go @@ -28,9 +28,7 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/row" "github.com/dolthub/dolt/go/libraries/doltcore/schema" "github.com/dolthub/dolt/go/libraries/doltcore/schema/encoding" - "github.com/dolthub/dolt/go/libraries/doltcore/table" "github.com/dolthub/dolt/go/libraries/doltcore/table/editor" - "github.com/dolthub/dolt/go/libraries/doltcore/table/typed/noms" "github.com/dolthub/dolt/go/libraries/utils/filesys" "github.com/dolthub/dolt/go/store/types" ) @@ -316,29 +314,24 @@ func (mr *MultiRepoTestSetup) PushToRemote(dbName, remoteName, branchName string // createTestTable creates a new test table with the name, schema, and rows given. func createTestTable(dEnv *env.DoltEnv, tableName string, sch schema.Schema, errhand func(args ...interface{}), rs ...row.Row) { - imt := table.NewInMemTable(sch) - - for _, r := range rs { - _ = imt.AppendRow(r) - } - ctx := context.Background() vrw := dEnv.DoltDB.ValueReadWriter() - rd := table.NewInMemTableReader(imt) - wr := noms.NewNomsMapCreator(ctx, vrw, sch) - _, _, err := table.PipeRows(ctx, rd, wr, false) + rowMap, err := types.NewMap(ctx, vrw) if err != nil { errhand(err) } - err = rd.Close(ctx) - if err != nil { - errhand(err) - } - err = wr.Close(ctx) + + me := rowMap.Edit() + for _, r := range rs { + k, v := r.NomsMapKey(sch), r.NomsMapValue(sch) + me.Set(k, v) + } + rowMap, err = me.Map(ctx) if err != nil { errhand(err) } + schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, vrw, sch) if err != nil { errhand(err) @@ -347,7 +340,7 @@ func createTestTable(dEnv *env.DoltEnv, tableName string, sch schema.Schema, err if err != nil { errhand(err) } - tbl, err := doltdb.NewTable(ctx, vrw, schVal, wr.GetMap(), empty, nil) + tbl, err := doltdb.NewTable(ctx, vrw, schVal, rowMap, empty, nil) if err != nil { errhand(err) } diff --git a/go/libraries/doltcore/sqle/sqlddl_test.go b/go/libraries/doltcore/sqle/sqlddl_test.go index 125c102165..b2ba62861e 100644 --- a/go/libraries/doltcore/sqle/sqlddl_test.go +++ b/go/libraries/doltcore/sqle/sqlddl_test.go @@ -1164,7 +1164,7 @@ func TestAlterSystemTables(t *testing.T) { CreateTestDatabase(dEnv, t) dtestutils.CreateTestTable(t, dEnv, "dolt_docs", - doltdocs.Schema, + doltdocs.DocsSchema, NewRow(types.String("LICENSE.md"), types.String("A license"))) dtestutils.CreateTestTable(t, dEnv, doltdb.DoltQueryCatalogTableName, dtables.DoltQueryCatalogSchema, diff --git a/go/libraries/doltcore/sqle/sqldelete_test.go b/go/libraries/doltcore/sqle/sqldelete_test.go index 42eb252657..e5139155ca 100644 --- a/go/libraries/doltcore/sqle/sqldelete_test.go +++ b/go/libraries/doltcore/sqle/sqldelete_test.go @@ -193,7 +193,7 @@ var systemTableDeleteTests = []DeleteTest{ { Name: "delete dolt_docs", AdditionalSetup: CreateTableFn("dolt_docs", - doltdocs.Schema, + doltdocs.DocsSchema, NewRow(types.String("LICENSE.md"), types.String("A license"))), DeleteQuery: "delete from dolt_docs", ExpectedErr: "cannot delete from table", diff --git a/go/libraries/doltcore/sqle/sqlinsert_test.go b/go/libraries/doltcore/sqle/sqlinsert_test.go index df5cf5ab93..b9cf03db1f 100644 --- a/go/libraries/doltcore/sqle/sqlinsert_test.go +++ b/go/libraries/doltcore/sqle/sqlinsert_test.go @@ -398,7 +398,7 @@ var systemTableInsertTests = []InsertTest{ { Name: "insert into dolt_docs", AdditionalSetup: CreateTableFn("dolt_docs", - doltdocs.Schema, + doltdocs.DocsSchema, NewRow(types.String("LICENSE.md"), types.String("A license"))), InsertQuery: "insert into dolt_docs (doc_name, doc_text) values ('README.md', 'Some text')", ExpectedErr: "cannot insert into table", diff --git a/go/libraries/doltcore/sqle/sqlreplace_test.go b/go/libraries/doltcore/sqle/sqlreplace_test.go index e9955a7567..f8438dc8a2 100644 --- a/go/libraries/doltcore/sqle/sqlreplace_test.go +++ b/go/libraries/doltcore/sqle/sqlreplace_test.go @@ -255,7 +255,7 @@ var systemTableReplaceTests = []ReplaceTest{ { Name: "replace into dolt_docs", AdditionalSetup: CreateTableFn("dolt_docs", - doltdocs.Schema, + doltdocs.DocsSchema, NewRow(types.String("LICENSE.md"), types.String("A license"))), ReplaceQuery: "replace into dolt_docs (doc_name, doc_text) values ('README.md', 'Some text')", ExpectedErr: "cannot insert into table", diff --git a/go/libraries/doltcore/sqle/sqlselect_test.go b/go/libraries/doltcore/sqle/sqlselect_test.go index c4fac35f2f..a2e39f5c15 100644 --- a/go/libraries/doltcore/sqle/sqlselect_test.go +++ b/go/libraries/doltcore/sqle/sqlselect_test.go @@ -1484,15 +1484,15 @@ var systemTableSelectTests = []SelectTest{ { Name: "select from dolt_docs", AdditionalSetup: CreateTableFn("dolt_docs", - doltdocs.Schema, - NewRowWithSchema(doltdocs.Schema, + doltdocs.DocsSchema, + NewRowWithSchema(doltdocs.DocsSchema, types.String("LICENSE.md"), types.String("A license")), ), Query: "select * from dolt_docs", - ExpectedRows: ToSqlRows(CompressSchema(doltdocs.Schema), + ExpectedRows: ToSqlRows(CompressSchema(doltdocs.DocsSchema), NewRow(types.String("LICENSE.md"), types.String("A license"))), - ExpectedSchema: CompressSchema(doltdocs.Schema), + ExpectedSchema: CompressSchema(doltdocs.DocsSchema), }, { Name: "select from dolt_query_catalog", diff --git a/go/libraries/doltcore/sqle/sqlupdate_test.go b/go/libraries/doltcore/sqle/sqlupdate_test.go index c6fc799641..09a8e64db5 100644 --- a/go/libraries/doltcore/sqle/sqlupdate_test.go +++ b/go/libraries/doltcore/sqle/sqlupdate_test.go @@ -377,7 +377,7 @@ var systemTableUpdateTests = []UpdateTest{ { Name: "update dolt_docs", AdditionalSetup: CreateTableFn("dolt_docs", - doltdocs.Schema, + doltdocs.DocsSchema, NewRow(types.String("LICENSE.md"), types.String("A license"))), UpdateQuery: "update dolt_docs set doc_text = 'Some text')", ExpectedErr: "cannot insert into table", diff --git a/go/libraries/doltcore/table/typed/noms/noms_map_creator.go b/go/libraries/doltcore/table/typed/noms/noms_map_creator.go deleted file mode 100644 index 065f28e8e5..0000000000 --- a/go/libraries/doltcore/table/typed/noms/noms_map_creator.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2019 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 noms - -import ( - "context" - "errors" - - "github.com/dolthub/dolt/go/libraries/doltcore/row" - "github.com/dolthub/dolt/go/libraries/doltcore/schema" - "github.com/dolthub/dolt/go/store/types" -) - -// NomsMapUpdater is a TableWriter that creates a new noms types.Map. It is backed by a StreamingMap which requires -// the rows to be written in order. If the keys being written to WriteRow are not sorted an error will be returned from -// WriteRow. Once all rows are written Close() should be called and GetMap will then return the new map. -type NomsMapCreator struct { - sch schema.Schema - vrw types.ValueReadWriter - - lastPK types.LesserValuable - kvsChan chan<- types.Value - - streamingMap *types.StreamingMap - - err error - result *types.Map -} - -// NewNomsMapCreator creates a new NomsMapCreator. -func NewNomsMapCreator(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema) *NomsMapCreator { - kvsChan := make(chan types.Value) - streamingMap := types.NewStreamingMap(ctx, vrw, kvsChan) - return &NomsMapCreator{sch, vrw, nil, kvsChan, streamingMap, nil, nil} -} - -// GetSchema gets the schema of the rows that this writer writes -func (nmc *NomsMapCreator) GetSchema() schema.Schema { - return nmc.sch -} - -// WriteRow will write a row to a table. The primary key for each row must be greater than the primary key of the row -// written before it. -func (nmc *NomsMapCreator) WriteRow(ctx context.Context, r row.Row) error { - if nmc.err != nil { - return nmc.err - } - if nmc.kvsChan == nil { - return errors.New("writing to NomsMapCreator after closing") - } - - send := func(v types.Value) error { - select { - case nmc.kvsChan <- v: - return nil - case <-nmc.streamingMap.Done(): - _, err := nmc.streamingMap.Wait() - return err - } - } - - err := func() error { - pk := r.NomsMapKey(nmc.sch) - fieldVals := r.NomsMapValue(nmc.sch) - - isOK := nmc.lastPK == nil - if !isOK { - var err error - isOK, err = nmc.lastPK.Less(nmc.vrw.Format(), pk) - if err != nil { - return err - } - } - - if isOK { - pkVal, err := pk.Value(ctx) - if err != nil { - return err - } - - fv, err := fieldVals.Value(ctx) - if err != nil { - return err - } - - if err := send(pkVal); err != nil { - return err - } - if err := send(fv); err != nil { - return err - } - nmc.lastPK = pk - - return nil - } else { - return errors.New("Input was not sorted by the primary key") - } - }() - - if err != nil { - close(nmc.kvsChan) - nmc.kvsChan = nil - nmc.err = err - } - - return err -} - -// Close should flush all writes, release resources being held. After this call is made no more rows may be written, -// and the value of GetMap becomes valid. -func (nmc *NomsMapCreator) Close(ctx context.Context) error { - if nmc.err != nil { - return nmc.err - } - if nmc.result == nil { - close(nmc.kvsChan) - nmc.kvsChan = nil - m, err := nmc.streamingMap.Wait() - nmc.result = &m - return err - } else { - return errors.New("Already closed.") - } -} - -// GetMap retrieves the resulting types.Map once close is called -func (nmc *NomsMapCreator) GetMap() types.Map { - // Might want to panic if this was never closed - return *nmc.result -} diff --git a/go/libraries/doltcore/table/typed/noms/read_write_test.go b/go/libraries/doltcore/table/typed/noms/read_write_test.go deleted file mode 100644 index 3d9aae20a1..0000000000 --- a/go/libraries/doltcore/table/typed/noms/read_write_test.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2019 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 noms - -import ( - "context" - "io" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - - "github.com/dolthub/dolt/go/libraries/doltcore/dbfactory" - "github.com/dolthub/dolt/go/libraries/doltcore/row" - "github.com/dolthub/dolt/go/libraries/doltcore/schema" - "github.com/dolthub/dolt/go/store/types" -) - -const ( - idCol = "id" - nameCol = "name" - ageCol = "age" - titleCol = "title" - idColTag = 4 - nameColTag = 3 - ageColTag = 2 - titleColTag = 1 -) - -var colColl = schema.NewColCollection( - schema.NewColumn(idCol, idColTag, types.UUIDKind, true, schema.NotNullConstraint{}), - schema.NewColumn(nameCol, nameColTag, types.StringKind, false), - schema.NewColumn(ageCol, ageColTag, types.UintKind, false), - schema.NewColumn(titleCol, titleColTag, types.StringKind, false), -) -var sch = schema.MustSchemaFromCols(colColl) - -var uuids = []uuid.UUID{ - uuid.Must(uuid.Parse("00000000-0000-0000-0000-000000000000")), - uuid.Must(uuid.Parse("00000000-0000-0000-0000-000000000001")), - uuid.Must(uuid.Parse("00000000-0000-0000-0000-000000000002"))} -var names = []string{"Bill Billerson", "John Johnson", "Rob Robertson"} -var ages = []uint{32, 25, 21} -var titles = []string{"Senior Dufus", "Dufus", ""} - -var updatedIndices = []bool{false, true, true} -var updatedAges = []uint{0, 26, 20} - -func createRows(t *testing.T, onlyUpdated, updatedAge bool) []row.Row { - rows := make([]row.Row, 0, len(names)) - for i := 0; i < len(names); i++ { - if !onlyUpdated || updatedIndices[i] { - age := ages[i] - if updatedAge && updatedIndices[i] { - age = updatedAges[i] - } - - rowVals := row.TaggedValues{ - idColTag: types.UUID(uuids[i]), - nameColTag: types.String(names[i]), - ageColTag: types.Uint(age), - titleColTag: types.String(titles[i]), - } - - r, err := row.New(types.Format_Default, sch, rowVals) - assert.NoError(t, err) - - rows = append(rows, r) - } - } - - return rows -} - -func TestReadWrite(t *testing.T) { - db, _ := dbfactory.MemFactory{}.CreateDB(context.Background(), types.Format_Default, nil, nil) - - rows := createRows(t, false, false) - - initialMapVal := testNomsMapCreator(t, db, rows) - testReadAndCompare(t, initialMapVal, rows) - - updatedRows := createRows(t, true, true) - updatedMap := testNomsMapUpdate(t, db, initialMapVal, updatedRows) - - expectedRows := createRows(t, false, true) - testReadAndCompare(t, updatedMap, expectedRows) -} - -func testNomsMapCreator(t *testing.T, vrw types.ValueReadWriter, rows []row.Row) types.Map { - mc := NewNomsMapCreator(context.Background(), vrw, sch) - - for _, r := range rows { - err := mc.WriteRow(context.Background(), r) - - if err != nil { - t.Error("Failed to write row.", err) - } - } - - err := mc.Close(context.Background()) - - if err != nil { - t.Fatal("Failed to close writer") - } - - err = mc.Close(context.Background()) - - if err == nil { - t.Error("Should give error for having already been closed") - } - - err = mc.WriteRow(context.Background(), rows[0]) - - if err == nil { - t.Error("Should give error for writing after closing.") - } - - return mc.GetMap() -} - -func testNomsMapUpdate(t *testing.T, vrw types.ValueReadWriter, initialMapVal types.Map, rows []row.Row) types.Map { - mu := NewNomsMapUpdater(context.Background(), vrw, initialMapVal, sch, nil) - - for _, r := range rows { - err := mu.WriteRow(context.Background(), r) - - if err != nil { - t.Error("Failed to write row.", err) - } - } - - err := mu.Close(context.Background()) - - if err != nil { - t.Fatal("Failed to close writer") - } - - err = mu.Close(context.Background()) - - if err == nil { - t.Error("Should give error for having already been closed") - } - - err = mu.WriteRow(context.Background(), rows[0]) - - if err == nil { - t.Error("Should give error for writing after closing.") - } - - return mu.GetMap() -} - -func testReadAndCompare(t *testing.T, initialMapVal types.Map, expectedRows []row.Row) { - ctx := context.Background() - mr, err := NewNomsMapReader(context.Background(), initialMapVal, sch) - assert.NoError(t, err) - - var r row.Row - var actualRows []row.Row - for { - r, err = mr.ReadRow(ctx) - if err == io.EOF { - break - } - assert.NoError(t, err) - - actualRows = append(actualRows, r) - } - assert.Equal(t, len(actualRows), len(expectedRows)) - - for i := 0; i < len(expectedRows); i++ { - if !row.AreEqual(actualRows[i], expectedRows[i], sch) { - t.Error(row.Fmt(ctx, actualRows[i], sch), "!=", row.Fmt(context.Background(), expectedRows[i], sch)) - } - } -}