@@ -16,6 +16,7 @@ package searcher
1616
1717import (
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