|
60 | 60 | import java.util.HashMap;
|
61 | 61 | import java.util.List;
|
62 | 62 | import java.util.Map;
|
| 63 | +import java.util.Objects; |
63 | 64 | import java.util.concurrent.Executor;
|
64 | 65 | import java.util.function.BiFunction;
|
65 | 66 | import java.util.function.Consumer;
|
@@ -140,24 +141,26 @@ static SortedTopDocs sortDocs(
|
140 | 141 | }
|
141 | 142 |
|
142 | 143 | static TopDocs mergeTopDocs(List<TopDocs> results, int topN, int from) {
|
143 |
| - if (results.isEmpty()) { |
| 144 | + List<TopDocs> topDocsList = results.stream().filter(Objects::nonNull).toList(); |
| 145 | + if (topDocsList.isEmpty()) { |
144 | 146 | return null;
|
145 | 147 | }
|
146 |
| - final TopDocs topDocs = results.getFirst(); |
147 |
| - final TopDocs mergedTopDocs; |
148 |
| - final int numShards = results.size(); |
| 148 | + final TopDocs topDocs = topDocsList.getFirst(); |
| 149 | + final int numShards = topDocsList.size(); |
149 | 150 | if (numShards == 1 && from == 0) { // only one shard and no pagination we can just return the topDocs as we got them.
|
150 | 151 | return topDocs;
|
151 |
| - } else if (topDocs instanceof TopFieldGroups firstTopDocs) { |
| 152 | + } |
| 153 | + final TopDocs mergedTopDocs; |
| 154 | + if (topDocs instanceof TopFieldGroups firstTopDocs) { |
152 | 155 | final Sort sort = new Sort(firstTopDocs.fields);
|
153 |
| - final TopFieldGroups[] shardTopDocs = results.stream().filter(td -> td != Lucene.EMPTY_TOP_DOCS).toArray(TopFieldGroups[]::new); |
| 156 | + TopFieldGroups[] shardTopDocs = topDocsList.toArray(new TopFieldGroups[0]); |
154 | 157 | mergedTopDocs = TopFieldGroups.merge(sort, from, topN, shardTopDocs, false);
|
155 | 158 | } else if (topDocs instanceof TopFieldDocs firstTopDocs) {
|
156 |
| - final Sort sort = checkSameSortTypes(results, firstTopDocs.fields); |
157 |
| - final TopFieldDocs[] shardTopDocs = results.stream().filter((td -> td != Lucene.EMPTY_TOP_DOCS)).toArray(TopFieldDocs[]::new); |
| 159 | + TopFieldDocs[] shardTopDocs = topDocsList.toArray(new TopFieldDocs[0]); |
| 160 | + final Sort sort = checkSameSortTypes(topDocsList, firstTopDocs.fields); |
158 | 161 | mergedTopDocs = TopDocs.merge(sort, from, topN, shardTopDocs);
|
159 | 162 | } else {
|
160 |
| - final TopDocs[] shardTopDocs = results.toArray(new TopDocs[numShards]); |
| 163 | + final TopDocs[] shardTopDocs = topDocsList.toArray(new TopDocs[0]); |
161 | 164 | mergedTopDocs = TopDocs.merge(from, topN, shardTopDocs);
|
162 | 165 | }
|
163 | 166 | return mergedTopDocs;
|
|
0 commit comments