diff --git a/index.go b/index.go index ea7b3832..1f4f3e47 100644 --- a/index.go +++ b/index.go @@ -102,6 +102,18 @@ func (b *Batch) Reset() { b.internal.Reset() } +// Merge performs the merge of the internal Index.Batch +// of the given batch to the self. +func (b *Batch) Merge(other *Batch) { + for k, v := range other.internal.IndexOps { + b.internal.IndexOps[k] = v + } + + for k, v := range other.internal.InternalOps { + b.internal.InternalOps[k] = v + } +} + // An Index implements all the indexing and searching // capabilities of bleve. An Index can be created // using the New() and Open() methods. diff --git a/index_test.go b/index_test.go index a69357bf..ff0841c8 100644 --- a/index_test.go +++ b/index_test.go @@ -1815,3 +1815,72 @@ func TestIndexAdvancedCountMatchSearch(t *testing.T) { t.Fatal(err) } } + +func TestMatchMerge(t *testing.T) { + defer func() { + err := os.RemoveAll("testidx") + if err != nil { + t.Fatal(err) + } + }() + + index, err := New("testidx", NewIndexMapping()) + if err != nil { + t.Fatal(err) + } + + doca := map[string]interface{}{ + "name": "scorcher", + "desc": "cbft", + } + batcha := index.NewBatch() + err = batcha.Index("a", doca) + if err != nil { + t.Error(err) + } + batcha.SetInternal([]byte("batch_a"), []byte("batch_a_value")) + + docb := map[string]interface{}{ + "name": "updc down", + "desc": "bleve", + } + + batchb := index.NewBatch() + err = batchb.Index("b", docb) + if err != nil { + t.Error(err) + } + batchb.SetInternal([]byte("batch_b"), []byte("batch_b_value")) + + batcha.Merge(batchb) + + err = index.Batch(batcha) + if err != nil { + t.Error(err) + } + + val, err := index.GetInternal([]byte("batch_b")) + if err != nil { + t.Error(err) + } + + if string(val) != "batch_b_value" { + t.Errorf("expected 'batch_b_value', got '%s'", val) + } + + val, err = index.GetInternal([]byte("batch_a")) + if err != nil { + t.Error(err) + } + if string(val) != "batch_a_value" { + t.Errorf("expected 'batch_a_value', got '%s'", val) + } + + val, err = index.GetInternal([]byte("status")) + if err != nil { + t.Error(err) + } + if val != nil { + t.Errorf("expected nil, got '%s'", val) + } +}