From af79926338b77d2d8ec1d335b01e473464312260 Mon Sep 17 00:00:00 2001 From: asettouf Date: Wed, 3 May 2017 23:28:23 +0200 Subject: [PATCH] Modifying metadata checking in document parser to use mapperRegistry and fix issue #24422 --- .../java/org/elasticsearch/index/mapper/DocumentParser.java | 3 ++- .../java/org/elasticsearch/index/mapper/MapperService.java | 4 ++++ .../org/elasticsearch/index/mapper/DocumentParserTests.java | 2 +- .../org/elasticsearch/index/mapper/MapperServiceTests.java | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) 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 489f4702bc36c..dc7b40b5167da 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -376,6 +376,7 @@ static void parseObjectOrNested(ParseContext context, ObjectMapper mapper, boole } private static void innerParseObject(ParseContext context, ObjectMapper mapper, XContentParser parser, String currentFieldName, XContentParser.Token token) throws IOException { + MapperService mapperService = context.docMapperParser().mapperService; while (token != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.START_OBJECT) { parseObject(context, mapper, currentFieldName); @@ -383,7 +384,7 @@ private static void innerParseObject(ParseContext context, ObjectMapper mapper, parseArray(context, mapper, currentFieldName); } else if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); - if (MapperService.isMetadataField(context.path().pathAsText(currentFieldName))) { + if (mapperService.isMetaDataFieldInMetaDataRegistry(context.path().pathAsText(currentFieldName))) { throw new MapperParsingException("Field [" + currentFieldName + "] is a metadata field and cannot be added inside a document. Use the index API request parameters."); } } else if (token == XContentParser.Token.VALUE_NULL) { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java index cca285198ef33..8ebce0bc708eb 100755 --- a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java @@ -769,6 +769,10 @@ public void close() throws IOException { indexAnalyzers.close(); } + public boolean isMetaDataFieldInMetaDataRegistry(String fieldName){ + return mapperRegistry.getMetadataMapperParsers().containsKey(fieldName); + } + /** * @return Whether a field is a metadata field. */ 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 cd4d1d21c6cd0..69a61fbb97ff6 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/DocumentParserTests.java @@ -941,7 +941,7 @@ public void testDocumentContainsMetadataField() throws Exception { String mapping = XContentFactory.jsonBuilder().startObject().startObject("type").endObject().endObject().string(); DocumentMapper mapper = mapperParser.parse("type", new CompressedXContent(mapping)); - BytesReference bytes = XContentFactory.jsonBuilder().startObject().field("_ttl", 0).endObject().bytes(); + BytesReference bytes = XContentFactory.jsonBuilder().startObject().field("_index", 0).endObject().bytes(); MapperParsingException e = expectThrows(MapperParsingException.class, () -> mapper.parse(SourceToParse.source("test", "type", "1", bytes, XContentType.JSON))); assertTrue(e.getMessage(), e.getMessage().contains("cannot be added inside a document")); diff --git a/core/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java b/core/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java index 4d467d641d9fa..237da5e8f09a2 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java @@ -321,4 +321,10 @@ public void testForbidMultipleTypes() throws IOException { () -> mapperService.merge("type2", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE, randomBoolean())); assertThat(e.getMessage(), Matchers.startsWith("Rejecting mapping update to [test] as the final mapping would have more than 1 type: ")); } + + public void testFieldIsMetadata(){ + MapperService mapperService = createIndex("test").mapperService(); + String field = "_field_names"; + assertTrue("'_field_names' not recognized as a meta data field", mapperService.isMetaDataFieldInMetaDataRegistry(field)); + } }