From 63b7d9911539c488ac3d07605d90b81110e067e5 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Thu, 17 Mar 2022 22:32:50 +0100 Subject: [PATCH 1/3] Don't parse unmapped array field when dynamic is set to false --- .../java/org/elasticsearch/index/mapper/DocumentParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 5f6571579fd17..87d2439be68c6 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -433,8 +433,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) { From 2a49a707c3a14c55e1dfb421508a9f28315344b5 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 23 Mar 2022 21:13:17 +0100 Subject: [PATCH 2/3] add tests for array parsing with dynamic set to false --- .../index/mapper/DynamicMappingTests.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) 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..2eb7b8c42dc1f 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,85 @@ 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").endObject(); + b.endArray(); + b.startArray("objects"); + b.startObject().field("unmapped", "unmapped").endObject(); + b.endArray(); + })); + + assertThat(doc.rootDoc().getFields("objects.subfield"), arrayWithSize(2)); + assertThat(doc.rootDoc().getFields("objects.unmapped"), 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())); + } } From 97d3abfac70fd6efd4b4e5a484521376218a1be9 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 23 Mar 2022 21:54:51 +0100 Subject: [PATCH 3/3] fix test --- .../elasticsearch/index/mapper/DynamicMappingTests.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 2eb7b8c42dc1f..4c37429d41dbd 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java @@ -852,15 +852,16 @@ public void testArraysOfObjectsRootDynamicFalse() throws IOException { ParsedDocument doc = defaultMapper.parse(source(b -> { b.startArray("objects"); - b.startObject().field("subfield", "sub").endObject(); + b.startObject().field("subfield", "sub").field("unmapped", "unmapped").endObject(); b.endArray(); - b.startArray("objects"); - b.startObject().field("unmapped", "unmapped").endObject(); + 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()); }