diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 403162cf7fc..2551b0774a8 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -104,8 +104,9 @@ class DocumentParser implements Closeable { if (token != XContentParser.Token.START_OBJECT) { throw new MapperParsingException("Malformed content, must start with an object"); } + + boolean emptyDoc = false; if (mapping.root.isEnabled()) { - boolean emptyDoc = false; token = parser.nextToken(); if (token == XContentParser.Token.END_OBJECT) { // empty doc, we can handle it... @@ -113,23 +114,24 @@ class DocumentParser implements Closeable { } else if (token != XContentParser.Token.FIELD_NAME) { throw new MapperParsingException("Malformed content, after first object, either the type field or the actual properties should exist"); } + } - for (MetadataFieldMapper metadataMapper : mapping.metadataMappers) { - metadataMapper.preParse(context); - } - if (emptyDoc == false) { - Mapper update = parseObject(context, mapping.root); - if (update != null) { - context.addDynamicMappingsUpdate(update); - } - } - for (MetadataFieldMapper metadataMapper : mapping.metadataMappers) { - metadataMapper.postParse(context); - } + for (MetadataFieldMapper metadataMapper : mapping.metadataMappers) { + metadataMapper.preParse(context); + } - } else { + if (mapping.root.isEnabled() == false) { // entire type is disabled parser.skipChildren(); + } else if (emptyDoc == false) { + Mapper update = parseObject(context, mapping.root); + if (update != null) { + context.addDynamicMappingsUpdate(update); + } + } + + for (MetadataFieldMapper metadataMapper : mapping.metadataMappers) { + metadataMapper.postParse(context); } // try to parse the next token, this should be null if the object is ended properly diff --git a/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java b/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java index 454f8e814d4..fccf642e9df 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java @@ -19,12 +19,9 @@ package org.elasticsearch.index.mapper; -import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.json.JsonXContent; -import org.elasticsearch.common.xcontent.json.JsonXContentParser; +import org.elasticsearch.index.mapper.internal.UidFieldMapper; import org.elasticsearch.test.ESSingleNodeTestCase; // TODO: make this a real unit test @@ -37,11 +34,12 @@ public class DocumentParserTests extends ESSingleNodeTestCase { DocumentMapper mapper = mapperParser.parse(mapping); BytesReference bytes = XContentFactory.jsonBuilder() - .startObject() + .startObject().startObject("foo") .field("field", "1234") - .endObject().bytes(); + .endObject().endObject().bytes(); ParsedDocument doc = mapper.parse("test", "type", "1", bytes); assertNull(doc.rootDoc().getField("field")); + assertNotNull(doc.rootDoc().getField(UidFieldMapper.NAME)); } public void testFieldDisabled() throws Exception { @@ -60,5 +58,6 @@ public class DocumentParserTests extends ESSingleNodeTestCase { ParsedDocument doc = mapper.parse("test", "type", "1", bytes); assertNull(doc.rootDoc().getField("foo")); assertNotNull(doc.rootDoc().getField("bar")); + assertNotNull(doc.rootDoc().getField(UidFieldMapper.NAME)); } }