From 3155057851a231a5b30b579c3ed61bf01dd598dd Mon Sep 17 00:00:00 2001 From: Alexander Kazakov Date: Sun, 12 Nov 2017 01:33:24 +0300 Subject: [PATCH 1/3] Fix merging of _meta field --- .../index/mapper/DocumentMapper.java | 2 +- .../elasticsearch/index/mapper/Mapping.java | 3 +- .../mapper/DocumentMapperMergeTests.java | 43 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) 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..b1be32cc92a45 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); + return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), + mergeWith.meta != null ? mergeWith.meta : meta); } /** 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")); + } } From c1379460230306eda3d5530e416bceea86c3b89c Mon Sep 17 00:00:00 2001 From: Alexander Kazakov Date: Fri, 17 Nov 2017 00:08:48 +0300 Subject: [PATCH 2/3] Using local variable for merged meta --- .../src/main/java/org/elasticsearch/index/mapper/Mapping.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b1be32cc92a45..40ba72ce27d5e 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java @@ -98,8 +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 != null ? mergeWith.meta : meta); + Map mergedMeta = mergeWith.meta == null ? meta : mergeWith.meta; + return new Mapping(indexCreated, mergedRoot, mergedMetaDataMappers.values().toArray(new MetadataFieldMapper[0]), mergedMeta); } /** From 76645cd1e41ad1af8d946558fb550d8d60670f7a Mon Sep 17 00:00:00 2001 From: Alexander Kazakov Date: Fri, 17 Nov 2017 00:27:17 +0300 Subject: [PATCH 3/3] Remove meta empty case from Mapping::toXContent --- core/src/main/java/org/elasticsearch/index/mapper/Mapping.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 40ba72ce27d5e..8a90de4d47aa5 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/Mapping.java @@ -129,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) {