Skip to content

Commit 888e32b

Browse files
Introduce and use a few more empty response type constants to o.e.c.lucene.Lucene
Shortening a few more pieces of production code using constants, potentially saving a little in code size and allocation in some cases.
1 parent dbf388c commit 888e32b

File tree

13 files changed

+26
-37
lines changed

13 files changed

+26
-37
lines changed

server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.apache.lucene.search.ScoreDoc;
1111
import org.apache.lucene.search.join.ScoreMode;
12+
import org.elasticsearch.common.lucene.Lucene;
1213
import org.elasticsearch.index.query.NestedQueryBuilder;
1314
import org.elasticsearch.index.query.QueryBuilder;
1415
import org.elasticsearch.search.SearchPhaseResult;
@@ -152,7 +153,7 @@ ShardSearchRequest rewriteShardSearchRequest(ShardSearchRequest request) {
152153
scoreDocs.sort(Comparator.comparingInt(scoreDoc -> scoreDoc.doc));
153154
String nestedPath = dfsKnnResults.getNestedPath();
154155
QueryBuilder query = new KnnScoreDocQueryBuilder(
155-
scoreDocs.toArray(new ScoreDoc[0]),
156+
scoreDocs.toArray(Lucene.EMPTY_SCORE_DOCS),
156157
source.knnSearch().get(i).getField(),
157158
source.knnSearch().get(i).getQueryVector()
158159
).boost(source.knnSearch().get(i).boost()).queryName(source.knnSearch().get(i).queryName());

server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.lucene.util.SetOnce;
2525
import org.elasticsearch.common.breaker.CircuitBreaker;
2626
import org.elasticsearch.common.io.stream.DelayableWriteable;
27+
import org.elasticsearch.common.lucene.Lucene;
2728
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
2829
import org.elasticsearch.common.util.Maps;
2930
import org.elasticsearch.common.util.concurrent.AtomicArray;
@@ -66,7 +67,6 @@
6667
import static org.elasticsearch.search.SearchService.DEFAULT_SIZE;
6768

6869
public final class SearchPhaseController {
69-
private static final ScoreDoc[] EMPTY_DOCS = new ScoreDoc[0];
7070

7171
private final BiFunction<
7272
Supplier<Boolean>,
@@ -195,7 +195,7 @@ static SortedTopDocs sortDocs(
195195
return SortedTopDocs.EMPTY;
196196
}
197197
final TopDocs mergedTopDocs = mergeTopDocs(topDocs, size, ignoreFrom ? 0 : from);
198-
final ScoreDoc[] mergedScoreDocs = mergedTopDocs == null ? EMPTY_DOCS : mergedTopDocs.scoreDocs;
198+
final ScoreDoc[] mergedScoreDocs = mergedTopDocs == null ? Lucene.EMPTY_SCORE_DOCS : mergedTopDocs.scoreDocs;
199199
ScoreDoc[] scoreDocs = mergedScoreDocs;
200200
int numSuggestDocs = 0;
201201
if (reducedCompletionSuggestions.isEmpty() == false) {
@@ -907,6 +907,6 @@ public record SortedTopDocs(
907907
Object[] collapseValues,
908908
int numberOfCompletionsSuggestions
909909
) {
910-
public static final SortedTopDocs EMPTY = new SortedTopDocs(EMPTY_DOCS, false, null, null, null, 0);
910+
public static final SortedTopDocs EMPTY = new SortedTopDocs(Lucene.EMPTY_SCORE_DOCS, false, null, null, null, 0);
911911
}
912912
}

server/src/main/java/org/elasticsearch/action/search/SearchResponse.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
package org.elasticsearch.action.search;
1010

11-
import org.apache.lucene.search.TotalHits;
1211
import org.elasticsearch.TransportVersions;
1312
import org.elasticsearch.action.ActionResponse;
1413
import org.elasticsearch.action.OriginalIndices;
@@ -18,6 +17,7 @@
1817
import org.elasticsearch.common.io.stream.StreamInput;
1918
import org.elasticsearch.common.io.stream.StreamOutput;
2019
import org.elasticsearch.common.io.stream.Writeable;
20+
import org.elasticsearch.common.lucene.Lucene;
2121
import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
2222
import org.elasticsearch.common.xcontent.ChunkedToXContentHelper;
2323
import org.elasticsearch.common.xcontent.ChunkedToXContentObject;
@@ -1154,7 +1154,7 @@ public String toString() {
11541154
// public for tests
11551155
public static SearchResponse empty(Supplier<Long> tookInMillisSupplier, Clusters clusters) {
11561156
return new SearchResponse(
1157-
SearchHits.empty(new TotalHits(0L, TotalHits.Relation.EQUAL_TO), Float.NaN),
1157+
SearchHits.empty(Lucene.TOTAL_HITS_EQUAL_TO_ZERO, Float.NaN),
11581158
InternalAggregations.EMPTY,
11591159
null,
11601160
false,

server/src/main/java/org/elasticsearch/action/search/SearchResponseMerger.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.action.search.SearchPhaseController.TopDocsStats;
1919
import org.elasticsearch.action.search.SearchResponse.Clusters;
2020
import org.elasticsearch.action.search.TransportSearchAction.SearchTimeProvider;
21+
import org.elasticsearch.common.lucene.Lucene;
2122
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
2223
import org.elasticsearch.core.Releasable;
2324
import org.elasticsearch.index.shard.ShardId;
@@ -177,7 +178,7 @@ public SearchResponse getMergedResponse(Clusters clusters) {
177178
final TotalHits totalHits;
178179
if (searchHits.getTotalHits() == null) {
179180
// in case we didn't track total hits, we get null from each cluster, but we need to set 0 eq to the TopDocs
180-
totalHits = new TotalHits(0, TotalHits.Relation.EQUAL_TO);
181+
totalHits = Lucene.TOTAL_HITS_EQUAL_TO_ZERO;
181182
assert trackTotalHits == null || trackTotalHits == false;
182183
trackTotalHits = false;
183184
} else {

server/src/main/java/org/elasticsearch/common/lucene/Lucene.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ public class Lucene {
101101

102102
public static final ScoreDoc[] EMPTY_SCORE_DOCS = new ScoreDoc[0];
103103

104-
public static final TopDocs EMPTY_TOP_DOCS = new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), EMPTY_SCORE_DOCS);
104+
public static final TotalHits TOTAL_HITS_EQUAL_TO_ZERO = new TotalHits(0, TotalHits.Relation.EQUAL_TO);
105+
public static final TotalHits TOTAL_HITS_GREATER_OR_EQUAL_TO_ZERO = new TotalHits(0, TotalHits.Relation.GREATER_THAN_OR_EQUAL_TO);
106+
107+
public static final TopDocs EMPTY_TOP_DOCS = new TopDocs(TOTAL_HITS_EQUAL_TO_ZERO, EMPTY_SCORE_DOCS);
105108

106109
private Lucene() {}
107110

server/src/main/java/org/elasticsearch/lucene/grouping/SinglePassGroupingCollector.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.lucene.search.SortField;
3737
import org.apache.lucene.search.TotalHits;
3838
import org.apache.lucene.search.grouping.GroupSelector;
39+
import org.elasticsearch.common.lucene.Lucene;
3940
import org.elasticsearch.common.util.Maps;
4041
import org.elasticsearch.core.Nullable;
4142
import org.elasticsearch.index.mapper.MappedFieldType;
@@ -202,7 +203,7 @@ public TopFieldGroups getTopGroups(int groupOffset) throws IOException {
202203

203204
if (groupMap.size() <= groupOffset) {
204205
TotalHits totalHits = new TotalHits(totalHitCount, TotalHits.Relation.EQUAL_TO);
205-
return new TopFieldGroups(groupField, totalHits, new ScoreDoc[0], groupSort.getSort(), new Object[0]);
206+
return new TopFieldGroups(groupField, totalHits, Lucene.EMPTY_SCORE_DOCS, groupSort.getSort(), new Object[0]);
206207
}
207208

208209
if (orderedGroups == null) {

server/src/main/java/org/elasticsearch/lucene/grouping/TopFieldGroups.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.apache.lucene.search.TopFieldDocs;
1717
import org.apache.lucene.search.TotalHits;
1818
import org.apache.lucene.util.PriorityQueue;
19+
import org.elasticsearch.common.lucene.Lucene;
1920
import org.elasticsearch.common.util.CollectionUtils;
2021

2122
import java.util.ArrayList;
@@ -225,7 +226,7 @@ public static TopFieldGroups merge(Sort sort, int start, int size, TopFieldGroup
225226
queue.pop();
226227
}
227228
}
228-
hits = hitList.toArray(new ScoreDoc[0]);
229+
hits = hitList.toArray(Lucene.EMPTY_SCORE_DOCS);
229230
values = groupList.toArray(new Object[0]);
230231
}
231232
TotalHits totalHits = new TotalHits(totalHitCount, totalHitsRelation);

server/src/main/java/org/elasticsearch/search/SearchHits.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
public final class SearchHits implements Writeable, ChunkedToXContent, RefCounted, Iterable<SearchHit> {
3535

3636
public static final SearchHit[] EMPTY = new SearchHit[0];
37-
public static final SearchHits EMPTY_WITH_TOTAL_HITS = SearchHits.empty(new TotalHits(0, Relation.EQUAL_TO), 0);
37+
public static final SearchHits EMPTY_WITH_TOTAL_HITS = SearchHits.empty(Lucene.TOTAL_HITS_EQUAL_TO_ZERO, 0);
3838
public static final SearchHits EMPTY_WITHOUT_TOTAL_HITS = SearchHits.empty(null, 0);
3939

4040
private final SearchHit[] hits;

server/src/main/java/org/elasticsearch/search/aggregations/metrics/TopHitsAggregator.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.apache.lucene.search.TopFieldCollector;
2121
import org.apache.lucene.search.TopFieldDocs;
2222
import org.apache.lucene.search.TopScoreDocCollector;
23-
import org.apache.lucene.search.TotalHits;
2423
import org.elasticsearch.ElasticsearchException;
2524
import org.elasticsearch.action.search.MaxScoreCollector;
2625
import org.elasticsearch.common.lucene.Lucene;
@@ -233,11 +232,7 @@ public SearchExecutionContext getSearchExecutionContext() {
233232
public InternalTopHits buildEmptyAggregation() {
234233
TopDocs topDocs;
235234
if (subSearchContext.sort() != null) {
236-
topDocs = new TopFieldDocs(
237-
new TotalHits(0, TotalHits.Relation.EQUAL_TO),
238-
new FieldDoc[0],
239-
subSearchContext.sort().sort.getSort()
240-
);
235+
topDocs = new TopFieldDocs(Lucene.TOTAL_HITS_EQUAL_TO_ZERO, new FieldDoc[0], subSearchContext.sort().sort.getSort());
241236
} else {
242237
topDocs = Lucene.EMPTY_TOP_DOCS;
243238
}

server/src/main/java/org/elasticsearch/search/query/QueryPhase.java

+2-11
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.apache.lucene.search.ScoreMode;
2323
import org.apache.lucene.search.Sort;
2424
import org.apache.lucene.search.TopDocs;
25-
import org.apache.lucene.search.TotalHits;
2625
import org.apache.lucene.search.Weight;
2726
import org.elasticsearch.common.lucene.Lucene;
2827
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
@@ -76,11 +75,7 @@ static void executeRank(SearchContext searchContext) throws QueryPhaseExecutionE
7675
searchContext.size(0);
7776
QueryPhase.executeQuery(searchContext);
7877
} else {
79-
searchContext.queryResult()
80-
.topDocs(
81-
new TopDocsAndMaxScore(new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), Lucene.EMPTY_SCORE_DOCS), Float.NaN),
82-
new DocValueFormat[0]
83-
);
78+
searchContext.queryResult().topDocs(new TopDocsAndMaxScore(Lucene.EMPTY_TOP_DOCS, Float.NaN), new DocValueFormat[0]);
8479
}
8580

8681
List<TopDocs> rrfRankResults = new ArrayList<>();
@@ -124,11 +119,7 @@ static void executeRank(SearchContext searchContext) throws QueryPhaseExecutionE
124119
static void executeQuery(SearchContext searchContext) throws QueryPhaseExecutionException {
125120
if (searchContext.hasOnlySuggest()) {
126121
SuggestPhase.execute(searchContext);
127-
searchContext.queryResult()
128-
.topDocs(
129-
new TopDocsAndMaxScore(new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), Lucene.EMPTY_SCORE_DOCS), Float.NaN),
130-
new DocValueFormat[0]
131-
);
122+
searchContext.queryResult().topDocs(new TopDocsAndMaxScore(Lucene.EMPTY_TOP_DOCS, Float.NaN), new DocValueFormat[0]);
132123
return;
133124
}
134125

server/src/main/java/org/elasticsearch/search/query/QueryPhaseCollectorManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ private static class WithHits extends QueryPhaseCollectorManager {
400400
} else if (trackTotalHitsUpTo == SearchContext.TRACK_TOTAL_HITS_DISABLED) {
401401
// don't compute hit counts via the collector
402402
hitCountThreshold = 1;
403-
shortcutTotalHits = new TotalHits(0, TotalHits.Relation.GREATER_THAN_OR_EQUAL_TO);
403+
shortcutTotalHits = Lucene.TOTAL_HITS_GREATER_OR_EQUAL_TO_ZERO;
404404
} else {
405405
// implicit total hit counts are valid only when there is no filter collector in the chain
406406
final int hitCount = hasFilterCollector ? -1 : shortcutTotalHitCount(reader, query);

x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/MutableSearchResponse.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.action.search.SearchResponseMerger;
1515
import org.elasticsearch.action.search.ShardSearchFailure;
1616
import org.elasticsearch.common.Strings;
17+
import org.elasticsearch.common.lucene.Lucene;
1718
import org.elasticsearch.common.util.concurrent.AtomicArray;
1819
import org.elasticsearch.common.util.concurrent.ThreadContext;
1920
import org.elasticsearch.core.Releasable;
@@ -38,7 +39,6 @@
3839
* run concurrently to 1 and ensures that we pause the search progress when an {@link AsyncSearchResponse} is built.
3940
*/
4041
class MutableSearchResponse implements Releasable {
41-
private static final TotalHits EMPTY_TOTAL_HITS = new TotalHits(0L, TotalHits.Relation.GREATER_THAN_OR_EQUAL_TO);
4242
private final int totalShards;
4343
private final int skippedShards;
4444
private final Clusters clusters;
@@ -95,7 +95,7 @@ class MutableSearchResponse implements Releasable {
9595
this.queryFailures = totalShards == -1 ? null : new AtomicArray<>(totalShards - skippedShards);
9696
this.isPartial = true;
9797
this.threadContext = threadContext;
98-
this.totalHits = EMPTY_TOTAL_HITS;
98+
this.totalHits = Lucene.TOTAL_HITS_GREATER_OR_EQUAL_TO_ZERO;
9999
this.localClusterComplete = false;
100100
}
101101

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/profile/ProfileService.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import org.apache.logging.log4j.LogManager;
1111
import org.apache.logging.log4j.Logger;
12-
import org.apache.lucene.search.TotalHits;
1312
import org.elasticsearch.ElasticsearchException;
1413
import org.elasticsearch.ElasticsearchStatusException;
1514
import org.elasticsearch.ExceptionsHelper;
@@ -40,6 +39,7 @@
4039
import org.elasticsearch.cluster.service.ClusterService;
4140
import org.elasticsearch.common.Strings;
4241
import org.elasticsearch.common.bytes.BytesReference;
42+
import org.elasticsearch.common.lucene.Lucene;
4343
import org.elasticsearch.common.settings.Settings;
4444
import org.elasticsearch.common.unit.Fuzziness;
4545
import org.elasticsearch.common.xcontent.XContentHelper;
@@ -265,11 +265,7 @@ public void updateProfileData(UpdateProfileDataRequest request, ActionListener<A
265265
public void suggestProfile(SuggestProfilesRequest request, TaskId parentTaskId, ActionListener<SuggestProfilesResponse> listener) {
266266
tryFreezeAndCheckIndex(listener.map(response -> {
267267
assert response == null : "only null response can reach here";
268-
return new SuggestProfilesResponse(
269-
new SuggestProfilesResponse.ProfileHit[] {},
270-
0,
271-
new TotalHits(0, TotalHits.Relation.EQUAL_TO)
272-
);
268+
return new SuggestProfilesResponse(new SuggestProfilesResponse.ProfileHit[] {}, 0, Lucene.TOTAL_HITS_EQUAL_TO_ZERO);
273269
}), SEARCH_SHARDS).ifPresent(frozenProfileIndex -> {
274270
final SearchRequest searchRequest = buildSearchRequestForSuggest(request, parentTaskId);
275271

0 commit comments

Comments
 (0)