@@ -97,83 +97,75 @@ static final class JoinFieldInnerHitSubContext extends InnerHitsContext.InnerHit
9797 }
9898
9999 @ Override
100- public TopDocsAndMaxScore [] topDocs (SearchHit [] hits ) throws IOException {
101- Weight innerHitQueryWeight = createInnerHitQueryWeight ();
102- TopDocsAndMaxScore [] result = new TopDocsAndMaxScore [hits .length ];
103- for (int i = 0 ; i < hits .length ; i ++) {
104- SearchHit hit = hits [i ];
105- String joinName = getSortedDocValue (joinFieldMapper .name (), context , hit .docId ());
106- if (joinName == null ) {
107- result [i ] = new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
108- continue ;
109- }
100+ public TopDocsAndMaxScore topDocs (SearchHit hit ) throws IOException {
101+ Weight innerHitQueryWeight = getInnerHitQueryWeight ();
102+ String joinName = getSortedDocValue (joinFieldMapper .name (), context , hit .docId ());
103+ if (joinName == null ) {
104+ return new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
105+ }
110106
111- QueryShardContext qsc = context .getQueryShardContext ();
112- ParentIdFieldMapper parentIdFieldMapper =
113- joinFieldMapper .getParentIdFieldMapper (typeName , fetchChildInnerHits == false );
114- if (parentIdFieldMapper == null ) {
115- result [i ] = new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
116- continue ;
117- }
107+ QueryShardContext qsc = context .getQueryShardContext ();
108+ ParentIdFieldMapper parentIdFieldMapper =
109+ joinFieldMapper .getParentIdFieldMapper (typeName , fetchChildInnerHits == false );
110+ if (parentIdFieldMapper == null ) {
111+ return new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
112+ }
118113
119- Query q ;
120- if (fetchChildInnerHits ) {
121- Query hitQuery = parentIdFieldMapper .fieldType ().termQuery (hit .getId (), qsc );
122- q = new BooleanQuery .Builder ()
123- // Only include child documents that have the current hit as parent:
124- .add (hitQuery , BooleanClause .Occur .FILTER )
125- // and only include child documents of a single relation:
126- .add (joinFieldMapper .fieldType ().termQuery (typeName , qsc ), BooleanClause .Occur .FILTER )
127- .build ();
128- } else {
129- String parentId = getSortedDocValue (parentIdFieldMapper .name (), context , hit .docId ());
130- if (parentId == null ) {
131- result [i ] = new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
132- continue ;
133- }
134- q = context .mapperService ().fieldType (IdFieldMapper .NAME ).termQuery (parentId , qsc );
114+ Query q ;
115+ if (fetchChildInnerHits ) {
116+ Query hitQuery = parentIdFieldMapper .fieldType ().termQuery (hit .getId (), qsc );
117+ q = new BooleanQuery .Builder ()
118+ // Only include child documents that have the current hit as parent:
119+ .add (hitQuery , BooleanClause .Occur .FILTER )
120+ // and only include child documents of a single relation:
121+ .add (joinFieldMapper .fieldType ().termQuery (typeName , qsc ), BooleanClause .Occur .FILTER )
122+ .build ();
123+ } else {
124+ String parentId = getSortedDocValue (parentIdFieldMapper .name (), context , hit .docId ());
125+ if (parentId == null ) {
126+ return new TopDocsAndMaxScore (Lucene .EMPTY_TOP_DOCS , Float .NaN );
135127 }
128+ q = context .mapperService ().fieldType (IdFieldMapper .NAME ).termQuery (parentId , qsc );
129+ }
136130
137- Weight weight = context .searcher ().createWeight (context .searcher ().rewrite (q ), ScoreMode .COMPLETE_NO_SCORES , 1f );
138- if (size () == 0 ) {
139- TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector ();
140- for (LeafReaderContext ctx : context .searcher ().getIndexReader ().leaves ()) {
141- intersect (weight , innerHitQueryWeight , totalHitCountCollector , ctx );
142- }
143- result [i ] = new TopDocsAndMaxScore (
144- new TopDocs (
145- new TotalHits (totalHitCountCollector .getTotalHits (), TotalHits .Relation .EQUAL_TO ),
146- Lucene .EMPTY_SCORE_DOCS
147- ), Float .NaN );
148- } else {
149- int topN = Math .min (from () + size (), context .searcher ().getIndexReader ().maxDoc ());
150- TopDocsCollector <?> topDocsCollector ;
151- MaxScoreCollector maxScoreCollector = null ;
152- if (sort () != null ) {
153- topDocsCollector = TopFieldCollector .create (sort ().sort , topN , Integer .MAX_VALUE );
154- if (trackScores ()) {
155- maxScoreCollector = new MaxScoreCollector ();
156- }
157- } else {
158- topDocsCollector = TopScoreDocCollector .create (topN , Integer .MAX_VALUE );
131+ Weight weight = context .searcher ().createWeight (context .searcher ().rewrite (q ), ScoreMode .COMPLETE_NO_SCORES , 1f );
132+ if (size () == 0 ) {
133+ TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector ();
134+ for (LeafReaderContext ctx : context .searcher ().getIndexReader ().leaves ()) {
135+ intersect (weight , innerHitQueryWeight , totalHitCountCollector , ctx );
136+ }
137+ return new TopDocsAndMaxScore (
138+ new TopDocs (
139+ new TotalHits (totalHitCountCollector .getTotalHits (), TotalHits .Relation .EQUAL_TO ),
140+ Lucene .EMPTY_SCORE_DOCS
141+ ), Float .NaN );
142+ } else {
143+ int topN = Math .min (from () + size (), context .searcher ().getIndexReader ().maxDoc ());
144+ TopDocsCollector <?> topDocsCollector ;
145+ MaxScoreCollector maxScoreCollector = null ;
146+ if (sort () != null ) {
147+ topDocsCollector = TopFieldCollector .create (sort ().sort , topN , Integer .MAX_VALUE );
148+ if (trackScores ()) {
159149 maxScoreCollector = new MaxScoreCollector ();
160150 }
161- try {
162- for (LeafReaderContext ctx : context .searcher ().getIndexReader ().leaves ()) {
163- intersect (weight , innerHitQueryWeight , MultiCollector .wrap (topDocsCollector , maxScoreCollector ), ctx );
164- }
165- } finally {
166- clearReleasables (Lifetime .COLLECTION );
167- }
168- TopDocs topDocs = topDocsCollector .topDocs (from (), size ());
169- float maxScore = Float .NaN ;
170- if (maxScoreCollector != null ) {
171- maxScore = maxScoreCollector .getMaxScore ();
151+ } else {
152+ topDocsCollector = TopScoreDocCollector .create (topN , Integer .MAX_VALUE );
153+ maxScoreCollector = new MaxScoreCollector ();
154+ }
155+ try {
156+ for (LeafReaderContext ctx : context .searcher ().getIndexReader ().leaves ()) {
157+ intersect (weight , innerHitQueryWeight , MultiCollector .wrap (topDocsCollector , maxScoreCollector ), ctx );
172158 }
173- result [i ] = new TopDocsAndMaxScore (topDocs , maxScore );
159+ } finally {
160+ clearReleasables (Lifetime .COLLECTION );
161+ }
162+ TopDocs topDocs = topDocsCollector .topDocs (from (), size ());
163+ float maxScore = Float .NaN ;
164+ if (maxScoreCollector != null ) {
165+ maxScore = maxScoreCollector .getMaxScore ();
174166 }
167+ return new TopDocsAndMaxScore (topDocs , maxScore );
175168 }
176- return result ;
177169 }
178170
179171 private String getSortedDocValue (String field , SearchContext context , int docId ) {
0 commit comments