diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 849185b9b050c..b092e974b4c2d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -438,8 +438,7 @@ private static void parseArray(DocumentParserContext context, ObjectMapper paren if (dynamic == ObjectMapper.Dynamic.STRICT) { throw new StrictDynamicMappingException(parentMapper.fullPath(), lastFieldName); } else if (dynamic == ObjectMapper.Dynamic.FALSE) { - // TODO: shouldn't this skip, not parse? - parseNonDynamicArray(context, parentMapper, lastFieldName, lastFieldName); + context.parser().skipChildren(); } else { Mapper objectMapperFromTemplate = dynamic.getDynamicFieldsBuilder().createObjectMapperFromTemplate(context, lastFieldName); if (objectMapperFromTemplate == null) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java index e159f1d038285..4c37429d41dbd 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java @@ -820,4 +820,86 @@ public void testDottedFieldDynamicFalse() throws IOException { assertNull(doc.dynamicMappingsUpdate()); } + + public void testArraysDynamicFalse() throws IOException { + DocumentMapper defaultMapper = createDocumentMapper( + dynamicMapping("false", b -> b.startObject("myarray").field("type", "keyword").endObject()) + ); + + ParsedDocument doc = defaultMapper.parse(source(b -> { + b.array("unmapped", "unknown1", "unknown2"); + b.array("myarray", "array1", "array2"); + })); + + assertThat(doc.rootDoc().getFields("myarray"), arrayWithSize(4)); + assertThat(doc.rootDoc().getFields("unmapped"), arrayWithSize(0)); + assertNull(doc.dynamicMappingsUpdate()); + } + + public void testArraysOfObjectsRootDynamicFalse() throws IOException { + DocumentMapper defaultMapper = createDocumentMapper( + dynamicMapping( + "false", + b -> b.startObject("objects") + .startObject("properties") + .startObject("subfield") + .field("type", "keyword") + .endObject() + .endObject() + .endObject() + ) + ); + + ParsedDocument doc = defaultMapper.parse(source(b -> { + b.startArray("objects"); + b.startObject().field("subfield", "sub").field("unmapped", "unmapped").endObject(); + b.endArray(); + b.startArray("unmapped"); + b.startObject().field("subfield", "unmapped").endObject(); + b.endArray(); + })); + + assertThat(doc.rootDoc().getFields("objects.subfield"), arrayWithSize(2)); + assertThat(doc.rootDoc().getFields("objects.unmapped"), arrayWithSize(0)); + assertThat(doc.rootDoc().getFields("unmapped.subfield"), arrayWithSize(0)); + assertNull(doc.dynamicMappingsUpdate()); + } + + public void testArraysOfObjectsDynamicFalse() throws IOException { + DocumentMapper defaultMapper = createDocumentMapper( + dynamicMapping( + "true", + b -> b.startObject("objects") + .field("dynamic", false) + .startObject("properties") + .startObject("subfield") + .field("type", "keyword") + .endObject() + .endObject() + .endObject() + ) + ); + + ParsedDocument doc = defaultMapper.parse(source(b -> { + b.startArray("objects"); + b.startObject().field("subfield", "sub").field("unmapped", "unmapped").endObject(); + b.endArray(); + b.field("myfield", 2); + })); + + assertThat(doc.rootDoc().getFields("myfield"), arrayWithSize(2)); + assertThat(doc.rootDoc().getFields("objects.subfield"), arrayWithSize(2)); + assertThat(doc.rootDoc().getFields("objects.unmapped"), arrayWithSize(0)); + assertEquals(XContentHelper.stripWhitespace(""" + { + "_doc": { + "dynamic":"true", + "properties":{ + "myfield":{ + "type":"long" + } + } + } + }"""), Strings.toString(doc.dynamicMappingsUpdate())); + } }