good morning!!!!

Skip to content
Snippets Groups Projects
Commit 6c2dd6ef authored by José Carlos Nieto's avatar José Carlos Nieto
Browse files

Refactoring BatchInserter a bit.

parent 376c00ab
Branches
Tags
No related merge requests found
...@@ -1099,7 +1099,7 @@ func TestBatchInsert(t *testing.T) { ...@@ -1099,7 +1099,7 @@ func TestBatchInsert(t *testing.T) {
err = batch.Wait() err = batch.Wait()
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, batch.Error()) assert.NoError(t, batch.Err())
c, err := sess.Collection("artist").Find().Count() c, err := sess.Collection("artist").Find().Count()
assert.NoError(t, err) assert.NoError(t, err)
...@@ -1144,7 +1144,7 @@ func TestBatchInsertReturningKeys(t *testing.T) { ...@@ -1144,7 +1144,7 @@ func TestBatchInsertReturningKeys(t *testing.T) {
assert.True(t, len(keyMap) <= batchSize) assert.True(t, len(keyMap) <= batchSize)
// Find the elements we've just inserted // Find the elements we've just inserted
keys := make([]int, len(keyMap)) keys := make([]int, 0, len(keyMap))
for i := range keyMap { for i := range keyMap {
keys = append(keys, keyMap[i].ID) keys = append(keys, keyMap[i].ID)
} }
...@@ -1154,7 +1154,7 @@ func TestBatchInsertReturningKeys(t *testing.T) { ...@@ -1154,7 +1154,7 @@ func TestBatchInsertReturningKeys(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, uint64(len(keyMap)), c) assert.Equal(t, uint64(len(keyMap)), c)
} }
assert.NoError(t, batch.Error()) assert.NoError(t, batch.Err())
// Count all new elements // Count all new elements
c, err := sess.Collection("artist").Find().Count() c, err := sess.Collection("artist").Find().Count()
......
package sqlbuilder package sqlbuilder
// BatchInserter provides a helper that can be used to do massive insertions in
// batches.
type BatchInserter struct { type BatchInserter struct {
inserter *inserter inserter *inserter
size int size int
...@@ -25,7 +27,7 @@ func (b *BatchInserter) Values(values ...interface{}) *BatchInserter { ...@@ -25,7 +27,7 @@ func (b *BatchInserter) Values(values ...interface{}) *BatchInserter {
return b return b
} }
func (b *BatchInserter) NextResult(dst interface{}) bool { func (b *BatchInserter) nextQuery() *inserter {
clone := b.inserter.clone() clone := b.inserter.clone()
i := 0 i := 0
for values := range b.values { for values := range b.values {
...@@ -36,23 +38,44 @@ func (b *BatchInserter) NextResult(dst interface{}) bool { ...@@ -36,23 +38,44 @@ func (b *BatchInserter) NextResult(dst interface{}) bool {
} }
} }
if i == 0 { if i == 0 {
return nil
}
return clone
}
// NextResult is useful when using PostgreSQL and Returning(), it dumps the
// next slice of results to dst, which can mean having the IDs of all inserted
// elements in the batch.
func (b *BatchInserter) NextResult(dst interface{}) bool {
clone := b.nextQuery()
if clone == nil {
return false return false
} }
b.err = clone.Iterator().All(dst) b.err = clone.Iterator().All(dst)
return (b.err == nil) return (b.err == nil)
} }
// Done means that no more elements are going to be added.
func (b *BatchInserter) Done() { func (b *BatchInserter) Done() {
close(b.values) close(b.values)
} }
// Wait blocks until the whole batch is executed.
func (b *BatchInserter) Wait() error { func (b *BatchInserter) Wait() error {
var nop []struct{} for {
for b.NextResult(&nop) { q := b.nextQuery()
if q == nil {
break
} }
return b.err if _, err := q.Exec(); err != nil {
b.err = err
break
}
}
return b.Err()
} }
func (b *BatchInserter) Error() error { // Err returns any error while executing the batch.
func (b *BatchInserter) Err() error {
return b.err return b.err
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment