Procházet zdrojové kódy

feat: add batch inserter (#2755)

MarkJoyMa před 2 roky
rodič
revize
a5fcf24c04

+ 16 - 1
core/stores/mon/bulkinserter.go

@@ -25,8 +25,23 @@ type (
 	}
 )
 
-// NewBulkInserter returns a BulkInserter.
+// Deprecated. Use NewBatchInserter instead.
 func NewBulkInserter(coll *mongo.Collection, interval ...time.Duration) *BulkInserter {
+	return newBulkInserter(coll, interval...)
+}
+
+// NewBatchInserter returns a BulkInserter.
+func NewBatchInserter(coll Collection, interval ...time.Duration) (*BulkInserter, error) {
+	cloneColl, err := coll.Clone()
+	if err != nil {
+		return nil, err
+	}
+
+	return newBulkInserter(cloneColl, interval...), nil
+}
+
+// newBulkInserter returns a BulkInserter.
+func newBulkInserter(coll *mongo.Collection, interval ...time.Duration) *BulkInserter {
 	inserter := &dbInserter{
 		collection: coll,
 	}

+ 18 - 0
core/stores/mon/bulkinserter_test.go

@@ -25,3 +25,21 @@ func TestBulkInserter(t *testing.T) {
 		bulk.Flush()
 	})
 }
+
+func TestBatchInserter(t *testing.T) {
+	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
+	defer mt.Close()
+
+	mt.Run("test", func(mt *mtest.T) {
+		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
+		bulk, err := NewBatchInserter(createModel(mt).Collection)
+		assert.Equal(t, err, nil)
+		bulk.SetResultHandler(func(result *mongo.InsertManyResult, err error) {
+			assert.Nil(t, err)
+			assert.Equal(t, 2, len(result.InsertedIDs))
+		})
+		bulk.Insert(bson.D{{Key: "foo", Value: "bar"}})
+		bulk.Insert(bson.D{{Key: "foo", Value: "baz"}})
+		bulk.Flush()
+	})
+}