@@ -287,95 +287,6 @@ public void sendExecuteRankFeature(
287287        }
288288    }
289289
290-     public  void  testRankFeaturePhaseNoNeedForFetchingFieldData () {
291-         AtomicBoolean  phaseDone  = new  AtomicBoolean (false );
292-         final  ScoreDoc [][] finalResults  = new  ScoreDoc [1 ][1 ];
293- 
294-         // build the appropriate RankBuilder; using a null rankFeaturePhaseRankShardContext 
295-         // and non-field based rankFeaturePhaseRankCoordinatorContext 
296-         RankBuilder  rankBuilder  = rankBuilder (
297-             DEFAULT_RANK_WINDOW_SIZE ,
298-             defaultQueryPhaseRankShardContext (Collections .emptyList (), DEFAULT_RANK_WINDOW_SIZE ),
299-             negatingScoresQueryFeaturePhaseRankCoordinatorContext (DEFAULT_SIZE , DEFAULT_FROM , DEFAULT_RANK_WINDOW_SIZE ),
300-             null ,
301-             null 
302-         );
303-         // create a SearchSource to attach to the request 
304-         SearchSourceBuilder  searchSourceBuilder  = searchSourceWithRankBuilder (rankBuilder );
305- 
306-         SearchPhaseController  controller  = searchPhaseController ();
307-         SearchShardTarget  shard1Target  = new  SearchShardTarget ("node0" , new  ShardId ("test" , "na" , 0 ), null );
308- 
309-         MockSearchPhaseContext  mockSearchPhaseContext  = new  MockSearchPhaseContext (1 );
310-         mockSearchPhaseContext .getRequest ().source (searchSourceBuilder );
311-         try  (SearchPhaseResults <SearchPhaseResult > results  = searchPhaseResults (controller , mockSearchPhaseContext )) {
312-             // generate the QuerySearchResults that the RankFeaturePhase would have received from QueryPhase 
313-             // here we have 2 results, with doc ids 1 and 2 
314-             final  ShardSearchContextId  ctx  = new  ShardSearchContextId (UUIDs .base64UUID (), 123 );
315-             QuerySearchResult  queryResult  = new  QuerySearchResult (ctx , shard1Target , null );
316- 
317-             try  {
318-                 queryResult .setShardIndex (shard1Target .getShardId ().getId ());
319-                 int  totalHits  = randomIntBetween (2 , 100 );
320-                 final  ScoreDoc [] shard1Docs  = new  ScoreDoc [] { new  ScoreDoc (1 , 10.0F ), new  ScoreDoc (2 , 9.0F ) };
321-                 populateQuerySearchResult (queryResult , totalHits , shard1Docs );
322-                 results .consumeResult (queryResult , () -> {});
323-                 // do not make an actual http request, but rather generate the response 
324-                 // as if we would have read it from the RankFeatureShardPhase 
325-                 mockSearchPhaseContext .searchTransport  = new  SearchTransportService (null , null , null ) {
326-                     @ Override 
327-                     public  void  sendExecuteRankFeature (
328-                         Transport .Connection  connection ,
329-                         final  RankFeatureShardRequest  request ,
330-                         SearchTask  task ,
331-                         final  ActionListener <RankFeatureResult > listener 
332-                     ) {
333-                         // make sure to match the context id generated above, otherwise we throw 
334-                         if  (request .contextId ().getId () == 123  && Arrays .equals (request .getDocIds (), new  int [] { 1 , 2  })) {
335-                             listener .onFailure (new  UnsupportedOperationException ("should not have reached here" ));
336-                         } else  {
337-                             listener .onFailure (new  MockDirectoryWrapper .FakeIOException ());
338-                         }
339-                     }
340-                 };
341-             } finally  {
342-                 queryResult .decRef ();
343-             }
344-             // override the RankFeaturePhase to skip moving to next phase 
345-             RankFeaturePhase  rankFeaturePhase  = rankFeaturePhase (results , mockSearchPhaseContext , finalResults , phaseDone );
346-             try  {
347-                 rankFeaturePhase .run ();
348-                 mockSearchPhaseContext .assertNoFailure ();
349-                 assertTrue (mockSearchPhaseContext .failures .isEmpty ());
350-                 assertTrue (phaseDone .get ());
351- 
352-                 // in this case there was no additional "RankFeature" results on shards, so we shortcut directly to queryPhaseResults 
353-                 SearchPhaseResults <SearchPhaseResult > rankPhaseResults  = rankFeaturePhase .queryPhaseResults ;
354-                 assertNotNull (rankPhaseResults .getAtomicArray ());
355-                 assertEquals (1 , rankPhaseResults .getAtomicArray ().length ());
356-                 assertEquals (1 , rankPhaseResults .getSuccessfulResults ().count ());
357- 
358-                 SearchPhaseResult  shardResult  = rankPhaseResults .getAtomicArray ().get (0 );
359-                 assertTrue (shardResult  instanceof  QuerySearchResult );
360-                 QuerySearchResult  rankResult  = (QuerySearchResult ) shardResult ;
361-                 assertNull (rankResult .rankFeatureResult ());
362-                 assertNotNull (rankResult .queryResult ());
363- 
364-                 List <ExpectedRankFeatureDoc > expectedFinalResults  = List .of (
365-                     new  ExpectedRankFeatureDoc (2 , 1 , -9.0F , null ),
366-                     new  ExpectedRankFeatureDoc (1 , 2 , -10.0F , null )
367-                 );
368-                 assertFinalResults (finalResults [0 ], expectedFinalResults );
369-             } finally  {
370-                 rankFeaturePhase .rankPhaseResults .close ();
371-             }
372-         } finally  {
373-             if  (mockSearchPhaseContext .searchResponse .get () != null ) {
374-                 mockSearchPhaseContext .searchResponse .get ().decRef ();
375-             }
376-         }
377-     }
378- 
379290    public  void  testRankFeaturePhaseOneShardFails () {
380291        AtomicBoolean  phaseDone  = new  AtomicBoolean (false );
381292        final  ScoreDoc [][] finalResults  = new  ScoreDoc [1 ][1 ];
@@ -534,7 +445,12 @@ public void sendExecuteRankFeature(
534445                queryResult .decRef ();
535446            }
536447            // override the RankFeaturePhase to raise an exception 
537-             RankFeaturePhase  rankFeaturePhase  = new  RankFeaturePhase (results , null , mockSearchPhaseContext , null ) {
448+             RankFeaturePhase  rankFeaturePhase  = new  RankFeaturePhase (
449+                 results ,
450+                 null ,
451+                 mockSearchPhaseContext ,
452+                 defaultRankFeaturePhaseRankCoordinatorContext (DEFAULT_SIZE , DEFAULT_FROM , DEFAULT_RANK_WINDOW_SIZE )
453+             ) {
538454                @ Override 
539455                void  innerRun (RankFeaturePhaseRankCoordinatorContext  rankFeaturePhaseRankCoordinatorContext ) {
540456                    throw  new  IllegalArgumentException ("simulated failure" );
@@ -890,36 +806,6 @@ public RankFeatureDoc[] rankAndPaginate(RankFeatureDoc[] rankFeatureDocs) {
890806        };
891807    }
892808
893-     private  QueryPhaseRankCoordinatorContext  negatingScoresQueryFeaturePhaseRankCoordinatorContext (int  size , int  from , int  rankWindowSize ) {
894-         return  new  QueryPhaseRankCoordinatorContext (rankWindowSize ) {
895-             @ Override 
896-             public  ScoreDoc [] rankQueryPhaseResults (
897-                 List <QuerySearchResult > rankSearchResults ,
898-                 SearchPhaseController .TopDocsStats  topDocsStats 
899-             ) {
900-                 List <ScoreDoc > docScores  = new  ArrayList <>();
901-                 for  (QuerySearchResult  phaseResults  : rankSearchResults ) {
902-                     docScores .addAll (Arrays .asList (phaseResults .topDocs ().topDocs .scoreDocs ));
903-                 }
904-                 ScoreDoc [] sortedDocs  = docScores .toArray (new  ScoreDoc [0 ]);
905-                 // negating scores 
906-                 Arrays .stream (sortedDocs ).forEach (doc  -> doc .score  *= -1 );
907- 
908-                 Arrays .sort (sortedDocs , Comparator .comparing ((ScoreDoc  doc ) -> doc .score ).reversed ());
909-                 sortedDocs  = Arrays .stream (sortedDocs ).limit (rankWindowSize ).toArray (ScoreDoc []::new );
910-                 RankFeatureDoc [] topResults  = new  RankFeatureDoc [Math .max (0 , Math .min (size , sortedDocs .length  - from ))];
911-                 // perform pagination 
912-                 for  (int  rank  = 0 ; rank  < topResults .length ; ++rank ) {
913-                     ScoreDoc  base  = sortedDocs [from  + rank ];
914-                     topResults [rank ] = new  RankFeatureDoc (base .doc , base .score , base .shardIndex );
915-                     topResults [rank ].rank  = from  + rank  + 1 ;
916-                 }
917-                 topDocsStats .fetchHits  = topResults .length ;
918-                 return  topResults ;
919-             }
920-         };
921-     }
922- 
923809    private  RankFeaturePhaseRankShardContext  defaultRankFeaturePhaseRankShardContext (String  field ) {
924810        return  new  RankFeaturePhaseRankShardContext (field ) {
925811            @ Override 
@@ -1134,7 +1020,12 @@ private RankFeaturePhase rankFeaturePhase(
11341020        AtomicBoolean  phaseDone 
11351021    ) {
11361022        // override the RankFeaturePhase to skip moving to next phase 
1137-         return  new  RankFeaturePhase (results , null , mockSearchPhaseContext , null ) {
1023+         return  new  RankFeaturePhase (
1024+             results ,
1025+             null ,
1026+             mockSearchPhaseContext ,
1027+             RankFeaturePhase .coordinatorContext (mockSearchPhaseContext .getRequest ().source (), null )
1028+         ) {
11381029            @ Override 
11391030            public  void  moveToNextPhase (
11401031                SearchPhaseResults <SearchPhaseResult > phaseResults ,
0 commit comments