@@ -354,6 +354,68 @@ public void testDoToQuery_whenTooManySubqueries_thenFail() {
354
354
assertThat (exception .getMessage (), containsString ("Number of sub-queries exceeds maximum supported" ));
355
355
}
356
356
357
+ @ SneakyThrows
358
+ public void testDoToQuery_whenNestedHybridSubqueries_thenFail () {
359
+ // create query with nested hybrid subqueries, which should not be allowed
360
+ XContentBuilder xContentBuilder = XContentFactory .jsonBuilder ()
361
+ .startObject ()
362
+ .startArray ("queries" )
363
+ .startObject ()
364
+ .startObject (HybridQueryBuilder .NAME )
365
+ .startArray ("queries" )
366
+ .startObject ()
367
+ .startObject (NeuralQueryBuilder .NAME )
368
+ .startObject (VECTOR_FIELD_NAME )
369
+ .field (QUERY_TEXT_FIELD .getPreferredName (), QUERY_TEXT )
370
+ .field (MODEL_ID_FIELD .getPreferredName (), MODEL_ID )
371
+ .field (K_FIELD .getPreferredName (), K )
372
+ .field (BOOST_FIELD .getPreferredName (), BOOST )
373
+ .endObject ()
374
+ .endObject ()
375
+ .endObject ()
376
+ .startObject ()
377
+ .startObject (TermQueryBuilder .NAME )
378
+ .field (TEXT_FIELD_NAME , TERM_QUERY_TEXT )
379
+ .endObject ()
380
+ .endObject ()
381
+ .endArray ()
382
+ .endObject ()
383
+ .endObject ()
384
+ .startObject ()
385
+ .startObject (TermQueryBuilder .NAME )
386
+ .field (TEXT_FIELD_NAME , TERM_QUERY_TEXT )
387
+ .endObject ()
388
+ .endObject ()
389
+ .endArray ()
390
+ .field ("pagination_depth" , 10 )
391
+ .endObject ();
392
+
393
+ NamedXContentRegistry namedXContentRegistry = new NamedXContentRegistry (
394
+ List .of (
395
+ new NamedXContentRegistry .Entry (QueryBuilder .class , new ParseField (TermQueryBuilder .NAME ), TermQueryBuilder ::fromXContent ),
396
+ new NamedXContentRegistry .Entry (
397
+ QueryBuilder .class ,
398
+ new ParseField (NeuralQueryBuilder .NAME ),
399
+ NeuralQueryBuilder ::fromXContent
400
+ ),
401
+ new NamedXContentRegistry .Entry (
402
+ QueryBuilder .class ,
403
+ new ParseField (HybridQueryBuilder .NAME ),
404
+ HybridQueryBuilder ::fromXContent
405
+ )
406
+ )
407
+ );
408
+ XContentParser contentParser = createParser (
409
+ namedXContentRegistry ,
410
+ xContentBuilder .contentType ().xContent (),
411
+ BytesReference .bytes (xContentBuilder )
412
+ );
413
+ contentParser .nextToken ();
414
+
415
+ ParsingException exception = expectThrows (ParsingException .class , () -> HybridQueryBuilder .fromXContent (contentParser ));
416
+ assertThat (exception .getMessage (), containsString ("[hybrid] query cannot be nested in another [hybrid] query" ));
417
+ }
418
+
357
419
/**
358
420
* Tests basic query:
359
421
* {
0 commit comments