@@ -279,10 +279,14 @@ public void testNestedMultipleLayers() throws Exception {
279
279
requests .add (client ().prepareIndex ("articles" , "article" , "1" ).setSource (jsonBuilder ().startObject ()
280
280
.field ("title" , "quick brown fox" )
281
281
.startArray ("comments" )
282
- .startObject ()
283
- .field ("message" , "fox eat quick" )
284
- .startArray ("remarks" ).startObject ().field ("message" , "good" ).endObject ().endArray ()
285
- .endObject ()
282
+ .startObject ()
283
+ .field ("message" , "fox eat quick" )
284
+ .startArray ("remarks" ).startObject ().field ("message" , "good" ).endObject ().endArray ()
285
+ .endObject ()
286
+ .startObject ()
287
+ .field ("message" , "hippo is hungry" )
288
+ .startArray ("remarks" ).startObject ().field ("message" , "neutral" ).endObject ().endArray ()
289
+ .endObject ()
286
290
.endArray ()
287
291
.endObject ()));
288
292
requests .add (client ().prepareIndex ("articles" , "article" , "2" ).setSource (jsonBuilder ().startObject ()
@@ -296,6 +300,7 @@ public void testNestedMultipleLayers() throws Exception {
296
300
.endObject ()));
297
301
indexRandom (true , requests );
298
302
303
+ // Check we can load the first doubly-nested document.
299
304
SearchResponse response = client ().prepareSearch ("articles" )
300
305
.setQuery (
301
306
nestedQuery ("comments" ,
@@ -322,6 +327,33 @@ public void testNestedMultipleLayers() throws Exception {
322
327
assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getField ().string (), equalTo ("remarks" ));
323
328
assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getOffset (), equalTo (0 ));
324
329
330
+ // Check we can load the second doubly-nested document.
331
+ response = client ().prepareSearch ("articles" )
332
+ .setQuery (
333
+ nestedQuery ("comments" ,
334
+ nestedQuery ("comments.remarks" , matchQuery ("comments.remarks.message" , "neutral" ), ScoreMode .Avg )
335
+ .innerHit (new InnerHitBuilder ("remark" )),
336
+ ScoreMode .Avg ).innerHit (new InnerHitBuilder ())
337
+ ).get ();
338
+ assertNoFailures (response );
339
+ assertHitCount (response , 1 );
340
+ assertSearchHit (response , 1 , hasId ("1" ));
341
+ assertThat (response .getHits ().getAt (0 ).getInnerHits ().size (), equalTo (1 ));
342
+ innerHits = response .getHits ().getAt (0 ).getInnerHits ().get ("comments" );
343
+ assertThat (innerHits .getTotalHits ().value , equalTo (1L ));
344
+ assertThat (innerHits .getHits ().length , equalTo (1 ));
345
+ assertThat (innerHits .getAt (0 ).getId (), equalTo ("1" ));
346
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getField ().string (), equalTo ("comments" ));
347
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getOffset (), equalTo (1 ));
348
+ innerHits = innerHits .getAt (0 ).getInnerHits ().get ("remark" );
349
+ assertThat (innerHits .getTotalHits ().value , equalTo (1L ));
350
+ assertThat (innerHits .getHits ().length , equalTo (1 ));
351
+ assertThat (innerHits .getAt (0 ).getId (), equalTo ("1" ));
352
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getField ().string (), equalTo ("comments" ));
353
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getOffset (), equalTo (1 ));
354
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getField ().string (), equalTo ("remarks" ));
355
+ assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getOffset (), equalTo (0 ));
356
+
325
357
// Directly refer to the second level:
326
358
response = client ().prepareSearch ("articles" )
327
359
.setQuery (nestedQuery ("comments.remarks" , matchQuery ("comments.remarks.message" , "bad" ), ScoreMode .Avg )
@@ -364,6 +396,34 @@ public void testNestedMultipleLayers() throws Exception {
364
396
assertThat (innerHits .getAt (0 ).getNestedIdentity ().getOffset (), equalTo (0 ));
365
397
assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getField ().string (), equalTo ("remarks" ));
366
398
assertThat (innerHits .getAt (0 ).getNestedIdentity ().getChild ().getOffset (), equalTo (0 ));
399
+
400
+ // Check that inner hits contain _source even when it's disabled on the parent request.
401
+ response = client ().prepareSearch ("articles" )
402
+ .setFetchSource (false )
403
+ .setQuery (
404
+ nestedQuery ("comments" ,
405
+ nestedQuery ("comments.remarks" , matchQuery ("comments.remarks.message" , "good" ), ScoreMode .Avg )
406
+ .innerHit (new InnerHitBuilder ("remark" )), ScoreMode .Avg )
407
+ .innerHit (new InnerHitBuilder ())
408
+ ).get ();
409
+ assertNoFailures (response );
410
+ innerHits = response .getHits ().getAt (0 ).getInnerHits ().get ("comments" );
411
+ innerHits = innerHits .getAt (0 ).getInnerHits ().get ("remark" );
412
+ assertNotNull (innerHits .getAt (0 ).getSourceAsMap ());
413
+ assertFalse (innerHits .getAt (0 ).getSourceAsMap ().isEmpty ());
414
+
415
+ response = client ().prepareSearch ("articles" )
416
+ .setQuery (
417
+ nestedQuery ("comments" ,
418
+ nestedQuery ("comments.remarks" , matchQuery ("comments.remarks.message" , "good" ), ScoreMode .Avg )
419
+ .innerHit (new InnerHitBuilder ("remark" )), ScoreMode .Avg )
420
+ .innerHit (new InnerHitBuilder ().setFetchSourceContext (new FetchSourceContext (false )))
421
+ ).get ();
422
+ assertNoFailures (response );
423
+ innerHits = response .getHits ().getAt (0 ).getInnerHits ().get ("comments" );
424
+ innerHits = innerHits .getAt (0 ).getInnerHits ().get ("remark" );
425
+ assertNotNull (innerHits .getAt (0 ).getSourceAsMap ());
426
+ assertFalse (innerHits .getAt (0 ).getSourceAsMap ().isEmpty ());
367
427
}
368
428
369
429
// Issue #9723
0 commit comments