Skip to content

Commit e23557c

Browse files
alexshadow007jpountz
authored andcommitted
Fix merging of _meta field (#27352)
1 parent 705fe2b commit e23557c

File tree

3 files changed

+47
-3
lines changed

3 files changed

+47
-3
lines changed

core/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static class Builder {
5656

5757
private final RootObjectMapper rootObjectMapper;
5858

59-
private Map<String, Object> meta = emptyMap();
59+
private Map<String, Object> meta;
6060

6161
private final Mapper.BuilderContext builderContext;
6262

core/src/main/java/org/elasticsearch/index/mapper/Mapping.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public Mapping merge(Mapping mergeWith, boolean updateAllTypes) {
9898
}
9999
mergedMetaDataMappers.put(merged.getClass(), merged);
100100
}
101-
return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), mergeWith.meta);
101+
Map<String, Object> mergedMeta = mergeWith.meta == null ? meta : mergeWith.meta;
102+
return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), mergedMeta);
102103
}
103104

104105
/**
@@ -128,7 +129,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
128129
root.toXContent(builder, params, new ToXContent() {
129130
@Override
130131
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
131-
if (meta != null && !meta.isEmpty()) {
132+
if (meta != null) {
132133
builder.field("_meta", meta);
133134
}
134135
for (Mapper mapper : metadataMappers) {

core/src/test/java/org/elasticsearch/index/mapper/DocumentMapperMergeTests.java

+43
Original file line numberDiff line numberDiff line change
@@ -289,4 +289,47 @@ public void testMergeAddingParent() throws IOException {
289289
Exception e = expectThrows(IllegalArgumentException.class, () -> initMapper.merge(updatedMapper.mapping(), false));
290290
assertThat(e.getMessage(), containsString("The _parent field's type option can't be changed: [null]->[parent]"));
291291
}
292+
293+
public void testMergeMeta() throws IOException {
294+
DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
295+
296+
String initMapping = XContentFactory.jsonBuilder()
297+
.startObject()
298+
.startObject("test")
299+
.startObject("_meta")
300+
.field("foo").value("bar")
301+
.endObject()
302+
.endObject()
303+
.endObject()
304+
.string();
305+
DocumentMapper initMapper = parser.parse("test", new CompressedXContent(initMapping));
306+
307+
assertThat(initMapper.meta().get("foo"), equalTo("bar"));
308+
309+
String updateMapping = XContentFactory.jsonBuilder()
310+
.startObject()
311+
.startObject("test")
312+
.startObject("properties")
313+
.startObject("name").field("type", "text").endObject()
314+
.endObject()
315+
.endObject()
316+
.endObject()
317+
.string();
318+
DocumentMapper updatedMapper = parser.parse("test", new CompressedXContent(updateMapping));
319+
320+
assertThat(initMapper.merge(updatedMapper.mapping(), true).meta().get("foo"), equalTo("bar"));
321+
322+
updateMapping = XContentFactory.jsonBuilder()
323+
.startObject()
324+
.startObject("test")
325+
.startObject("_meta")
326+
.field("foo").value("new_bar")
327+
.endObject()
328+
.endObject()
329+
.endObject()
330+
.string();
331+
updatedMapper = parser.parse("test", new CompressedXContent(updateMapping));
332+
333+
assertThat(initMapper.merge(updatedMapper.mapping(), true).meta().get("foo"), equalTo("new_bar"));
334+
}
292335
}

0 commit comments

Comments
 (0)