Skip to content

Commit e17ee36

Browse files
Add Unit Test
1 parent bac0591 commit e17ee36

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

search/searcher/search_disjunction_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package searcher
1616

1717
import (
1818
"context"
19+
"os"
1920
"testing"
2021

2122
"github.com/blevesearch/bleve/v2/search"
@@ -221,3 +222,135 @@ func TestDisjunctionSearchTooMany(t *testing.T) {
221222
t.Fatal(err)
222223
}
223224
}
225+
226+
func TestUnadornedDisjunctionAdvance(t *testing.T) {
227+
dir, _ := os.MkdirTemp("", "scorchTwoDoc")
228+
defer func() {
229+
_ = os.RemoveAll(dir)
230+
}()
231+
twoDocIndex := initTwoDocScorch(dir)
232+
twoDocIndexReader, err := twoDocIndex.Reader()
233+
if err != nil {
234+
t.Fatal(err)
235+
}
236+
defer func() {
237+
err := twoDocIndexReader.Close()
238+
if err != nil {
239+
t.Fatal(err)
240+
}
241+
}()
242+
getNewOptimizedCompositeSearcher := func(t *testing.T) search.Searcher {
243+
optimizedCompositeSearcherOptions := search.SearcherOptions{Explain: false, IncludeTermVectors: false, Score: "none"}
244+
martyTermSearcher, err := NewTermSearcher(context.Background(), twoDocIndexReader, "marty", "name", 1.0, optimizedCompositeSearcherOptions)
245+
if err != nil {
246+
t.Fatal(err)
247+
}
248+
dustinTermSearcher, err := NewTermSearcher(context.Background(), twoDocIndexReader, "dustin", "name", 1.0, optimizedCompositeSearcherOptions)
249+
if err != nil {
250+
t.Fatal(err)
251+
}
252+
steveTermSearcher, err := NewTermSearcher(context.Background(), twoDocIndexReader, "steve", "name", 1.0, optimizedCompositeSearcherOptions)
253+
if err != nil {
254+
t.Fatal(err)
255+
}
256+
martyOrDustinOrSteveSearcher, err := NewDisjunctionSearcher(context.Background(), twoDocIndexReader, []search.Searcher{martyTermSearcher, dustinTermSearcher, steveTermSearcher}, 0, optimizedCompositeSearcherOptions)
257+
if err != nil {
258+
t.Fatal(err)
259+
}
260+
return martyOrDustinOrSteveSearcher
261+
}
262+
martyOrDustinOrSteveSearcher := getNewOptimizedCompositeSearcher(t)
263+
ctx := &search.SearchContext{
264+
DocumentMatchPool: search.NewDocumentMatchPool(martyOrDustinOrSteveSearcher.DocumentMatchPoolSize(), 0),
265+
}
266+
// get the correct order using only next calls
267+
dm, err := martyOrDustinOrSteveSearcher.Next(ctx)
268+
if err != nil {
269+
t.Fatal(err)
270+
}
271+
expectedDocIDs := []index.IndexInternalID{}
272+
for dm != nil && err == nil {
273+
expectedDocIDs = append(expectedDocIDs, dm.IndexInternalID)
274+
dm, err = martyOrDustinOrSteveSearcher.Next(ctx)
275+
}
276+
if err != nil {
277+
t.Fatal(err)
278+
}
279+
if len(expectedDocIDs) != 3 {
280+
t.Fatalf("expected 3 results, got %d", len(expectedDocIDs))
281+
}
282+
// Test 1 - Advance in reverse direction after getting the correct order using only next calls
283+
// Next(->) - Next(->) - Next(->) - Advance(<-) - Advance(<-)
284+
for i := len(expectedDocIDs) - 1; i >= 0; i-- {
285+
xID := expectedDocIDs[i]
286+
dm, err = martyOrDustinOrSteveSearcher.Advance(ctx, xID)
287+
if err != nil {
288+
t.Fatal(err)
289+
}
290+
if dm == nil {
291+
t.Fatalf("expected to find %v", xID)
292+
}
293+
if !dm.IndexInternalID.Equals(xID) {
294+
t.Fatalf("expected %v, got %v", xID, dm.IndexInternalID)
295+
}
296+
}
297+
// Test 2 - Advance in forward direction after getting the correct order using only next calls
298+
// Next(->) - Next(->) - Next(->) - Advance(ResetTo0) - Advance(->) - Advance(->)
299+
martyOrDustinOrSteveSearcher = getNewOptimizedCompositeSearcher(t)
300+
for i := 0; i < len(expectedDocIDs); i++ {
301+
xID := expectedDocIDs[i]
302+
dm, err = martyOrDustinOrSteveSearcher.Advance(ctx, xID)
303+
if err != nil {
304+
t.Fatal(err)
305+
}
306+
if dm == nil {
307+
t.Fatalf("expected to find %v", xID)
308+
}
309+
if !dm.IndexInternalID.Equals(xID) {
310+
t.Fatalf("expected %v, got %v", xID, dm.IndexInternalID)
311+
}
312+
}
313+
// Test 3 - Alternate Next and Advance calls
314+
// Next(->) -> Next(->) -> Advance(<-) -> Next(->) -> Next(->) -> Advance(<-) -> Advance(<-) -> Next(->)
315+
martyOrDustinOrSteveSearcher = getNewOptimizedCompositeSearcher(t)
316+
goNext := func(expectedDocID index.IndexInternalID) {
317+
dm, err = martyOrDustinOrSteveSearcher.Next(ctx)
318+
if err != nil {
319+
t.Fatal(err)
320+
}
321+
if dm == nil {
322+
t.Fatal("expected a document, got nil")
323+
}
324+
if !dm.IndexInternalID.Equals(expectedDocID) {
325+
t.Fatalf("expected %v, got %v", expectedDocID, dm.IndexInternalID)
326+
}
327+
}
328+
goBack := func(goTo index.IndexInternalID) {
329+
dm, err = martyOrDustinOrSteveSearcher.Advance(ctx, goTo)
330+
if err != nil {
331+
t.Fatal(err)
332+
}
333+
if dm == nil {
334+
t.Fatalf("expected to find %v", goTo)
335+
}
336+
if !dm.IndexInternalID.Equals(goTo) {
337+
t.Fatalf("expected %v, got %v", goTo, dm.IndexInternalID)
338+
}
339+
}
340+
// Next (->)
341+
goNext(expectedDocIDs[0])
342+
// Next (->)
343+
goNext(expectedDocIDs[1])
344+
// Advance (<-)
345+
goBack(expectedDocIDs[0])
346+
// Next (->)
347+
goNext(expectedDocIDs[1])
348+
// Next (->)
349+
goNext(expectedDocIDs[2])
350+
// Advance (<-)
351+
goBack(expectedDocIDs[1])
352+
// Advance (<-)
353+
goBack(expectedDocIDs[0])
354+
// Next (->)
355+
goNext(expectedDocIDs[1])
356+
}

0 commit comments

Comments
 (0)