diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java index c4de559d1d956..e1e33739ac4b5 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java @@ -56,7 +56,7 @@ public static class Builder { private final RootObjectMapper rootObjectMapper; - private Map meta = emptyMap(); + private Map meta; private final Mapper.BuilderContext builderContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java b/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java index 6b58c35a66b3f..8a90de4d47aa5 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java @@ -98,7 +98,8 @@ public Mapping merge(Mapping mergeWith, boolean updateAllTypes) { } mergedMetaDataMappers.put(merged.getClass(), merged); } - return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), mergeWith.meta); + Map mergedMeta = mergeWith.meta == null ? meta : mergeWith.meta; + return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), mergedMeta); } /** @@ -128,7 +129,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws root.toXContent(builder, params, new ToXContent() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - if (meta != null && !meta.isEmpty()) { + if (meta != null) { builder.field("_meta", meta); } for (Mapper mapper : metadataMappers) { diff --git a/core/src/test/java/org/elasticsearch/index/mapper/DocumentMapperMergeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/DocumentMapperMergeTests.java index e0f3bb9ccb1d3..68389112bfd51 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/DocumentMapperMergeTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/DocumentMapperMergeTests.java @@ -289,4 +289,47 @@ public void testMergeAddingParent() throws IOException { Exception e = expectThrows(IllegalArgumentException.class, () -> initMapper.merge(updatedMapper.mapping(), false)); assertThat(e.getMessage(), containsString("The _parent field's type option can't be changed: [null]->[parent]")); } + + public void testMergeMeta() throws IOException { + DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser(); + + String initMapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("test") + .startObject("_meta") + .field("foo").value("bar") + .endObject() + .endObject() + .endObject() + .string(); + DocumentMapper initMapper = parser.parse("test", new CompressedXContent(initMapping)); + + assertThat(initMapper.meta().get("foo"), equalTo("bar")); + + String updateMapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("test") + .startObject("properties") + .startObject("name").field("type", "text").endObject() + .endObject() + .endObject() + .endObject() + .string(); + DocumentMapper updatedMapper = parser.parse("test", new CompressedXContent(updateMapping)); + + assertThat(initMapper.merge(updatedMapper.mapping(), true).meta().get("foo"), equalTo("bar")); + + updateMapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("test") + .startObject("_meta") + .field("foo").value("new_bar") + .endObject() + .endObject() + .endObject() + .string(); + updatedMapper = parser.parse("test", new CompressedXContent(updateMapping)); + + assertThat(initMapper.merge(updatedMapper.mapping(), true).meta().get("foo"), equalTo("new_bar")); + } }