Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -465,9 +465,7 @@ protected void doMerge(final ObjectMapper mergeWith) {
this.dynamic = mergeWith.dynamic;
}

if (isEnabled() != mergeWith.isEnabled()) {
throw new MapperException("The [enabled] parameter can't be updated for the object mapping [" + name() + "].");
}
checkObjectMapperParameters(mergeWith);

for (Mapper mergeWithMapper : mergeWith) {
Mapper mergeIntoMapper = mappers.get(mergeWithMapper.simpleName());
Expand All @@ -484,6 +482,22 @@ protected void doMerge(final ObjectMapper mergeWith) {
}
}

private void checkObjectMapperParameters(final ObjectMapper mergeWith) {
if (isEnabled() != mergeWith.isEnabled()) {
throw new MapperException("The [enabled] parameter can't be updated for the object mapping [" + name() + "].");
}

if (nested().isIncludeInParent() != mergeWith.nested().isIncludeInParent()) {
throw new MapperException("The [include_in_parent] parameter can't be updated for the nested object mapping [" +
name() + "].");
}

if (nested().isIncludeInRoot() != mergeWith.nested().isIncludeInRoot()) {
throw new MapperException("The [include_in_root] parameter can't be updated for the nested object mapping [" +
name() + "].");
}
}

@Override
public ObjectMapper updateFieldType(Map<String, MappedFieldType> fullNameToFieldType) {
List<Mapper> updatedMappers = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -742,4 +742,40 @@ public void testReorderParent() throws IOException {
assertThat(doc.docs().get(1).get("nested1.field2"), equalTo("4"));
assertThat(doc.docs().get(2).get("field"), equalTo("value"));
}

public void testMergeNestedMappings() throws IOException {
MapperService mapperService = createIndex("index1", Settings.EMPTY, jsonBuilder().startObject()
.startObject("properties")
.startObject("nested1")
.field("type", "nested")
.endObject()
.endObject().endObject()).mapperService();
ObjectMapper objectMapper1 = mapperService.getObjectMapper("nested1");

mapperService = createIndex("index2", Settings.EMPTY, jsonBuilder().startObject()
.startObject("properties")
.startObject("nested1")
.field("type", "nested")
.field("include_in_parent", true)
.endObject()
.endObject().endObject()).mapperService();
ObjectMapper objectMapper2 = mapperService.getObjectMapper("nested1");

// cannot update `include_in_parent` dynamically
MapperException e1 = expectThrows(MapperException.class, () -> objectMapper1.merge(objectMapper2));
assertEquals("The [include_in_parent] parameter can't be updated for the nested object mapping [nested1].", e1.getMessage());

mapperService = createIndex("index3", Settings.EMPTY, jsonBuilder().startObject()
.startObject("properties")
.startObject("nested1")
.field("type", "nested")
.field("include_in_root", true)
.endObject()
.endObject().endObject()).mapperService();
ObjectMapper objectMapper3 = mapperService.getObjectMapper("nested1");

// cannot update `include_in_root` dynamically
MapperException e2 = expectThrows(MapperException.class, () -> objectMapper1.merge(objectMapper3));
assertEquals("The [include_in_root] parameter can't be updated for the nested object mapping [nested1].", e2.getMessage());
}
}