Skip to content

Commit d850288

Browse files
committed
Updated memory tables and tests to use new insert / update / delete interfaces
Signed-off-by: Zach Musgrave <zach@liquidata.co>
1 parent 7b94756 commit d850288

File tree

6 files changed

+101
-25
lines changed

6 files changed

+101
-25
lines changed

engine_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3815,9 +3815,12 @@ func TestGenerators(t *testing.T) {
38153815
func insertRows(t *testing.T, table sql.InsertableTable, rows ...sql.Row) {
38163816
t.Helper()
38173817

3818+
ctx := newCtx()
3819+
inserter := table.Inserter(ctx)
38183820
for _, r := range rows {
3819-
require.NoError(t, table.Insert(newCtx(), r))
3821+
require.NoError(t, inserter.Insert(ctx, r))
38203822
}
3823+
require.NoError(t, inserter.Close(ctx))
38213824
}
38223825

38233826
var pid uint64

memory/table.go

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ type Table struct {
2929

3030
var _ sql.Table = (*Table)(nil)
3131
var _ sql.InsertableTable = (*Table)(nil)
32+
var _ sql.UpdatableTable = (*Table)(nil)
33+
var _ sql.DeletableTable = (*Table)(nil)
34+
var _ sql.ReplaceableTable = (*Table)(nil)
3235
var _ sql.FilteredTable = (*Table)(nil)
3336
var _ sql.ProjectedTable = (*Table)(nil)
3437
var _ sql.IndexableTable = (*Table)(nil)
@@ -241,30 +244,70 @@ func encodeIndexValue(value *indexValue) ([]byte, error) {
241244
return buf.Bytes(), nil
242245
}
243246

244-
// Insert a new row into the table.
247+
type tableEditor struct {
248+
table *Table
249+
}
250+
251+
var _ sql.RowReplacer = (*tableEditor)(nil)
252+
var _ sql.RowUpdater = (*tableEditor)(nil)
253+
var _ sql.RowInserter = (*tableEditor)(nil)
254+
var _ sql.RowDeleter = (*tableEditor)(nil)
255+
256+
func (t tableEditor) Close(*sql.Context) error {
257+
// TODO: it would be nice to apply all pending updates here at once, rather than directly in the Insert / Update
258+
// / Delete methods.
259+
return nil
260+
}
261+
262+
func (t *Table) Inserter(*sql.Context) sql.RowInserter {
263+
return &tableEditor{t}
264+
}
265+
266+
func (t *Table) Updater(*sql.Context) sql.RowUpdater {
267+
return &tableEditor{t}
268+
}
269+
270+
func (t *Table) Replacer(*sql.Context) sql.RowReplacer {
271+
return &tableEditor{t}
272+
}
273+
274+
func (t *Table) Deleter(*sql.Context) sql.RowDeleter {
275+
return &tableEditor{t}
276+
}
277+
278+
// Convenience method to avoid having to create an inserter in test setup
245279
func (t *Table) Insert(ctx *sql.Context, row sql.Row) error {
246-
if err := checkRow(t.schema, row); err != nil {
280+
inserter := t.Inserter(ctx)
281+
if err := inserter.Insert(ctx, row); err != nil {
282+
return err
283+
}
284+
return inserter.Close(ctx)
285+
}
286+
287+
// Insert a new row into the table.
288+
func (t *tableEditor) Insert(ctx *sql.Context, row sql.Row) error {
289+
if err := checkRow(t.table.schema, row); err != nil {
247290
return err
248291
}
249292

250-
key := string(t.keys[t.insert])
251-
t.insert++
252-
if t.insert == len(t.keys) {
253-
t.insert = 0
293+
key := string(t.table.keys[t.table.insert])
294+
t.table.insert++
295+
if t.table.insert == len(t.table.keys) {
296+
t.table.insert = 0
254297
}
255298

256-
t.partitions[key] = append(t.partitions[key], row)
299+
t.table.partitions[key] = append(t.table.partitions[key], row)
257300
return nil
258301
}
259302

260303
// Delete the given row from the table.
261-
func (t *Table) Delete(ctx *sql.Context, row sql.Row) error {
262-
if err := checkRow(t.schema, row); err != nil {
304+
func (t *tableEditor) Delete(ctx *sql.Context, row sql.Row) error {
305+
if err := checkRow(t.table.schema, row); err != nil {
263306
return err
264307
}
265308

266309
matches := false
267-
for partitionIndex, partition := range t.partitions {
310+
for partitionIndex, partition := range t.table.partitions {
268311
for partitionRowIndex, partitionRow := range partition {
269312
matches = true
270313
for rIndex, val := range row {
@@ -274,7 +317,7 @@ func (t *Table) Delete(ctx *sql.Context, row sql.Row) error {
274317
}
275318
}
276319
if matches {
277-
t.partitions[partitionIndex] = append(partition[:partitionRowIndex], partition[partitionRowIndex+1:]...)
320+
t.table.partitions[partitionIndex] = append(partition[:partitionRowIndex], partition[partitionRowIndex+1:]...)
278321
break
279322
}
280323
}
@@ -290,16 +333,16 @@ func (t *Table) Delete(ctx *sql.Context, row sql.Row) error {
290333
return nil
291334
}
292335

293-
func (t *Table) Update(ctx *sql.Context, oldRow sql.Row, newRow sql.Row) error {
294-
if err := checkRow(t.schema, oldRow); err != nil {
336+
func (t *tableEditor) Update(ctx *sql.Context, oldRow sql.Row, newRow sql.Row) error {
337+
if err := checkRow(t.table.schema, oldRow); err != nil {
295338
return err
296339
}
297-
if err := checkRow(t.schema, newRow); err != nil {
340+
if err := checkRow(t.table.schema, newRow); err != nil {
298341
return err
299342
}
300343

301344
matches := false
302-
for partitionIndex, partition := range t.partitions {
345+
for partitionIndex, partition := range t.table.partitions {
303346
for partitionRowIndex, partitionRow := range partition {
304347
matches = true
305348
for rIndex, val := range oldRow {
@@ -309,7 +352,7 @@ func (t *Table) Update(ctx *sql.Context, oldRow sql.Row, newRow sql.Row) error {
309352
}
310353
}
311354
if matches {
312-
t.partitions[partitionIndex][partitionRowIndex] = newRow
355+
t.table.partitions[partitionIndex][partitionRowIndex] = newRow
313356
break
314357
}
315358
}

sql/core.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ type RowInserter interface {
226226
type DeletableTable interface {
227227
// Deleter returns a RowDeleter for this table. The RowDeleter will get one call to Delete for each row to be deleted,
228228
// and will end with a call to Close() to finalize the delete operation.
229-
Deleter(*Context, Row) RowDeleter
229+
Deleter(*Context) RowDeleter
230230
}
231231

232232
// RowDeleter is a delete cursor that can delete one or more rows from a table.
@@ -260,7 +260,7 @@ type RowReplacer interface {
260260
type ReplaceableTable interface {
261261
// Replacer returns a RowReplacer for this table. The RowReplacer will have Insert and optionally Delete called once
262262
// for each row, followed by a call to Close() when all rows have been processed.
263-
Replacer() RowReplacer
263+
Replacer(ctx *Context) RowReplacer
264264
}
265265

266266
// UpdateableTable is a table that can process updates of existing rows via update statements.

sql/plan/delete.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ func (p *DeleteFrom) Execute(ctx *sql.Context) (int, error) {
7676
return 0, err
7777
}
7878

79+
deleter := deletable.Deleter(ctx)
80+
7981
i := 0
8082
for {
8183
row, err := iter.Next()
@@ -88,14 +90,18 @@ func (p *DeleteFrom) Execute(ctx *sql.Context) (int, error) {
8890
return i, err
8991
}
9092

91-
if err := deletable.Delete(ctx, row); err != nil {
93+
if err := deleter.Delete(ctx, row); err != nil {
9294
_ = iter.Close()
9395
return i, err
9496
}
9597

9698
i++
9799
}
98100

101+
if err := deleter.Close(ctx); err != nil {
102+
return 0, err
103+
}
104+
99105
return i, nil
100106
}
101107

sql/plan/insert.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,14 @@ func (p *InsertInto) Execute(ctx *sql.Context) (int, error) {
132132
return 0, err
133133
}
134134

135+
var inserter sql.RowInserter
136+
var replacer sql.RowReplacer
137+
if replaceable != nil {
138+
replacer = replaceable.Replacer(ctx)
139+
} else {
140+
inserter = insertable.Inserter(ctx)
141+
}
142+
135143
i := 0
136144
for {
137145
row, err := iter.Next()
@@ -163,8 +171,8 @@ func (p *InsertInto) Execute(ctx *sql.Context) (int, error) {
163171
}
164172
}
165173

166-
if replaceable != nil {
167-
if err = replaceable.Delete(ctx, row); err != nil {
174+
if replacer != nil {
175+
if err = replacer.Delete(ctx, row); err != nil {
168176
if err != sql.ErrDeleteRowNotFound {
169177
_ = iter.Close()
170178
return i, err
@@ -173,19 +181,29 @@ func (p *InsertInto) Execute(ctx *sql.Context) (int, error) {
173181
i++
174182
}
175183

176-
if err = replaceable.Insert(ctx, row); err != nil {
184+
if err = replacer.Insert(ctx, row); err != nil {
177185
_ = iter.Close()
178186
return i, err
179187
}
180188
} else {
181-
if err := insertable.Insert(ctx, row); err != nil {
189+
if err := inserter.Insert(ctx, row); err != nil {
182190
_ = iter.Close()
183191
return i, err
184192
}
185193
}
186194
i++
187195
}
188196

197+
if replacer != nil {
198+
if err := replacer.Close(ctx); err != nil {
199+
return 0, err
200+
}
201+
} else {
202+
if err := inserter.Close(ctx); err != nil {
203+
return 0, err
204+
}
205+
}
206+
189207
return i, nil
190208
}
191209

sql/plan/update.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ func (p *Update) Execute(ctx *sql.Context) (int, int, error) {
100100
return 0, 0, err
101101
}
102102

103+
updater := updatable.Updater(ctx)
104+
103105
rowsMatched := 0
104106
rowsUpdated := 0
105107
for {
@@ -120,7 +122,7 @@ func (p *Update) Execute(ctx *sql.Context) (int, int, error) {
120122
}
121123
if equals, err := oldRow.Equals(newRow, schema); err == nil {
122124
if !equals {
123-
err = updatable.Update(ctx, oldRow, newRow)
125+
err = updater.Update(ctx, oldRow, newRow)
124126
if err != nil {
125127
_ = iter.Close()
126128
return rowsMatched, rowsUpdated, err
@@ -133,6 +135,10 @@ func (p *Update) Execute(ctx *sql.Context) (int, int, error) {
133135
}
134136
}
135137

138+
if err := updater.Close(ctx); err != nil {
139+
return 0, 0, err
140+
}
141+
136142
return rowsMatched, rowsUpdated, nil
137143
}
138144

0 commit comments

Comments
 (0)