Skip to content

Commit 43d3b2e

Browse files
committed
More comments
Signed-off-by: Atri Sharma <atri.jiit@gmail.com>
1 parent 1ebf7a1 commit 43d3b2e

File tree

3 files changed

+56
-18
lines changed

3 files changed

+56
-18
lines changed

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,10 +1516,8 @@ private void parseSource(DefaultSearchContext context, SearchSourceBuilder sourc
15161516
if (source.query() != null) {
15171517
QueryBuilder query = source.query();
15181518

1519-
// Apply query rewriting optimizations if enabled
1520-
if (QUERY_REWRITING_ENABLED_SETTING.get(clusterService.getSettings())) {
1521-
query = QueryRewriterRegistry.rewrite(query, queryShardContext, true);
1522-
}
1519+
// Apply query rewriting optimizations
1520+
query = QueryRewriterRegistry.rewrite(query, queryShardContext);
15231521

15241522
InnerHitContextBuilder.extractInnerHits(query, innerHitBuilders);
15251523
context.parsedQuery(queryShardContext.toQuery(query));

server/src/main/java/org/opensearch/search/query/QueryRewriterRegistry.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.opensearch.common.settings.Settings;
1515
import org.opensearch.index.query.QueryBuilder;
1616
import org.opensearch.index.query.QueryShardContext;
17+
import org.opensearch.search.SearchService;
1718
import org.opensearch.search.query.rewriters.BooleanFlatteningRewriter;
1819
import org.opensearch.search.query.rewriters.MatchAllRemovalRewriter;
1920
import org.opensearch.search.query.rewriters.MustNotToShouldRewriter;
@@ -47,6 +48,11 @@ public final class QueryRewriterRegistry {
4748
*/
4849
private final TermsMergingRewriter termsMergingRewriter;
4950

51+
/**
52+
* Whether query rewriting is enabled.
53+
*/
54+
private volatile boolean enabled;
55+
5056
private QueryRewriterRegistry() {
5157
this.rewriters = new CopyOnWriteArrayList<>();
5258

@@ -89,15 +95,21 @@ public void registerRewriter(QueryRewriter rewriter) {
8995
* @param clusterSettings Cluster settings for registering update consumers
9096
*/
9197
public static void initialize(Settings settings, ClusterSettings clusterSettings) {
92-
getInstance().termsMergingRewriter.initialize(settings, clusterSettings);
98+
QueryRewriterRegistry instance = getInstance();
99+
instance.termsMergingRewriter.initialize(settings, clusterSettings);
100+
instance.enabled = SearchService.QUERY_REWRITING_ENABLED_SETTING.get(settings);
101+
clusterSettings.addSettingsUpdateConsumer(
102+
SearchService.QUERY_REWRITING_ENABLED_SETTING,
103+
(Boolean enabled) -> instance.enabled = enabled
104+
);
93105
}
94106

95-
public static QueryBuilder rewrite(QueryBuilder query, QueryShardContext context, boolean enabled) {
96-
if (!enabled || query == null) {
107+
public static QueryBuilder rewrite(QueryBuilder query, QueryShardContext context) {
108+
QueryRewriterRegistry registry = getInstance();
109+
if (!registry.enabled || query == null) {
97110
return query;
98111
}
99112

100-
QueryRewriterRegistry registry = getInstance();
101113
List<QueryRewriter> sortedRewriters = new ArrayList<>(registry.rewriters);
102114
sortedRewriters.sort(Comparator.comparingInt(QueryRewriter::priority));
103115

server/src/test/java/org/opensearch/search/query/QueryRewriterRegistryTests.java

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@
88

99
package org.opensearch.search.query;
1010

11+
import org.opensearch.common.settings.ClusterSettings;
12+
import org.opensearch.common.settings.Settings;
1113
import org.opensearch.index.query.BoolQueryBuilder;
1214
import org.opensearch.index.query.MatchAllQueryBuilder;
1315
import org.opensearch.index.query.QueryBuilder;
1416
import org.opensearch.index.query.QueryBuilders;
1517
import org.opensearch.index.query.QueryShardContext;
1618
import org.opensearch.index.query.RangeQueryBuilder;
1719
import org.opensearch.index.query.TermQueryBuilder;
20+
import org.opensearch.search.SearchService;
1821
import org.opensearch.test.OpenSearchTestCase;
1922

2023
import static org.hamcrest.Matchers.equalTo;
@@ -25,6 +28,18 @@ public class QueryRewriterRegistryTests extends OpenSearchTestCase {
2528

2629
private final QueryShardContext context = mock(QueryShardContext.class);
2730

31+
@Override
32+
public void setUp() throws Exception {
33+
super.setUp();
34+
// Initialize registry with default settings
35+
Settings settings = Settings.builder()
36+
.put(SearchService.QUERY_REWRITING_ENABLED_SETTING.getKey(), true)
37+
.put(SearchService.QUERY_REWRITING_TERMS_THRESHOLD_SETTING.getKey(), 16)
38+
.build();
39+
ClusterSettings clusterSettings = new ClusterSettings(settings, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS);
40+
QueryRewriterRegistry.initialize(settings, clusterSettings);
41+
}
42+
2843
public void testCompleteRewritingPipeline() {
2944
// Test that all rewriters work together correctly
3045
QueryBuilder nestedBool = QueryBuilders.boolQuery()
@@ -38,7 +53,7 @@ public void testCompleteRewritingPipeline() {
3853
.filter(QueryBuilders.termQuery("type", "product"))
3954
.filter(QueryBuilders.termQuery("type", "service"));
4055

41-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
56+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
4257
assertThat(rewritten, instanceOf(BoolQueryBuilder.class));
4358
BoolQueryBuilder rewrittenBool = (BoolQueryBuilder) rewritten;
4459

@@ -56,18 +71,31 @@ public void testCompleteRewritingPipeline() {
5671
}
5772

5873
public void testDisabledRewriting() {
59-
// When disabled, query should not be modified
74+
// Test disabled rewriting via settings
75+
Settings settings = Settings.builder().put(SearchService.QUERY_REWRITING_ENABLED_SETTING.getKey(), false).build();
76+
ClusterSettings clusterSettings = new ClusterSettings(settings, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS);
77+
78+
// Initialize with disabled setting
79+
QueryRewriterRegistry.initialize(settings, clusterSettings);
80+
6081
QueryBuilder query = QueryBuilders.boolQuery()
6182
.must(QueryBuilders.matchAllQuery())
6283
.filter(QueryBuilders.termQuery("field", "value"));
6384

64-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, false);
85+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
6586
assertSame(query, rewritten);
87+
88+
// Enable via settings update
89+
clusterSettings.applySettings(Settings.builder().put(SearchService.QUERY_REWRITING_ENABLED_SETTING.getKey(), true).build());
90+
91+
// Now it should rewrite
92+
QueryBuilder rewritten2 = QueryRewriterRegistry.rewrite(query, context);
93+
assertNotSame(query, rewritten2);
6694
}
6795

6896
public void testNullQuery() {
6997
// Null query should return null
70-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(null, context, true);
98+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(null, context);
7199
assertNull(rewritten);
72100
}
73101

@@ -82,7 +110,7 @@ public void testRewriterPriorityOrder() {
82110
.must(QueryBuilders.termQuery("field", "value2"))
83111
);
84112

85-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(deeplyNested, context, true);
113+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(deeplyNested, context);
86114
assertThat(rewritten, instanceOf(BoolQueryBuilder.class));
87115
BoolQueryBuilder rewrittenBool = (BoolQueryBuilder) rewritten;
88116

@@ -113,7 +141,7 @@ public void testComplexRealWorldQuery() {
113141
.must(QueryBuilders.rangeQuery("price").gte(500).lte(2000))
114142
.mustNot(QueryBuilders.termQuery("status", "discontinued"));
115143

116-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
144+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
117145
assertThat(rewritten, instanceOf(BoolQueryBuilder.class));
118146
BoolQueryBuilder rewrittenBool = (BoolQueryBuilder) rewritten;
119147

@@ -155,7 +183,7 @@ public void testPerformanceMetrics() {
155183
.filter(QueryBuilders.matchAllQuery());
156184

157185
// Should not throw any exceptions
158-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
186+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
159187
assertNotNull(rewritten);
160188
}
161189

@@ -167,7 +195,7 @@ public void testRewriterErrorHandling() {
167195
.filter(QueryBuilders.matchAllQuery());
168196

169197
// Even if one rewriter fails, others should still be applied
170-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
198+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
171199
assertNotNull(rewritten);
172200
}
173201

@@ -202,7 +230,7 @@ public void testVeryComplexMixedQuery() {
202230
.mustNot(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("archived", "true")))
203231
.minimumShouldMatch(1);
204232

205-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
233+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
206234
assertThat(rewritten, instanceOf(BoolQueryBuilder.class));
207235
BoolQueryBuilder result = (BoolQueryBuilder) rewritten;
208236

@@ -286,7 +314,7 @@ public String name() {
286314
.must(QueryBuilders.termQuery("test_field", "test_value"))
287315
.filter(QueryBuilders.termQuery("other_field", "other_value"));
288316

289-
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context, true);
317+
QueryBuilder rewritten = QueryRewriterRegistry.rewrite(query, context);
290318
assertThat(rewritten, instanceOf(BoolQueryBuilder.class));
291319
BoolQueryBuilder rewrittenBool = (BoolQueryBuilder) rewritten;
292320

0 commit comments

Comments
 (0)