Skip to content

Commit 99fccbf

Browse files
committed
Pass parent filter to inner query in nested query
Pass parent filter to inner query so that inner query can utilize the information Signed-off-by: Heemin Kim <heemin@amazon.com>
1 parent 8807d7a commit 99fccbf

4 files changed

Lines changed: 33 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
112112
- Force merge with `only_expunge_deletes` honors max segment size ([#10036](https://github.com/opensearch-project/OpenSearch/pull/10036))
113113
- Add instrumentation in transport service. ([#10042](https://github.com/opensearch-project/OpenSearch/pull/10042))
114114
- [Tracing Framework] Add support for SpanKind. ([#10122](https://github.com/opensearch-project/OpenSearch/pull/10122))
115+
- Pass parent filter to inner query in nested query ([#10246](https://github.com/opensearch-project/OpenSearch/pull/10246))
115116

116117
### Deprecated
117118

server/src/main/java/org/opensearch/index/query/NestedQueryBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,13 @@ protected Query doToQuery(QueryShardContext context) throws IOException {
318318
parentFilter = context.bitsetFilter(objectMapper.nestedTypeFilter());
319319
}
320320

321+
BitSetProducer previousParentFilter = context.getParentFilter();
321322
try {
323+
context.setParentFilter(parentFilter);
322324
context.nestedScope().nextLevel(nestedObjectMapper);
323325
innerQuery = this.query.toQuery(context);
324326
} finally {
327+
context.setParentFilter(previousParentFilter);
325328
context.nestedScope().previousLevel();
326329
}
327330

server/src/main/java/org/opensearch/index/query/QueryShardContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public class QueryShardContext extends QueryRewriteContext {
115115
private boolean mapUnmappedFieldAsString;
116116
private NestedScope nestedScope;
117117
private final ValuesSourceRegistry valuesSourceRegistry;
118+
private BitSetProducer parentFilter;
118119

119120
public QueryShardContext(
120121
int shardId,
@@ -622,4 +623,12 @@ public BitsetFilterCache getBitsetFilterCache() {
622623
public AggregationUsageService getUsageService() {
623624
return valuesSourceRegistry.getUsageService();
624625
}
626+
627+
public BitSetProducer getParentFilter() {
628+
return parentFilter;
629+
}
630+
631+
public void setParentFilter(BitSetProducer parentFilter) {
632+
this.parentFilter = parentFilter;
633+
}
625634
}

server/src/test/java/org/opensearch/index/query/NestedQueryBuilderTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
import java.util.HashMap;
6060
import java.util.Map;
6161

62+
import static org.mockito.Mockito.spy;
63+
import static org.mockito.Mockito.verify;
6264
import static org.opensearch.index.IndexSettingsTests.newIndexMeta;
6365
import static org.opensearch.index.query.InnerHitBuilderTests.randomNestedInnerHits;
6466
import static org.hamcrest.CoreMatchers.containsString;
@@ -411,4 +413,22 @@ public void testDisallowExpensiveQueries() {
411413
OpenSearchException e = expectThrows(OpenSearchException.class, () -> queryBuilder.toQuery(queryShardContext));
412414
assertEquals("[joining] queries cannot be executed when 'search.allow_expensive_queries' is set to false.", e.getMessage());
413415
}
416+
417+
public void testSetParentFilterInContext() throws Exception {
418+
QueryShardContext queryShardContext = createShardContext();
419+
QueryBuilder innerQueryBuilder = spy(new MatchAllQueryBuilderTests().createTestQueryBuilder());
420+
when(innerQueryBuilder.toQuery(queryShardContext)).thenAnswer(invoke -> {
421+
QueryShardContext context = invoke.getArgument(0);
422+
if (context.getParentFilter() == null) {
423+
throw new Exception("Expect parent filter to be non-null");
424+
}
425+
return invoke.callRealMethod();
426+
});
427+
NestedQueryBuilder nqb = new NestedQueryBuilder("nested1", innerQueryBuilder, RandomPicks.randomFrom(random(), ScoreMode.values()));
428+
429+
assertNull(queryShardContext.getParentFilter());
430+
nqb.rewrite(queryShardContext).toQuery(queryShardContext);
431+
assertNull(queryShardContext.getParentFilter());
432+
verify(innerQueryBuilder).toQuery(queryShardContext);
433+
}
414434
}

0 commit comments

Comments
 (0)