Skip to content

Commit 827e90d

Browse files
Misc cleanups for query phase (#112521)
Avoiding some redundant computation in obvious spots, fixing compile warnings and using a more specific listener in one spot to save memory and indirection.
1 parent 1d7e7bd commit 827e90d

File tree

8 files changed

+45
-52
lines changed

8 files changed

+45
-52
lines changed

server/src/main/java/org/elasticsearch/index/query/FilteredSearchExecutionContext.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,7 @@ public void registerAsyncAction(BiConsumer<Client, ActionListener<?>> asyncActio
239239
}
240240

241241
@Override
242-
@SuppressWarnings("rawtypes")
243-
public void executeAsyncActions(ActionListener listener) {
242+
public void executeAsyncActions(ActionListener<Void> listener) {
244243
in.executeAsyncActions(listener);
245244
}
246245

server/src/main/java/org/elasticsearch/index/query/InnerHitsRewriteContext.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ public InnerHitsRewriteContext convertToInnerHitsRewriteContext() {
2626
}
2727

2828
@Override
29-
@SuppressWarnings({ "rawtypes" })
30-
public void executeAsyncActions(ActionListener listener) {
29+
public void executeAsyncActions(ActionListener<Void> listener) {
3130
// InnerHitsRewriteContext does not support async actions at all, and doesn't supply a valid `client` object
3231
throw new UnsupportedOperationException("InnerHitsRewriteContext does not support async actions");
3332
}

server/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,12 @@ public boolean hasAsyncActions() {
283283
* Executes all registered async actions and notifies the listener once it's done. The value that is passed to the listener is always
284284
* <code>null</code>. The list of registered actions is cleared once this method returns.
285285
*/
286-
@SuppressWarnings({ "unchecked", "rawtypes" })
287-
public void executeAsyncActions(ActionListener listener) {
286+
public void executeAsyncActions(ActionListener<Void> listener) {
288287
if (asyncActions.isEmpty()) {
289288
listener.onResponse(null);
290289
} else {
291290
CountDown countDown = new CountDown(asyncActions.size());
292-
ActionListener<?> internalListener = new ActionListener() {
291+
ActionListener<?> internalListener = new ActionListener<>() {
293292
@Override
294293
public void onResponse(Object o) {
295294
if (countDown.countDown()) {

server/src/main/java/org/elasticsearch/index/query/SearchExecutionContext.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,7 @@ public void registerAsyncAction(BiConsumer<Client, ActionListener<?>> asyncActio
615615
}
616616

617617
@Override
618-
@SuppressWarnings("rawtypes")
619-
public void executeAsyncActions(ActionListener listener) {
618+
public void executeAsyncActions(ActionListener<Void> listener) {
620619
failIfFrozen();
621620
super.executeAsyncActions(listener);
622621
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,6 @@ final class DefaultSearchContext extends SearchContext {
179179
this.indexShard = readerContext.indexShard();
180180

181181
Engine.Searcher engineSearcher = readerContext.acquireSearcher("search");
182-
int maximumNumberOfSlices = determineMaximumNumberOfSlices(
183-
executor,
184-
request,
185-
resultsType,
186-
enableQueryPhaseParallelCollection,
187-
field -> getFieldCardinality(field, readerContext.indexService(), engineSearcher.getDirectoryReader())
188-
);
189182
if (executor == null) {
190183
this.searcher = new ContextIndexSearcher(
191184
engineSearcher.getIndexReader(),
@@ -202,7 +195,13 @@ final class DefaultSearchContext extends SearchContext {
202195
engineSearcher.getQueryCachingPolicy(),
203196
lowLevelCancellation,
204197
executor,
205-
maximumNumberOfSlices,
198+
determineMaximumNumberOfSlices(
199+
executor,
200+
request,
201+
resultsType,
202+
enableQueryPhaseParallelCollection,
203+
field -> getFieldCardinality(field, readerContext.indexService(), engineSearcher.getDirectoryReader())
204+
),
206205
minimumDocsPerSlice
207206
);
208207
}

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

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,14 +1779,12 @@ private static boolean canMatchAfterRewrite(final ShardSearchRequest request, fi
17791779
@SuppressWarnings("unchecked")
17801780
public static boolean queryStillMatchesAfterRewrite(ShardSearchRequest request, QueryRewriteContext context) throws IOException {
17811781
Rewriteable.rewrite(request.getRewriteable(), context, false);
1782-
boolean canMatch = request.getAliasFilter().getQueryBuilder() instanceof MatchNoneQueryBuilder == false;
1783-
if (canRewriteToMatchNone(request.source())) {
1784-
canMatch &= request.source()
1785-
.subSearches()
1786-
.stream()
1787-
.anyMatch(sqwb -> sqwb.getQueryBuilder() instanceof MatchNoneQueryBuilder == false);
1782+
if (request.getAliasFilter().getQueryBuilder() instanceof MatchNoneQueryBuilder) {
1783+
return false;
17881784
}
1789-
return canMatch;
1785+
final var source = request.source();
1786+
return canRewriteToMatchNone(source) == false
1787+
|| source.subSearches().stream().anyMatch(sqwb -> sqwb.getQueryBuilder() instanceof MatchNoneQueryBuilder == false);
17901788
}
17911789

17921790
/**
@@ -1806,19 +1804,18 @@ public static boolean canRewriteToMatchNone(SearchSourceBuilder source) {
18061804
return aggregations == null || aggregations.mustVisitAllDocs() == false;
18071805
}
18081806

1809-
@SuppressWarnings({ "rawtypes", "unchecked" })
1807+
@SuppressWarnings("unchecked")
18101808
private void rewriteAndFetchShardRequest(IndexShard shard, ShardSearchRequest request, ActionListener<ShardSearchRequest> listener) {
1811-
ActionListener<Rewriteable> actionListener = listener.delegateFailureAndWrap((l, r) -> {
1812-
if (request.readerId() != null) {
1813-
l.onResponse(request);
1814-
} else {
1815-
shard.ensureShardSearchActive(b -> l.onResponse(request));
1816-
}
1817-
});
18181809
// we also do rewrite on the coordinating node (TransportSearchService) but we also need to do it here.
18191810
// AliasFilters and other things may need to be rewritten on the data node, but not per individual shard.
1820-
// These are uncommon-cases but we are very efficient doing the rewrite here.
1821-
Rewriteable.rewriteAndFetch(request.getRewriteable(), indicesService.getDataRewriteContext(request::nowInMillis), actionListener);
1811+
// These are uncommon-cases, but we are very efficient doing the rewrite here.
1812+
Rewriteable.rewriteAndFetch(
1813+
request.getRewriteable(),
1814+
indicesService.getDataRewriteContext(request::nowInMillis),
1815+
request.readerId() == null
1816+
? listener.delegateFailureAndWrap((l, r) -> shard.ensureShardSearchActive(b -> l.onResponse(request)))
1817+
: listener.safeMap(r -> request)
1818+
);
18221819
}
18231820

18241821
/**

server/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -587,22 +587,23 @@ public Rewriteable rewrite(QueryRewriteContext ctx) throws IOException {
587587
SearchSourceBuilder newSource = request.source() == null ? null : Rewriteable.rewrite(request.source(), ctx);
588588
AliasFilter newAliasFilter = Rewriteable.rewrite(request.getAliasFilter(), ctx);
589589
SearchExecutionContext searchExecutionContext = ctx.convertToSearchExecutionContext();
590-
FieldSortBuilder primarySort = FieldSortBuilder.getPrimaryFieldSortOrNull(newSource);
591-
if (searchExecutionContext != null
592-
&& primarySort != null
593-
&& primarySort.isBottomSortShardDisjoint(searchExecutionContext, request.getBottomSortValues())) {
594-
assert newSource != null : "source should contain a primary sort field";
595-
newSource = newSource.shallowCopy();
596-
int trackTotalHitsUpTo = SearchRequest.resolveTrackTotalHitsUpTo(request.scroll, request.source);
597-
if (trackTotalHitsUpTo == TRACK_TOTAL_HITS_DISABLED && newSource.suggest() == null && newSource.aggregations() == null) {
598-
newSource.query(new MatchNoneQueryBuilder());
599-
} else {
600-
newSource.size(0);
590+
if (searchExecutionContext != null) {
591+
final FieldSortBuilder primarySort = FieldSortBuilder.getPrimaryFieldSortOrNull(newSource);
592+
if (primarySort != null && primarySort.isBottomSortShardDisjoint(searchExecutionContext, request.getBottomSortValues())) {
593+
assert newSource != null : "source should contain a primary sort field";
594+
newSource = newSource.shallowCopy();
595+
int trackTotalHitsUpTo = SearchRequest.resolveTrackTotalHitsUpTo(request.scroll, request.source);
596+
if (trackTotalHitsUpTo == TRACK_TOTAL_HITS_DISABLED
597+
&& newSource.suggest() == null
598+
&& newSource.aggregations() == null) {
599+
newSource.query(new MatchNoneQueryBuilder());
600+
} else {
601+
newSource.size(0);
602+
}
603+
request.source(newSource);
604+
request.setBottomSortValues(null);
601605
}
602-
request.source(newSource);
603-
request.setBottomSortValues(null);
604606
}
605-
606607
if (newSource == request.source() && newAliasFilter == request.getAliasFilter()) {
607608
return this;
608609
} else {

server/src/test/java/org/elasticsearch/search/aggregations/AggregatorFactoriesTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,9 @@ public void testRewritePipelineAggregationUnderAggregation() throws Exception {
262262
QueryRewriteContext context = new QueryRewriteContext(parserConfig(), null, () -> 0L);
263263
AggregatorFactories.Builder rewritten = builder.rewrite(context);
264264
CountDownLatch latch = new CountDownLatch(1);
265-
context.executeAsyncActions(new ActionListener<Object>() {
265+
context.executeAsyncActions(new ActionListener<>() {
266266
@Override
267-
public void onResponse(Object response) {
267+
public void onResponse(Void aVoid) {
268268
assertNotSame(builder, rewritten);
269269
Collection<AggregationBuilder> aggregatorFactories = rewritten.getAggregatorFactories();
270270
assertEquals(1, aggregatorFactories.size());
@@ -289,9 +289,9 @@ public void testRewriteAggregationAtTopLevel() throws Exception {
289289
QueryRewriteContext context = new QueryRewriteContext(parserConfig(), null, () -> 0L);
290290
AggregatorFactories.Builder rewritten = builder.rewrite(context);
291291
CountDownLatch latch = new CountDownLatch(1);
292-
context.executeAsyncActions(new ActionListener<Object>() {
292+
context.executeAsyncActions(new ActionListener<>() {
293293
@Override
294-
public void onResponse(Object response) {
294+
public void onResponse(Void aVoid) {
295295
assertNotSame(builder, rewritten);
296296
PipelineAggregationBuilder rewrittenPipeline = rewritten.getPipelineAggregatorFactories().iterator().next();
297297
assertThat(((RewrittenPipelineAggregationBuilder) rewrittenPipeline).setOnRewrite.get(), equalTo("rewritten"));

0 commit comments

Comments
 (0)