From c3b986dfdb5149bb4d50f35228cfc4a779c023e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net>
Date: Tue, 23 Aug 2016 17:36:19 -0500
Subject: [PATCH] Drafting batch

---
 internal/sqladapter/testing/adapter.go.tpl | 22 ++++++++++++++++++++++
 lib/sqlbuilder/insert.go                   | 10 ++++++++++
 lib/sqlbuilder/interfaces.go               |  5 +++++
 3 files changed, 37 insertions(+)

diff --git a/internal/sqladapter/testing/adapter.go.tpl b/internal/sqladapter/testing/adapter.go.tpl
index 96ed05a6..748b0333 100644
--- a/internal/sqladapter/testing/adapter.go.tpl
+++ b/internal/sqladapter/testing/adapter.go.tpl
@@ -1078,6 +1078,28 @@ func TestDataTypes(t *testing.T) {
 	assert.Equal(t, testValues, item)
 }
 
+func TestBatchInsert(t *testing.T) {
+	sess := mustOpen()
+	defer sess.Close()
+
+	err := sess.Collection("artist").Truncate()
+	assert.NoError(t, err)
+
+	batch := sess.InsertInto("artist").Columns("name").NewBatch(5)
+
+	go func() {
+		for i := 0; i < 9; i++ {
+			batch.Values(fmt.Sprintf("artist-%d", i))
+		}
+		batch.Done()
+	}()
+
+	for q := range batch.Next() {
+		_, err = q.Exec()
+		assert.NoError(t, err)
+	}
+}
+
 func TestBuilder(t *testing.T) {
 	sess := mustOpen()
 	defer sess.Close()
diff --git a/lib/sqlbuilder/insert.go b/lib/sqlbuilder/insert.go
index 0124ff7f..f7259de4 100644
--- a/lib/sqlbuilder/insert.go
+++ b/lib/sqlbuilder/insert.go
@@ -17,6 +17,16 @@ type inserter struct {
 	extra     string
 }
 
+func (qi *inserter) clone() *inserter {
+	clone := &inserter{}
+	*clone = *qi
+	return clone
+}
+
+func (qi *inserter) NewBatch(n int) *BatchInserter {
+	return &BatchInserter{inserter: qi.clone(), size: n}
+}
+
 func (qi *inserter) columnsToFragments(dst *[]exql.Fragment, columns []string) error {
 	l := len(columns)
 	f := make([]exql.Fragment, l)
diff --git a/lib/sqlbuilder/interfaces.go b/lib/sqlbuilder/interfaces.go
index b0c4382a..dbef6a8d 100644
--- a/lib/sqlbuilder/interfaces.go
+++ b/lib/sqlbuilder/interfaces.go
@@ -323,6 +323,11 @@ type Inserter interface {
 	// Inserter. This is only possible when using Returning().
 	Iterator() Iterator
 
+	// Batch provies a BatchInserter that can be used to insert many elements at
+	// once by issuing several calls to Values(). It accepts a size parameter
+	// which defines the batch size. If size is < 1, the batch size is set to 1.
+	NewBatch(size int) *BatchInserter
+
 	// Execer provides the Exec method.
 	Execer
 
-- 
GitLab