1111
1212import org .apache .lucene .search .TotalHits ;
1313import org .elasticsearch .action .ActionListener ;
14+ import org .elasticsearch .common .Strings ;
15+ import org .elasticsearch .common .bytes .BytesArray ;
1416import org .elasticsearch .common .document .DocumentField ;
17+ import org .elasticsearch .common .util .concurrent .AtomicArray ;
1518import org .elasticsearch .index .query .BoolQueryBuilder ;
1619import org .elasticsearch .index .query .InnerHitBuilder ;
1720import org .elasticsearch .index .query .QueryBuilder ;
1821import org .elasticsearch .index .query .QueryBuilders ;
1922import org .elasticsearch .search .AbstractSearchTestCase ;
2023import org .elasticsearch .search .SearchHit ;
2124import org .elasticsearch .search .SearchHits ;
25+ import org .elasticsearch .search .builder .PointInTimeBuilder ;
2226import org .elasticsearch .search .builder .SearchSourceBuilder ;
2327import org .elasticsearch .search .collapse .CollapseBuilder ;
2428import org .elasticsearch .test .ESTestCase ;
@@ -317,14 +321,12 @@ public void testExpandRequestOptions() throws IOException {
317321 @ Override
318322 void sendExecuteMultiSearch (MultiSearchRequest request , SearchTask task , ActionListener <MultiSearchResponse > listener ) {
319323 final QueryBuilder postFilter = QueryBuilders .existsQuery ("foo" );
320- assertTrue (request .requests ().stream ().allMatch ((r ) -> "foo " .equals (r .preference ())));
324+ assertTrue (request .requests ().stream ().allMatch ((r ) -> "foobar " .equals (r .preference ())));
321325 assertTrue (request .requests ().stream ().allMatch ((r ) -> "baz" .equals (r .routing ())));
322326 assertTrue (request .requests ().stream ().allMatch ((r ) -> version == r .source ().version ()));
323327 assertTrue (request .requests ().stream ().allMatch ((r ) -> seqNoAndTerm == r .source ().seqNoAndPrimaryTerm ()));
324328 assertTrue (request .requests ().stream ().allMatch ((r ) -> postFilter .equals (r .source ().postFilter ())));
325- assertTrue (request .requests ().stream ().allMatch ((r ) -> r .source ().fetchSource ().fetchSource () == false ));
326- assertTrue (request .requests ().stream ().allMatch ((r ) -> r .source ().fetchSource ().includes ().length == 0 ));
327- assertTrue (request .requests ().stream ().allMatch ((r ) -> r .source ().fetchSource ().excludes ().length == 0 ));
329+ assertTrue (request .requests ().stream ().allMatch ((r ) -> r .source ().fetchSource () == null ));
328330 }
329331 };
330332 mockSearchPhaseContext .getRequest ()
@@ -338,17 +340,72 @@ void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionL
338340 .preference ("foobar" )
339341 .routing ("baz" );
340342
341- SearchHits hits = SearchHits .empty (new TotalHits (1 , TotalHits .Relation .EQUAL_TO ), 1.0f );
342- ExpandSearchPhase phase = new ExpandSearchPhase (mockSearchPhaseContext , hits , () -> new SearchPhase ("test" ) {
343+ SearchHit hit = new SearchHit (1 , "ID" );
344+ hit .setDocumentField ("someField" , new DocumentField ("someField" , Collections .singletonList ("foo" )));
345+ SearchHits hits = new SearchHits (new SearchHit [] { hit }, new TotalHits (1 , TotalHits .Relation .EQUAL_TO ), 1.0F );
346+ try {
347+ ExpandSearchPhase phase = new ExpandSearchPhase (mockSearchPhaseContext , hits , () -> new SearchPhase ("test" ) {
348+ @ Override
349+ public void run () {
350+ mockSearchPhaseContext .sendSearchResponse (new SearchResponseSections (hits , null , null , false , null , null , 1 ), null );
351+ }
352+ });
353+ phase .run ();
354+ mockSearchPhaseContext .assertNoFailure ();
355+ } finally {
356+ hits .decRef ();
357+ }
358+ } finally {
359+ var resp = mockSearchPhaseContext .searchResponse .get ();
360+ if (resp != null ) {
361+ resp .decRef ();
362+ }
363+ }
364+ }
365+
366+ public void testExpandSearchRespectsOriginalPIT () {
367+ MockSearchPhaseContext mockSearchPhaseContext = new MockSearchPhaseContext (1 );
368+ final PointInTimeBuilder pit = new PointInTimeBuilder (new BytesArray ("foo" ));
369+ try {
370+ boolean version = randomBoolean ();
371+ final boolean seqNoAndTerm = randomBoolean ();
372+
373+ mockSearchPhaseContext .searchTransport = new SearchTransportService (null , null , null ) {
343374 @ Override
344- public void run () {
345- mockSearchPhaseContext .sendSearchResponse (new SearchResponseSections (hits , null , null , false , null , null , 1 ), null );
375+ void sendExecuteMultiSearch (MultiSearchRequest request , SearchTask task , ActionListener <MultiSearchResponse > listener ) {
376+ assertTrue (request .requests ().stream ().allMatch ((r ) -> r .preference () == null ));
377+ assertTrue (request .requests ().stream ().allMatch ((r ) -> r .indices () == Strings .EMPTY_ARRAY ));
378+ assertTrue (request .requests ().stream ().allMatch ((r ) -> r .source ().pointInTimeBuilder ().equals (pit )));
346379 }
347- });
348- phase .run ();
349- mockSearchPhaseContext .assertNoFailure ();
350- assertNotNull (mockSearchPhaseContext .searchResponse .get ());
351- mockSearchPhaseContext .execute (() -> {});
380+ };
381+ mockSearchPhaseContext .getRequest ()
382+ .source (
383+ new SearchSourceBuilder ().collapse (
384+ new CollapseBuilder ("someField" ).setInnerHits (
385+ new InnerHitBuilder ().setName ("foobarbaz" ).setVersion (version ).setSeqNoAndPrimaryTerm (seqNoAndTerm )
386+ )
387+ ).fetchSource (false ).postFilter (QueryBuilders .existsQuery ("foo" )).pointInTimeBuilder (pit )
388+ )
389+ .routing ("baz" );
390+
391+ SearchHit hit = new SearchHit (1 , "ID" );
392+ hit .setDocumentField ("someField" , new DocumentField ("someField" , Collections .singletonList ("foo" )));
393+ SearchHits hits = new SearchHits (new SearchHit [] { hit }, new TotalHits (1 , TotalHits .Relation .EQUAL_TO ), 1.0F );
394+ try {
395+ ExpandSearchPhase phase = new ExpandSearchPhase (mockSearchPhaseContext , hits , () -> new SearchPhase ("test" ) {
396+ @ Override
397+ public void run () {
398+ mockSearchPhaseContext .sendSearchResponse (
399+ new SearchResponseSections (hits , null , null , false , null , null , 1 ),
400+ new AtomicArray <>(0 )
401+ );
402+ }
403+ });
404+ phase .run ();
405+ mockSearchPhaseContext .assertNoFailure ();
406+ } finally {
407+ hits .decRef ();
408+ }
352409 } finally {
353410 var resp = mockSearchPhaseContext .searchResponse .get ();
354411 if (resp != null ) {
0 commit comments