Skip to content

Commit 2e82c5c

Browse files
committed
Propagate ignore_unmapped to inner_hits (#29261)
In 5.2 `ignore_unmapped` was added to `inner_hits` in order to ignore invalid mapping. This value was automatically set to the value defined in the parent query (`nested`, `has_child`, `has_parent`) but the refactoring of the parent/child in 5.6 removed this behavior unintentionally. This commit restores this behavior but also makes sure that we always automatically enforce this value when the query builder is used directly (previously this was only done by the XContent deserialization). Closes #29071
1 parent 9bd5d53 commit 2e82c5c

File tree

6 files changed

+28
-6
lines changed

6 files changed

+28
-6
lines changed

modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ public InnerHitBuilder innerHit() {
167167

168168
public HasChildQueryBuilder innerHit(InnerHitBuilder innerHit) {
169169
this.innerHitBuilder = innerHit;
170+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
170171
return this;
171172
}
172173

@@ -212,6 +213,9 @@ public int minChildren() {
212213
*/
213214
public HasChildQueryBuilder ignoreUnmapped(boolean ignoreUnmapped) {
214215
this.ignoreUnmapped = ignoreUnmapped;
216+
if (innerHitBuilder!= null ){
217+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
218+
}
215219
return this;
216220
}
217221

@@ -291,7 +295,6 @@ public static HasChildQueryBuilder fromXContent(XContentParser parser) throws IO
291295
hasChildQueryBuilder.ignoreUnmapped(ignoreUnmapped);
292296
if (innerHitBuilder != null) {
293297
hasChildQueryBuilder.innerHit(innerHitBuilder);
294-
hasChildQueryBuilder.ignoreUnmapped(ignoreUnmapped);
295298
}
296299
return hasChildQueryBuilder;
297300
}

modules/parent-join/src/main/java/org/elasticsearch/join/query/HasParentQueryBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ public InnerHitBuilder innerHit() {
145145

146146
public HasParentQueryBuilder innerHit(InnerHitBuilder innerHit) {
147147
this.innerHitBuilder = innerHit;
148+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
148149
return this;
149150
}
150151

@@ -155,6 +156,9 @@ public HasParentQueryBuilder innerHit(InnerHitBuilder innerHit) {
155156
*/
156157
public HasParentQueryBuilder ignoreUnmapped(boolean ignoreUnmapped) {
157158
this.ignoreUnmapped = ignoreUnmapped;
159+
if (innerHitBuilder != null) {
160+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
161+
}
158162
return this;
159163
}
160164

modules/parent-join/src/test/java/org/elasticsearch/join/query/HasChildQueryBuilderTests.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,7 @@ protected HasChildQueryBuilder doCreateTestQueryBuilder() {
157157
hqb.innerHit(new InnerHitBuilder()
158158
.setName(randomAlphaOfLengthBetween(1, 10))
159159
.setSize(randomIntBetween(0, 100))
160-
.addSort(new FieldSortBuilder(STRING_FIELD_NAME_2).order(SortOrder.ASC))
161-
.setIgnoreUnmapped(hqb.ignoreUnmapped()));
160+
.addSort(new FieldSortBuilder(STRING_FIELD_NAME_2).order(SortOrder.ASC)));
162161
}
163162
return hqb;
164163
}
@@ -344,13 +343,19 @@ public void testNonDefaultSimilarity() throws Exception {
344343

345344
public void testIgnoreUnmapped() throws IOException {
346345
final HasChildQueryBuilder queryBuilder = new HasChildQueryBuilder("unmapped", new MatchAllQueryBuilder(), ScoreMode.None);
346+
queryBuilder.innerHit(new InnerHitBuilder());
347+
assertFalse(queryBuilder.innerHit().isIgnoreUnmapped());
347348
queryBuilder.ignoreUnmapped(true);
349+
assertTrue(queryBuilder.innerHit().isIgnoreUnmapped());
348350
Query query = queryBuilder.toQuery(createShardContext());
349351
assertThat(query, notNullValue());
350352
assertThat(query, instanceOf(MatchNoDocsQuery.class));
351353

352354
final HasChildQueryBuilder failingQueryBuilder = new HasChildQueryBuilder("unmapped", new MatchAllQueryBuilder(), ScoreMode.None);
355+
failingQueryBuilder.innerHit(new InnerHitBuilder());
356+
assertFalse(failingQueryBuilder.innerHit().isIgnoreUnmapped());
353357
failingQueryBuilder.ignoreUnmapped(false);
358+
assertFalse(failingQueryBuilder.innerHit().isIgnoreUnmapped());
354359
QueryShardException e = expectThrows(QueryShardException.class, () -> failingQueryBuilder.toQuery(createShardContext()));
355360
assertThat(e.getMessage(), containsString("[" + HasChildQueryBuilder.NAME +
356361
"] join field [join_field] doesn't hold [unmapped] as a child"));

modules/parent-join/src/test/java/org/elasticsearch/join/query/HasParentQueryBuilderTests.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,7 @@ protected HasParentQueryBuilder doCreateTestQueryBuilder() {
131131
hqb.innerHit(new InnerHitBuilder()
132132
.setName(randomAlphaOfLengthBetween(1, 10))
133133
.setSize(randomIntBetween(0, 100))
134-
.addSort(new FieldSortBuilder(STRING_FIELD_NAME_2).order(SortOrder.ASC))
135-
.setIgnoreUnmapped(hqb.ignoreUnmapped()));
134+
.addSort(new FieldSortBuilder(STRING_FIELD_NAME_2).order(SortOrder.ASC)));
136135
}
137136
return hqb;
138137
}
@@ -244,13 +243,19 @@ public void testFromJson() throws IOException {
244243

245244
public void testIgnoreUnmapped() throws IOException {
246245
final HasParentQueryBuilder queryBuilder = new HasParentQueryBuilder("unmapped", new MatchAllQueryBuilder(), false);
246+
queryBuilder.innerHit(new InnerHitBuilder());
247+
assertFalse(queryBuilder.innerHit().isIgnoreUnmapped());
247248
queryBuilder.ignoreUnmapped(true);
249+
assertTrue(queryBuilder.innerHit().isIgnoreUnmapped());
248250
Query query = queryBuilder.toQuery(createShardContext());
249251
assertThat(query, notNullValue());
250252
assertThat(query, instanceOf(MatchNoDocsQuery.class));
251253

252254
final HasParentQueryBuilder failingQueryBuilder = new HasParentQueryBuilder("unmapped", new MatchAllQueryBuilder(), false);
255+
failingQueryBuilder.innerHit(new InnerHitBuilder());
256+
assertFalse(failingQueryBuilder.innerHit().isIgnoreUnmapped());
253257
failingQueryBuilder.ignoreUnmapped(false);
258+
assertFalse(failingQueryBuilder.innerHit().isIgnoreUnmapped());
254259
QueryShardException e = expectThrows(QueryShardException.class, () -> failingQueryBuilder.toQuery(createShardContext()));
255260
assertThat(e.getMessage(),
256261
containsString("[has_parent] join field [join_field] doesn't hold [unmapped] as a parent"));

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public InnerHitBuilder innerHit() {
132132

133133
public NestedQueryBuilder innerHit(InnerHitBuilder innerHitBuilder) {
134134
this.innerHitBuilder = innerHitBuilder;
135+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
135136
return this;
136137
}
137138

@@ -149,6 +150,9 @@ public ScoreMode scoreMode() {
149150
*/
150151
public NestedQueryBuilder ignoreUnmapped(boolean ignoreUnmapped) {
151152
this.ignoreUnmapped = ignoreUnmapped;
153+
if (innerHitBuilder != null) {
154+
innerHitBuilder.setIgnoreUnmapped(ignoreUnmapped);
155+
}
152156
return this;
153157
}
154158

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,8 @@ public void testBuildIgnoreUnmappedNestQuery() throws Exception {
346346
});
347347
innerHitBuilders.clear();
348348
NestedQueryBuilder query2 = new NestedQueryBuilder("path", new MatchAllQueryBuilder(), ScoreMode.None);
349-
query2.innerHit(leafInnerHits.setIgnoreUnmapped(true));
349+
query2.ignoreUnmapped(true);
350+
query2.innerHit(leafInnerHits);
350351
query2.extractInnerHitBuilders(innerHitBuilders);
351352
assertThat(innerHitBuilders.size(), Matchers.equalTo(1));
352353
assertTrue(innerHitBuilders.containsKey(leafInnerHits.getName()));

0 commit comments

Comments
 (0)