@@ -216,4 +216,85 @@ public void testVeryComplexMixedQuery() {
216216 assertTrue (result .must ().size () >= 1 );
217217 assertTrue (result .filter ().size () >= 1 );
218218 }
219+
220+ public void testCustomRewriterRegistration () {
221+ // Create a custom rewriter for testing
222+ QueryRewriter customRewriter = new QueryRewriter () {
223+ @ Override
224+ public QueryBuilder rewrite (QueryBuilder query , QueryShardContext context ) {
225+ if (query instanceof TermQueryBuilder ) {
226+ TermQueryBuilder termQuery = (TermQueryBuilder ) query ;
227+ if ("test_field" .equals (termQuery .fieldName ()) && "test_value" .equals (termQuery .value ())) {
228+ // Replace with a different query
229+ return QueryBuilders .termQuery ("custom_field" , "custom_value" );
230+ }
231+ } else if (query instanceof BoolQueryBuilder ) {
232+ // Recursively apply to nested queries
233+ BoolQueryBuilder boolQuery = (BoolQueryBuilder ) query ;
234+ BoolQueryBuilder rewritten = new BoolQueryBuilder ();
235+
236+ // Copy settings
237+ rewritten .boost (boolQuery .boost ());
238+ rewritten .queryName (boolQuery .queryName ());
239+ rewritten .minimumShouldMatch (boolQuery .minimumShouldMatch ());
240+ rewritten .adjustPureNegative (boolQuery .adjustPureNegative ());
241+
242+ // Recursively rewrite clauses
243+ boolean changed = false ;
244+ for (QueryBuilder must : boolQuery .must ()) {
245+ QueryBuilder rewrittenClause = rewrite (must , context );
246+ rewritten .must (rewrittenClause );
247+ if (rewrittenClause != must ) changed = true ;
248+ }
249+ for (QueryBuilder filter : boolQuery .filter ()) {
250+ QueryBuilder rewrittenClause = rewrite (filter , context );
251+ rewritten .filter (rewrittenClause );
252+ if (rewrittenClause != filter ) changed = true ;
253+ }
254+ for (QueryBuilder should : boolQuery .should ()) {
255+ QueryBuilder rewrittenClause = rewrite (should , context );
256+ rewritten .should (rewrittenClause );
257+ if (rewrittenClause != should ) changed = true ;
258+ }
259+ for (QueryBuilder mustNot : boolQuery .mustNot ()) {
260+ QueryBuilder rewrittenClause = rewrite (mustNot , context );
261+ rewritten .mustNot (rewrittenClause );
262+ if (rewrittenClause != mustNot ) changed = true ;
263+ }
264+
265+ return changed ? rewritten : query ;
266+ }
267+ return query ;
268+ }
269+
270+ @ Override
271+ public int priority () {
272+ return 1000 ; // High priority to ensure it runs last
273+ }
274+
275+ @ Override
276+ public String name () {
277+ return "test_custom_rewriter" ;
278+ }
279+ };
280+
281+ // Register the custom rewriter
282+ QueryRewriterRegistry .getInstance ().registerRewriter (customRewriter );
283+
284+ // Test that it's applied
285+ QueryBuilder query = QueryBuilders .boolQuery ()
286+ .must (QueryBuilders .termQuery ("test_field" , "test_value" ))
287+ .filter (QueryBuilders .termQuery ("other_field" , "other_value" ));
288+
289+ QueryBuilder rewritten = QueryRewriterRegistry .rewrite (query , context , true );
290+ assertThat (rewritten , instanceOf (BoolQueryBuilder .class ));
291+ BoolQueryBuilder rewrittenBool = (BoolQueryBuilder ) rewritten ;
292+
293+ // The custom rewriter should have replaced the term query
294+ assertThat (rewrittenBool .must ().size (), equalTo (1 ));
295+ assertThat (rewrittenBool .must ().get (0 ), instanceOf (TermQueryBuilder .class ));
296+ TermQueryBuilder mustTerm = (TermQueryBuilder ) rewrittenBool .must ().get (0 );
297+ assertThat (mustTerm .fieldName (), equalTo ("custom_field" ));
298+ assertThat (mustTerm .value (), equalTo ("custom_value" ));
299+ }
219300}
0 commit comments