62
62
import org .elasticsearch .test .TestSearchContext ;
63
63
64
64
import java .io .IOException ;
65
+ import java .util .ArrayList ;
65
66
import java .util .List ;
66
67
import java .util .concurrent .atomic .AtomicBoolean ;
67
68
@@ -465,11 +466,11 @@ public void testIndexSortingEarlyTermination() throws Exception {
465
466
466
467
public void testIndexSortScrollOptimization () throws Exception {
467
468
Directory dir = newDirectory ();
468
- final Sort sort = new Sort (
469
+ final Sort indexSort = new Sort (
469
470
new SortField ("rank" , SortField .Type .INT ),
470
471
new SortField ("tiebreaker" , SortField .Type .INT )
471
472
);
472
- IndexWriterConfig iwc = newIndexWriterConfig ().setIndexSort (sort );
473
+ IndexWriterConfig iwc = newIndexWriterConfig ().setIndexSort (indexSort );
473
474
RandomIndexWriter w = new RandomIndexWriter (random (), dir , iwc );
474
475
final int numDocs = scaledRandomIntBetween (100 , 200 );
475
476
for (int i = 0 ; i < numDocs ; ++i ) {
@@ -483,44 +484,49 @@ public void testIndexSortScrollOptimization() throws Exception {
483
484
}
484
485
w .close ();
485
486
486
- TestSearchContext context = new TestSearchContext (null , indexShard );
487
- context .parsedQuery (new ParsedQuery (new MatchAllDocsQuery ()));
488
- ScrollContext scrollContext = new ScrollContext ();
489
- scrollContext .lastEmittedDoc = null ;
490
- scrollContext .maxScore = Float .NaN ;
491
- scrollContext .totalHits = -1 ;
492
- context .scrollContext (scrollContext );
493
- context .setTask (new SearchTask (123L , "" , "" , "" , null ));
494
- context .setSize (10 );
495
- context .sort (new SortAndFormats (sort , new DocValueFormat [] {DocValueFormat .RAW , DocValueFormat .RAW }));
496
-
497
487
final IndexReader reader = DirectoryReader .open (dir );
498
- IndexSearcher contextSearcher = new IndexSearcher (reader );
499
-
500
- QueryPhase .execute (context , contextSearcher , checkCancelled -> {}, sort );
501
- assertThat (context .queryResult ().topDocs ().totalHits , equalTo ((long ) numDocs ));
502
- assertNull (context .queryResult ().terminatedEarly ());
503
- assertThat (context .terminateAfter (), equalTo (0 ));
504
- assertThat (context .queryResult ().getTotalHits (), equalTo ((long ) numDocs ));
505
- int sizeMinus1 = context .queryResult ().topDocs ().scoreDocs .length - 1 ;
506
- FieldDoc lastDoc = (FieldDoc ) context .queryResult ().topDocs ().scoreDocs [sizeMinus1 ];
488
+ List <SortAndFormats > searchSortAndFormats = new ArrayList <>();
489
+ searchSortAndFormats .add (new SortAndFormats (indexSort , new DocValueFormat []{DocValueFormat .RAW , DocValueFormat .RAW }));
490
+ // search sort is a prefix of the index sort
491
+ searchSortAndFormats .add (new SortAndFormats (new Sort (indexSort .getSort ()[0 ]), new DocValueFormat []{DocValueFormat .RAW }));
492
+ for (SortAndFormats searchSortAndFormat : searchSortAndFormats ) {
493
+ IndexSearcher contextSearcher = new IndexSearcher (reader );
494
+ TestSearchContext context = new TestSearchContext (null , indexShard );
495
+ context .parsedQuery (new ParsedQuery (new MatchAllDocsQuery ()));
496
+ ScrollContext scrollContext = new ScrollContext ();
497
+ scrollContext .lastEmittedDoc = null ;
498
+ scrollContext .maxScore = Float .NaN ;
499
+ scrollContext .totalHits = -1 ;
500
+ context .scrollContext (scrollContext );
501
+ context .setTask (new SearchTask (123L , "" , "" , "" , null ));
502
+ context .setSize (10 );
503
+ context .sort (searchSortAndFormat );
504
+
505
+ QueryPhase .execute (context , contextSearcher , checkCancelled -> {}, searchSortAndFormat .sort );
506
+ assertThat (context .queryResult ().topDocs ().totalHits , equalTo ((long ) numDocs ));
507
+ assertNull (context .queryResult ().terminatedEarly ());
508
+ assertThat (context .terminateAfter (), equalTo (0 ));
509
+ assertThat (context .queryResult ().getTotalHits (), equalTo ((long ) numDocs ));
510
+ int sizeMinus1 = context .queryResult ().topDocs ().scoreDocs .length - 1 ;
511
+ FieldDoc lastDoc = (FieldDoc ) context .queryResult ().topDocs ().scoreDocs [sizeMinus1 ];
507
512
508
- contextSearcher = getAssertingEarlyTerminationSearcher (reader , 10 );
509
- QueryPhase .execute (context , contextSearcher , checkCancelled -> {}, sort );
510
- assertNull (context .queryResult ().terminatedEarly ());
511
- assertThat (context .queryResult ().topDocs ().totalHits , equalTo ((long ) numDocs ));
512
- assertThat (context .terminateAfter (), equalTo (0 ));
513
- assertThat (context .queryResult ().getTotalHits (), equalTo ((long ) numDocs ));
514
- FieldDoc firstDoc = (FieldDoc ) context .queryResult ().topDocs ().scoreDocs [0 ];
515
- for (int i = 0 ; i < sort .getSort ().length ; i ++) {
516
- @ SuppressWarnings ("unchecked" )
517
- FieldComparator <Object > comparator = (FieldComparator <Object >) sort .getSort ()[i ].getComparator (1 , i );
518
- int cmp = comparator .compareValues (firstDoc .fields [i ], lastDoc .fields [i ]);
519
- if (cmp == 0 ) {
520
- continue ;
513
+ contextSearcher = getAssertingEarlyTerminationSearcher (reader , 10 );
514
+ QueryPhase .execute (context , contextSearcher , checkCancelled -> {}, searchSortAndFormat .sort );
515
+ assertNull (context .queryResult ().terminatedEarly ());
516
+ assertThat (context .queryResult ().topDocs ().totalHits , equalTo ((long ) numDocs ));
517
+ assertThat (context .terminateAfter (), equalTo (0 ));
518
+ assertThat (context .queryResult ().getTotalHits (), equalTo ((long ) numDocs ));
519
+ FieldDoc firstDoc = (FieldDoc ) context .queryResult ().topDocs ().scoreDocs [0 ];
520
+ for (int i = 0 ; i < searchSortAndFormat .sort .getSort ().length ; i ++) {
521
+ @ SuppressWarnings ("unchecked" )
522
+ FieldComparator <Object > comparator = (FieldComparator <Object >) searchSortAndFormat .sort .getSort ()[i ].getComparator (1 , i );
523
+ int cmp = comparator .compareValues (firstDoc .fields [i ], lastDoc .fields [i ]);
524
+ if (cmp == 0 ) {
525
+ continue ;
526
+ }
527
+ assertThat (cmp , equalTo (1 ));
528
+ break ;
521
529
}
522
- assertThat (cmp , equalTo (1 ));
523
- break ;
524
530
}
525
531
reader .close ();
526
532
dir .close ();
0 commit comments