From 4cbddaca5489c5d1e4876697301d18c52015d6c9 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Tue, 17 Jan 2023 12:18:28 +0000 Subject: [PATCH 1/2] Move type information entirely into MappingMetadata --- .../index/mapper/MapperServiceFactory.java | 3 +- .../search/QueryParserHelperBenchmark.java | 3 +- .../DataStreamIndexSettingsProvider.java | 3 +- .../RankFeatureMetaFieldMapperTests.java | 29 +- .../extras/RankFeatureQueryBuilderTests.java | 22 +- .../join/query/HasChildQueryBuilderTests.java | 5 +- .../query/HasParentQueryBuilderTests.java | 6 +- .../join/query/ParentIdQueryBuilderTests.java | 5 +- .../percolator/CandidateQueryTests.java | 87 +++-- .../PercolateQueryBuilderTests.java | 11 +- .../PercolateWithNestedQueryBuilderTests.java | 5 +- .../PercolatorFieldMapperTests.java | 238 ++++++------- .../indices/create/CreateSystemIndicesIT.java | 3 +- .../aliases/NetNewSystemIndexAliasIT.java | 2 + .../indices/SystemIndexManagerIT.java | 6 +- .../indices/TestSystemIndexDescriptor.java | 6 +- .../indices/create/CreateIndexRequest.java | 7 +- .../mapping/put/PutMappingRequest.java | 31 +- .../TransportSimulateIndexTemplateAction.java | 3 +- .../action/bulk/TransportShardBulkAction.java | 4 +- .../cluster/metadata/IndexMetadata.java | 8 +- .../cluster/metadata/MappingMetadata.java | 64 ++-- .../cluster/metadata/Metadata.java | 13 +- .../metadata/MetadataCreateIndexService.java | 4 +- .../MetadataIndexTemplateService.java | 4 +- .../metadata/MetadataMappingService.java | 8 +- .../MetadataMigrateToDataStreamService.java | 14 +- .../index/mapper/MapperService.java | 31 +- .../index/mapper/MappingParser.java | 37 +- .../indices/SystemIndexManager.java | 6 +- .../admin/indices/RestPutMappingAction.java | 4 +- .../snapshots/RestoreService.java | 10 +- .../tasks/TaskResultsService.java | 3 +- .../cluster/stats/MappingStatsTests.java | 8 +- .../metadata/MetadataMappingServiceTests.java | 8 +- ...tadataMigrateToDataStreamServiceTests.java | 2 +- .../index/codec/PerFieldMapperCodecTests.java | 7 +- .../fielddata/BinaryDVFieldDataTests.java | 30 +- .../index/mapper/CamelCaseFieldNameTests.java | 4 +- .../index/mapper/DocumentMapperTests.java | 3 +- .../index/mapper/DynamicTemplatesTests.java | 127 ++++--- .../mapper/JavaMultiFieldMergeTests.java | 14 +- .../index/mapper/MapperServiceTests.java | 3 +- .../index/mapper/MappingParserTests.java | 46 +-- .../index/mapper/NestedObjectMapperTests.java | 9 +- .../index/mapper/ObjectMapperTests.java | 48 +-- .../index/mapper/ParametrizedMapperTests.java | 3 +- ...angeFieldQueryStringQueryBuilderTests.java | 35 +- .../index/mapper/ReloadableAnalyzerTests.java | 49 ++- .../index/mapper/RootObjectMapperTests.java | 7 +- .../index/mapper/UpdateMappingTests.java | 67 ++-- .../vectors/SparseVectorFieldMapperTests.java | 61 ++-- .../query/IntervalQueryBuilderTests.java | 3 +- .../index/query/MatchQueryBuilderTests.java | 8 +- .../index/query/NestedQueryBuilderTests.java | 42 +-- .../query/QueryStringQueryBuilderTests.java | 3 +- .../index/query/RangeQueryRewriteTests.java | 51 ++- .../query/SpanMultiTermQueryBuilderTests.java | 4 +- .../query/TermsSetQueryBuilderTests.java | 6 +- .../search/MultiMatchQueryParserTests.java | 55 ++- .../index/shard/IndexShardTests.java | 2 +- .../index/similarity/SimilarityTests.java | 3 +- .../search/geo/GeoPointShapeQueryTests.java | 2 + .../CategoryContextMappingTests.java | 316 ++++++++---------- .../vectors/KnnVectorQueryBuilderTests.java | 10 +- .../index/engine/EngineTestCase.java | 4 +- .../index/mapper/MapperServiceTestCase.java | 15 +- .../index/mapper/MetadataMapperTestCase.java | 9 +- .../geo/BasePointShapeQueryTestCase.java | 2 + .../search/geo/BaseShapeQueryTestCase.java | 4 + .../test/AbstractBuilderTestCase.java | 80 ++--- .../org/elasticsearch/test/ESTestCase.java | 6 + .../deprecation/IndexDeprecationChecks.java | 27 +- .../ConstantKeywordFieldMapperTests.java | 5 +- .../downsample/TransportRollupAction.java | 10 +- .../DownsampleActionSingleNodeTests.java | 5 +- .../support/SecurityIndexManager.java | 2 +- ...oBoundingBoxQueryBuilderGeoShapeTests.java | 4 +- .../GeoDistanceQueryBuilderGeoShapeTests.java | 4 +- .../index/query/GeoGridQueryBuilderTests.java | 3 +- .../GeoShapeQueryBuilderGeoShapeTests.java | 4 +- ...eoShapeWithDocValuesQueryBuilderTests.java | 8 +- .../ShapeQueryBuilderOverPointTests.java | 5 +- .../ShapeQueryBuilderOverShapeTests.java | 5 +- 84 files changed, 901 insertions(+), 1022 deletions(-) diff --git a/benchmarks/src/main/java/org/elasticsearch/benchmark/index/mapper/MapperServiceFactory.java b/benchmarks/src/main/java/org/elasticsearch/benchmark/index/mapper/MapperServiceFactory.java index 8793e7354f39a..b89a97da4cfbc 100644 --- a/benchmarks/src/main/java/org/elasticsearch/benchmark/index/mapper/MapperServiceFactory.java +++ b/benchmarks/src/main/java/org/elasticsearch/benchmark/index/mapper/MapperServiceFactory.java @@ -12,6 +12,7 @@ import org.elasticsearch.Version; import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; @@ -72,7 +73,7 @@ public T compile(Script script, ScriptContext scriptContext) { ); try { - mapperService.merge("_doc", new CompressedXContent(mappings), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mappings)), MapperService.MergeReason.MAPPING_UPDATE); return mapperService; } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/benchmarks/src/main/java/org/elasticsearch/benchmark/search/QueryParserHelperBenchmark.java b/benchmarks/src/main/java/org/elasticsearch/benchmark/search/QueryParserHelperBenchmark.java index 0b30f9dd4220d..f55c582a379d9 100644 --- a/benchmarks/src/main/java/org/elasticsearch/benchmark/search/QueryParserHelperBenchmark.java +++ b/benchmarks/src/main/java/org/elasticsearch/benchmark/search/QueryParserHelperBenchmark.java @@ -20,6 +20,7 @@ import org.elasticsearch.Version; import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -193,7 +194,7 @@ public T compile(Script script, ScriptContext scriptContext) { ); try { - mapperService.merge("_doc", new CompressedXContent(mappings), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mappings)), MapperService.MergeReason.MAPPING_UPDATE); return mapperService; } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/modules/data-streams/src/main/java/org/elasticsearch/datastreams/DataStreamIndexSettingsProvider.java b/modules/data-streams/src/main/java/org/elasticsearch/datastreams/DataStreamIndexSettingsProvider.java index ee085aab09ec3..23d3b92dbce90 100644 --- a/modules/data-streams/src/main/java/org/elasticsearch/datastreams/DataStreamIndexSettingsProvider.java +++ b/modules/data-streams/src/main/java/org/elasticsearch/datastreams/DataStreamIndexSettingsProvider.java @@ -10,6 +10,7 @@ import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.DataStream; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.compress.CompressedXContent; @@ -159,7 +160,7 @@ private List findRoutingPaths(String indexName, Settings allSettings, Li // Create MapperService just to extract keyword dimension fields: try (var mapperService = mapperServiceFactory.apply(tmpIndexMetadata.build())) { for (var mapping : combinedTemplateMappings) { - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, mapping, MapperService.MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); } List routingPaths = new ArrayList<>(); diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapperTests.java index 7e844bce63c71..3e4e7daee9896 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapperTests.java @@ -8,6 +8,7 @@ package org.elasticsearch.index.mapper.extras; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; @@ -18,6 +19,7 @@ import org.elasticsearch.index.mapper.Mapping; import org.elasticsearch.index.mapper.SourceToParse; import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentType; import org.hamcrest.CoreMatchers; @@ -33,20 +35,18 @@ protected Collection getPlugins() { } public void testBasics() throws Exception { - String mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject("field") - .field("type", "rank_feature") - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject("field") + .field("type", "rank_feature") + .endObject() + .endObject() + .endObject() + .endObject(); - Mapping parsedMapping = createMapperService(mapping).parseMapping("type", new CompressedXContent(mapping)); + Mapping parsedMapping = createMapperService(mapping).parseMapping(toMappingMetadata(mapping)); assertEquals(mapping, parsedMapping.toCompressedXContent().toString()); assertNotNull(parsedMapping.getMetadataMapperByClass(RankFeatureMetaFieldMapper.class)); } @@ -58,8 +58,7 @@ public void testBasics() throws Exception { public void testDocumentParsingFailsOnMetaField() throws Exception { String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("_doc").endObject().endObject()); DocumentMapper mapper = createMapperService(mapping).merge( - "_doc", - new CompressedXContent(mapping), + new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE ); String rfMetaField = RankFeatureMetaFieldMapper.CONTENT_TYPE; diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureQueryBuilderTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureQueryBuilderTests.java index 32446c3c27391..6f5a6aa207359 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureQueryBuilderTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureQueryBuilderTests.java @@ -12,6 +12,7 @@ import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MapperService; @@ -34,16 +35,17 @@ public class RankFeatureQueryBuilderTests extends AbstractQueryTestCase { - private static final String TYPE = "_doc"; private static final String PARENT_DOC = "parent"; private static final String CHILD_DOC = "child"; @@ -120,7 +117,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws .endObject() .endObject(); - mapperService.merge(TYPE, new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); } /** diff --git a/modules/parent-join/src/test/java/org/elasticsearch/join/query/HasParentQueryBuilderTests.java b/modules/parent-join/src/test/java/org/elasticsearch/join/query/HasParentQueryBuilderTests.java index d70133006d84f..34d7367087097 100644 --- a/modules/parent-join/src/test/java/org/elasticsearch/join/query/HasParentQueryBuilderTests.java +++ b/modules/parent-join/src/test/java/org/elasticsearch/join/query/HasParentQueryBuilderTests.java @@ -13,8 +13,6 @@ import org.apache.lucene.search.join.ScoreMode; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.Version; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.IdsQueryBuilder; import org.elasticsearch.index.query.InnerHitBuilder; @@ -51,7 +49,7 @@ import static org.mockito.Mockito.when; public class HasParentQueryBuilderTests extends AbstractQueryTestCase { - private static final String TYPE = "_doc"; + private static final String PARENT_DOC = "parent"; private static final String CHILD_DOC = "child"; @@ -98,7 +96,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws .endObject() .endObject(); - mapperService.merge(TYPE, new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); } /** diff --git a/modules/parent-join/src/test/java/org/elasticsearch/join/query/ParentIdQueryBuilderTests.java b/modules/parent-join/src/test/java/org/elasticsearch/join/query/ParentIdQueryBuilderTests.java index 19a268bc73391..0ac45f0d83198 100644 --- a/modules/parent-join/src/test/java/org/elasticsearch/join/query/ParentIdQueryBuilderTests.java +++ b/modules/parent-join/src/test/java/org/elasticsearch/join/query/ParentIdQueryBuilderTests.java @@ -15,8 +15,6 @@ import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.QueryShardException; import org.elasticsearch.index.query.SearchExecutionContext; @@ -40,7 +38,6 @@ public class ParentIdQueryBuilderTests extends AbstractQueryTestCase { - private static final String TYPE = "_doc"; private static final String JOIN_FIELD_NAME = "join_field"; private static final String PARENT_NAME = "parent"; private static final String CHILD_NAME = "child"; @@ -86,7 +83,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws .endObject() .endObject(); - mapperService.merge(TYPE, new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); } @Override diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java index 52422a35a4079..fd33f08881d2f 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java @@ -66,10 +66,8 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; -import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; import org.elasticsearch.common.settings.Settings; @@ -86,6 +84,7 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.test.VersionUtils; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.junit.After; import org.junit.Before; @@ -136,52 +135,48 @@ public void init() throws Exception { indexService = createIndex(indexName, Settings.EMPTY); mapperService = indexService.mapperService(); - String mapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject("int_field") - .field("type", "integer") - .endObject() - .startObject("long_field") - .field("type", "long") - .endObject() - .startObject("half_float_field") - .field("type", "half_float") - .endObject() - .startObject("float_field") - .field("type", "float") - .endObject() - .startObject("double_field") - .field("type", "double") - .endObject() - .startObject("ip_field") - .field("type", "ip") - .endObject() - .startObject("field") - .field("type", "keyword") - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge("type", new CompressedXContent(mapper), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder mappings = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject("int_field") + .field("type", "integer") + .endObject() + .startObject("long_field") + .field("type", "long") + .endObject() + .startObject("half_float_field") + .field("type", "half_float") + .endObject() + .startObject("float_field") + .field("type", "float") + .endObject() + .startObject("double_field") + .field("type", "double") + .endObject() + .startObject("ip_field") + .field("type", "ip") + .endObject() + .startObject("field") + .field("type", "keyword") + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(mappings), MapperService.MergeReason.MAPPING_UPDATE); String queryField = "query_field"; - String percolatorMapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject(queryField) - .field("type", "percolator") - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge("type", new CompressedXContent(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); + mappings = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject(queryField) + .field("type", "percolator") + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(mappings), MapperService.MergeReason.MAPPING_UPDATE); fieldMapper = (PercolatorFieldMapper) mapperService.documentMapper().mappers().getMapper(queryField); fieldType = (PercolatorFieldMapper.PercolatorFieldType) fieldMapper.fieldType(); diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateQueryBuilderTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateQueryBuilderTests.java index f7c01bec3b2cd..0b26d65c7f6de 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateQueryBuilderTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateQueryBuilderTests.java @@ -17,7 +17,6 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.lucene.uid.Versions; import org.elasticsearch.core.RestApiVersion; @@ -86,17 +85,11 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws docType = "_doc"; mapperService.merge( - docType, - new CompressedXContent( - Strings.toString( - PutMappingRequest.simpleMapping(queryField, "type=percolator", aliasField, "type=alias,path=" + queryField) - ) - ), + toMappingMetadata(PutMappingRequest.simpleMapping(queryField, "type=percolator", aliasField, "type=alias,path=" + queryField)), MapperService.MergeReason.MAPPING_UPDATE ); mapperService.merge( - docType, - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping(TEXT_FIELD_NAME, "type=text"))), + toMappingMetadata(PutMappingRequest.simpleMapping(TEXT_FIELD_NAME, "type=text")), MapperService.MergeReason.MAPPING_UPDATE ); } diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateWithNestedQueryBuilderTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateWithNestedQueryBuilderTests.java index cbfab4a61aeb0..9d387d97a14fe 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateWithNestedQueryBuilderTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolateWithNestedQueryBuilderTests.java @@ -9,9 +9,7 @@ package org.elasticsearch.percolator; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.SearchExecutionContext; @@ -25,8 +23,7 @@ public class PercolateWithNestedQueryBuilderTests extends PercolateQueryBuilderT protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { super.initializeAdditionalMappings(mapperService); mapperService.merge( - "_doc", - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping("some_nested_object", "type=nested"))), + toMappingMetadata(PutMappingRequest.simpleMapping("some_nested_object", "type=nested")), MapperService.MergeReason.MAPPING_UPDATE ); } diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java index ed8610574ba43..2aea0b0057db1 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java @@ -34,7 +34,6 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.hash.MurmurHash3; import org.elasticsearch.common.io.stream.InputStreamStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; @@ -135,72 +134,68 @@ public void init() throws Exception { indexService = createIndex("test"); mapperService = indexService.mapperService(); - String mapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("doc") - .startObject("properties") - .startObject("field") - .field("type", "text") - .endObject() - .startObject("field1") - .field("type", "text") - .endObject() - .startObject("field2") - .field("type", "text") - .endObject() - .startObject("_field3") - .field("type", "text") - .endObject() - .startObject("field4") - .field("type", "text") - .endObject() - .startObject("number_field1") - .field("type", "integer") - .endObject() - .startObject("number_field2") - .field("type", "long") - .endObject() - .startObject("number_field3") - .field("type", "long") - .endObject() - .startObject("number_field4") - .field("type", "half_float") - .endObject() - .startObject("number_field5") - .field("type", "float") - .endObject() - .startObject("number_field6") - .field("type", "double") - .endObject() - .startObject("number_field7") - .field("type", "ip") - .endObject() - .startObject("date_field") - .field("type", "date") - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge("doc", new CompressedXContent(mapper), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder mapper = XContentFactory.jsonBuilder() + .startObject() + .startObject("doc") + .startObject("properties") + .startObject("field") + .field("type", "text") + .endObject() + .startObject("field1") + .field("type", "text") + .endObject() + .startObject("field2") + .field("type", "text") + .endObject() + .startObject("_field3") + .field("type", "text") + .endObject() + .startObject("field4") + .field("type", "text") + .endObject() + .startObject("number_field1") + .field("type", "integer") + .endObject() + .startObject("number_field2") + .field("type", "long") + .endObject() + .startObject("number_field3") + .field("type", "long") + .endObject() + .startObject("number_field4") + .field("type", "half_float") + .endObject() + .startObject("number_field5") + .field("type", "float") + .endObject() + .startObject("number_field6") + .field("type", "double") + .endObject() + .startObject("number_field7") + .field("type", "ip") + .endObject() + .startObject("date_field") + .field("type", "date") + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(mapper), MapperService.MergeReason.MAPPING_UPDATE); } private void addQueryFieldMappings() throws Exception { fieldName = randomAlphaOfLength(4); - String percolatorMapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("doc") - .startObject("properties") - .startObject(fieldName) - .field("type", "percolator") - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge("doc", new CompressedXContent(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder percolatorMapper = XContentFactory.jsonBuilder() + .startObject() + .startObject("doc") + .startObject("properties") + .startObject(fieldName) + .field("type", "percolator") + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); fieldType = (PercolatorFieldMapper.PercolatorFieldType) mapperService.fieldType(fieldName); } @@ -616,23 +611,21 @@ public void testAllowNoAdditionalSettings() throws Exception { addQueryFieldMappings(); IndexService indexServiceWithoutSettings = createIndex("test1", Settings.EMPTY); - String percolatorMapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("doc") - .startObject("properties") - .startObject(fieldName) - .field("type", "percolator") - .field("index", "no") - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder percolatorMapper = XContentFactory.jsonBuilder() + .startObject() + .startObject("doc") + .startObject("properties") + .startObject(fieldName) + .field("type", "percolator") + .field("index", "no") + .endObject() + .endObject() + .endObject() + .endObject(); MapperParsingException e = expectThrows( MapperParsingException.class, () -> indexServiceWithoutSettings.mapperService() - .merge("doc", new CompressedXContent(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE) + .merge(toMappingMetadata(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), containsString("Mapping definition for [" + fieldName + "] has unsupported parameters: [index : no]")); } @@ -640,22 +633,20 @@ public void testAllowNoAdditionalSettings() throws Exception { // multiple percolator fields are allowed in the mapping, but only one field can be used at index time. public void testMultiplePercolatorFields() throws Exception { String typeName = "doc"; - String percolatorMapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject(typeName) - .startObject("properties") - .startObject("query_field1") - .field("type", "percolator") - .endObject() - .startObject("query_field2") - .field("type", "percolator") - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge(typeName, new CompressedXContent(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder percolatorMapper = XContentFactory.jsonBuilder() + .startObject() + .startObject(typeName) + .startObject("properties") + .startObject("query_field1") + .field("type", "percolator") + .endObject() + .startObject("query_field2") + .field("type", "percolator") + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); QueryBuilder queryBuilder = matchQuery("field", "value"); ParsedDocument doc = mapperService.documentMapper() @@ -679,24 +670,22 @@ public void testMultiplePercolatorFields() throws Exception { // percolator field can be nested under an object field, but only one query can be specified per document public void testNestedPercolatorField() throws Exception { String typeName = "doc"; - String percolatorMapper = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject(typeName) - .startObject("properties") - .startObject("object_field") - .field("type", "object") - .startObject("properties") - .startObject("query_field") - .field("type", "percolator") - .endObject() - .endObject() - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge(typeName, new CompressedXContent(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder percolatorMapper = XContentFactory.jsonBuilder() + .startObject() + .startObject(typeName) + .startObject("properties") + .startObject("object_field") + .field("type", "object") + .startObject("properties") + .startObject("query_field") + .field("type", "percolator") + .endObject() + .endObject() + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(percolatorMapper), MapperService.MergeReason.MAPPING_UPDATE); QueryBuilder queryBuilder = matchQuery("field", "value"); ParsedDocument doc = mapperService.documentMapper() @@ -808,22 +797,17 @@ private void assertQueryBuilder(BytesRef actual, QueryBuilder expected) throws I } public void testEmptyName() throws Exception { - String mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type1") - .startObject("properties") - .startObject("") - .field("type", "percolator") - .endObject() - .endObject() - .endObject() - .endObject() - ); - MapperParsingException e = expectThrows( - MapperParsingException.class, - () -> mapperService.parseMapping("type1", new CompressedXContent(mapping)) - ); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("type1") + .startObject("properties") + .startObject("") + .field("type", "percolator") + .endObject() + .endObject() + .endObject() + .endObject(); + MapperParsingException e = expectThrows(MapperParsingException.class, () -> mapperService.parseMapping(toMappingMetadata(mapping))); assertThat(e.getMessage(), containsString("field name cannot be an empty string")); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/create/CreateSystemIndicesIT.java b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/create/CreateSystemIndicesIT.java index 9c9822318c73b..36560a159c9ed 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/create/CreateSystemIndicesIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/create/CreateSystemIndicesIT.java @@ -29,6 +29,7 @@ import org.elasticsearch.cluster.metadata.Template; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.CollectionUtils; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.indices.TestSystemIndexDescriptor; import org.elasticsearch.indices.TestSystemIndexDescriptorAllowsTemplates; import org.elasticsearch.indices.TestSystemIndexPlugin; @@ -371,7 +372,7 @@ private void assertMappingsAndSettings(String expectedMappings, String concreteI mappings.containsKey(concreteIndex), equalTo(true) ); - final Map sourceAsMap = mappings.get(concreteIndex).getSourceAsMap(); + final Map sourceAsMap = Map.of(MapperService.SINGLE_MAPPING_NAME, mappings.get(concreteIndex).getSourceAsMap()); try { assertThat(convertToXContent(sourceAsMap, XContentType.JSON).utf8ToString(), equalTo(expectedMappings)); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/aliases/NetNewSystemIndexAliasIT.java b/server/src/internalClusterTest/java/org/elasticsearch/aliases/NetNewSystemIndexAliasIT.java index fccbf18bd1197..8f7a4345f1df5 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/aliases/NetNewSystemIndexAliasIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/aliases/NetNewSystemIndexAliasIT.java @@ -65,6 +65,7 @@ public static class NetNewSystemIndexTestPlugin extends Plugin implements System public Collection getSystemIndexDescriptors(Settings settings) { try (XContentBuilder builder = jsonBuilder()) { builder.startObject(); + builder.startObject("_doc"); { builder.startObject("_meta"); builder.field("version", Version.CURRENT.toString()); @@ -80,6 +81,7 @@ public Collection getSystemIndexDescriptors(Settings sett builder.endObject(); } builder.endObject(); + builder.endObject(); return Collections.singletonList( SystemIndexDescriptor.builder() diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/SystemIndexManagerIT.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/SystemIndexManagerIT.java index 9fe54011415e7..99703d32ac437 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/SystemIndexManagerIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/SystemIndexManagerIT.java @@ -18,6 +18,7 @@ import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.CollectionUtils; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.xcontent.XContentType; @@ -144,7 +145,10 @@ private void assertMappingsAndSettings(String expectedMappings) { mappings.containsKey(PRIMARY_INDEX_NAME), equalTo(true) ); - final Map sourceAsMap = mappings.get(PRIMARY_INDEX_NAME).getSourceAsMap(); + final Map sourceAsMap = Map.of( + MapperService.SINGLE_MAPPING_NAME, + mappings.get(PRIMARY_INDEX_NAME).getSourceAsMap() + ); try { assertThat(convertToXContent(sourceAsMap, XContentType.JSON).utf8ToString(), equalTo(expectedMappings)); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java index 58830f978ee30..bac4aaebb73d6 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java @@ -95,6 +95,7 @@ public static String getOldMappings() { final XContentBuilder builder = jsonBuilder(); builder.startObject(); + builder.startObject("_doc"); { builder.startObject("_meta"); builder.field("version", Version.CURRENT.previousMajor().toString()); @@ -108,7 +109,7 @@ public static String getOldMappings() { } builder.endObject(); } - + builder.endObject(); builder.endObject(); return Strings.toString(builder); } catch (IOException e) { @@ -121,6 +122,7 @@ public static String getNewMappings() { final XContentBuilder builder = jsonBuilder(); builder.startObject(); + builder.startObject("_doc"); { builder.startObject("_meta"); builder.field("version", Version.CURRENT.toString()); @@ -137,7 +139,7 @@ public static String getNewMappings() { } builder.endObject(); } - + builder.endObject(); builder.endObject(); return Strings.toString(builder); } catch (IOException e) { diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java b/server/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java index 985115cca3776..19c364b42f92e 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java @@ -230,8 +230,7 @@ public CreateIndexRequest settings(Map source) { * */ public CreateIndexRequest mapping(String mapping) { - this.mappings = mapping; - return this; + return mapping(new BytesArray(mapping), null); } /** @@ -262,7 +261,6 @@ public CreateIndexRequest simpleMapping(String... source) { } private CreateIndexRequest mapping(BytesReference source, XContentType xContentType) { - Objects.requireNonNull(xContentType); Map mappingAsMap = XContentHelper.convertToMap(source, false, xContentType).v2(); return mapping(MapperService.SINGLE_MAPPING_NAME, mappingAsMap); } @@ -278,10 +276,11 @@ private CreateIndexRequest mapping(String type, Map source) { try { XContentBuilder builder = XContentFactory.jsonBuilder(); builder.map(source); - return mapping(Strings.toString(builder)); + this.mappings = Strings.toString(builder); } catch (IOException e) { throw new ElasticsearchGenerationException("Failed to generate [" + source + "]", e); } + return this; } /** diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequest.java b/server/src/main/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequest.java index 80a032c4542c7..615c636aae8f1 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequest.java @@ -29,7 +29,6 @@ import org.elasticsearch.xcontent.XContentType; import java.io.IOException; -import java.io.UncheckedIOException; import java.util.Arrays; import java.util.Map; import java.util.Objects; @@ -216,6 +215,7 @@ public static XContentBuilder simpleMapping(String... source) { try { XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject(); + builder.startObject("_doc"); for (int i = 0; i < source.length; i++) { String fieldName = source[i++]; @@ -253,6 +253,7 @@ public static XContentBuilder simpleMapping(String... source) { } builder.endObject(); builder.endObject(); + builder.endObject(); return builder; } catch (Exception e) { throw new IllegalArgumentException("failed to generate simplified mapping definition", e); @@ -270,13 +271,7 @@ public PutMappingRequest source(XContentBuilder mappingBuilder) { * The mapping source definition. */ public PutMappingRequest source(Map mappingSource) { - try { - XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); - builder.map(mappingSource); - return source(BytesReference.bytes(builder), builder.contentType()); - } catch (IOException e) { - throw new ElasticsearchGenerationException("Failed to generate [" + mappingSource + "]", e); - } + return source(MapperService.SINGLE_MAPPING_NAME, mappingSource); } /** @@ -290,13 +285,25 @@ public PutMappingRequest source(String mappingSource, XContentType xContentType) * The mapping source definition. */ public PutMappingRequest source(BytesReference mappingSource, XContentType xContentType) { - Objects.requireNonNull(xContentType); + return source(MapperService.SINGLE_MAPPING_NAME, XContentHelper.convertToMap(mappingSource, false, xContentType).v2()); + } + + public PutMappingRequest source(String type, Map mappings) { + // wrap it in a type map if its not + if (mappings.size() != 1 || mappings.containsKey(type) == false) { + mappings = Map.of(MapperService.SINGLE_MAPPING_NAME, mappings); + } else if (MapperService.SINGLE_MAPPING_NAME.equals(type) == false) { + // if it has a different type name, then unwrap and rewrap with _doc + mappings = Map.of(MapperService.SINGLE_MAPPING_NAME, mappings.get(type)); + } try { - this.source = XContentHelper.convertToJson(mappingSource, false, false, xContentType); - return this; + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.map(mappings); + this.source = Strings.toString(builder); } catch (IOException e) { - throw new UncheckedIOException("failed to convert source to json", e); + throw new ElasticsearchGenerationException("Failed to generate [" + mappings + "]", e); } + return this; } public PutMappingRequest writeIndexOnly(boolean writeIndexOnly) { diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java index 826f9ccc95956..424a67b05a863 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java @@ -19,6 +19,7 @@ import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.MetadataCreateIndexService; import org.elasticsearch.cluster.metadata.MetadataIndexTemplateService; @@ -280,7 +281,7 @@ public static Template resolveTemplate( tempIndexService -> { MapperService mapperService = tempIndexService.mapperService(); for (CompressedXContent mapping : mappings) { - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, mapping, MapperService.MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); } DocumentMapper documentMapper = mapperService.documentMapper(); diff --git a/server/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java b/server/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java index 44037a9dce6ad..3277c01372690 100644 --- a/server/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java +++ b/server/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java @@ -31,6 +31,7 @@ import org.elasticsearch.cluster.ClusterStateObserver; import org.elasticsearch.cluster.action.index.MappingUpdatedAction; import org.elasticsearch.cluster.action.shard.ShardStateAction; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; @@ -363,8 +364,7 @@ static boolean executeBulkItemRequest( try { primary.mapperService() .merge( - MapperService.SINGLE_MAPPING_NAME, - new CompressedXContent(result.getRequiredMappingUpdate()), + new MappingMetadata(new CompressedXContent(result.getRequiredMappingUpdate())), MapperService.MergeReason.MAPPING_UPDATE_PREFLIGHT ); } catch (Exception e) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java index c0e4b4962a796..a7d87a869f77e 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java @@ -2259,13 +2259,7 @@ public static void toXContent(IndexMetadata indexMetadata, XContentBuilder build builder.startObject(KEY_MAPPINGS); MappingMetadata mmd = indexMetadata.mapping(); if (mmd != null) { - Map mapping = XContentHelper.convertToMap(mmd.source().uncompressed(), false).v2(); - if (mapping.size() == 1 && mapping.containsKey(mmd.type())) { - // the type name is the root value, reduce it - mapping = (Map) mapping.get(mmd.type()); - } - builder.field(mmd.type()); - builder.map(mapping); + mmd.toXContent(builder, params); } builder.endObject(); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java index 17f1b75c2e541..3bc16d6e676d1 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java @@ -18,6 +18,8 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.xcontent.ToXContentFragment; +import org.elasticsearch.xcontent.XContentBuilder; import java.io.IOException; import java.io.UncheckedIOException; @@ -29,18 +31,22 @@ /** * Mapping configuration for a type. */ -public class MappingMetadata implements SimpleDiffable { +public class MappingMetadata implements SimpleDiffable, ToXContentFragment { public static final MappingMetadata EMPTY_MAPPINGS = new MappingMetadata( MapperService.SINGLE_MAPPING_NAME, Map.of(MapperService.SINGLE_MAPPING_NAME, Map.of()) ); + // TODO split this into CompressedXContent and Map-backed impls, similar to Source + // we end up serializing and deserializing stuff for no reason in far too many places + private final String type; + // always includes the type at top-level private final CompressedXContent source; - private final boolean routingRequired; + private Boolean routingRequired = null; public MappingMetadata(DocumentMapper docMapper) { this.type = docMapper.type(); @@ -48,30 +54,36 @@ public MappingMetadata(DocumentMapper docMapper) { this.routingRequired = docMapper.routingFieldMapper().required(); } - @SuppressWarnings("unchecked") public MappingMetadata(CompressedXContent mapping) { this.source = mapping; + // TODO do this via pull parsing - we don't need to reify the whole map! Map mappingMap = XContentHelper.convertToMap(mapping.compressedReference(), true).v2(); - if (mappingMap.size() != 1) { + if (mappingMap.isEmpty()) { + this.type = MapperService.SINGLE_MAPPING_NAME; + } else if (mappingMap.size() != 1) { throw new IllegalStateException("Can't derive type from mapping, no root type: " + mapping.string()); + } else { + this.type = mappingMap.keySet().iterator().next(); } - this.type = mappingMap.keySet().iterator().next(); - this.routingRequired = routingRequired((Map) mappingMap.get(this.type)); } - @SuppressWarnings("unchecked") public MappingMetadata(String type, Map mapping) { this.type = type; try { + if (mapping.size() != 1 || mapping.containsKey(this.type) == false) { + mapping = Map.of(this.type, mapping); + } this.source = new CompressedXContent(mapping); } catch (IOException e) { throw new UncheckedIOException(e); // XContent exception, should never happen } - Map withoutType = mapping; - if (mapping.size() == 1 && mapping.containsKey(type)) { - withoutType = (Map) mapping.get(type); - } - this.routingRequired = routingRequired(withoutType); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.field(type); + builder.map(sourceAsMap()); + return builder; } public static void writeMappingMetadata(StreamOutput out, Map mappings) throws IOException { @@ -90,7 +102,7 @@ public static void writeMappingMetadata(StreamOutput out, Map withoutType) { + private static boolean routingRequired(Map withoutType) { boolean required = false; if (withoutType.containsKey("_routing")) { Map routingNode = (Map) withoutType.get("_routing"); @@ -101,10 +113,7 @@ private boolean routingRequired(Map withoutType) { try { required = nodeBooleanValue(fieldNode); } catch (IllegalArgumentException ex) { - throw new IllegalArgumentException( - "Failed to create mapping for type [" + this.type() + "]. " + "Illegal value in field [_routing.required].", - ex - ); + throw new IllegalArgumentException("Failed to create mapping: illegal value in field [_routing.required].", ex); } } } @@ -112,10 +121,6 @@ private boolean routingRequired(Map withoutType) { return required; } - public String type() { - return this.type; - } - public CompressedXContent source() { return this.source; } @@ -126,9 +131,9 @@ public CompressedXContent source() { @SuppressWarnings("unchecked") public Map sourceAsMap() throws ElasticsearchParseException { Map mapping = XContentHelper.convertToMap(source.compressedReference(), true).v2(); - if (mapping.size() == 1 && mapping.containsKey(type())) { + if (mapping.size() == 1 && mapping.containsKey(type)) { // the type name is the root value, reduce it - mapping = (Map) mapping.get(type()); + mapping = (Map) mapping.get(type); } return mapping; } @@ -144,13 +149,14 @@ public Map getSourceAsMap() throws ElasticsearchParseException { * Converts the serialized compressed form of the mappings into a parsed map. * In contrast to {@link #sourceAsMap()}, this does not remove the type */ - @SuppressWarnings("unchecked") public Map rawSourceAsMap() throws ElasticsearchParseException { - Map mapping = XContentHelper.convertToMap(source.compressedReference(), true).v2(); - return mapping; + return XContentHelper.convertToMap(source.compressedReference(), true).v2(); } public boolean routingRequired() { + if (this.routingRequired == null) { + this.routingRequired = routingRequired(sourceAsMap()); + } return this.routingRequired; } @@ -160,10 +166,10 @@ public String getSha256() { @Override public void writeTo(StreamOutput out) throws IOException { - out.writeString(type()); + out.writeString(type); source().writeTo(out); // routing - out.writeBoolean(routingRequired); + out.writeBoolean(routingRequired()); } @Override @@ -173,7 +179,7 @@ public boolean equals(Object o) { MappingMetadata that = (MappingMetadata) o; - if (Objects.equals(this.routingRequired, that.routingRequired) == false) return false; + if (Objects.equals(this.routingRequired(), that.routingRequired()) == false) return false; if (source.equals(that.source) == false) return false; if (type.equals(that.type) == false) return false; diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java index 33657fbb583fa..aa002eaf3a497 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java @@ -41,7 +41,6 @@ import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.common.xcontent.ChunkedToXContent; import org.elasticsearch.common.xcontent.ChunkedToXContentHelper; -import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParserUtils; import org.elasticsearch.core.Nullable; import org.elasticsearch.gateway.MetadataStateFormat; @@ -49,6 +48,7 @@ import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.IndexSettings; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.plugins.MapperPlugin; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.transport.Transports; @@ -903,14 +903,7 @@ private static MappingMetadata filterFields(MappingMetadata mappingMetadata, Pre if (fieldPredicate == MapperPlugin.NOOP_FIELD_PREDICATE) { return mappingMetadata; } - Map sourceAsMap = XContentHelper.convertToMap(mappingMetadata.source().compressedReference(), true).v2(); - Map mapping; - if (sourceAsMap.size() == 1 && sourceAsMap.containsKey(mappingMetadata.type())) { - mapping = (Map) sourceAsMap.get(mappingMetadata.type()); - } else { - mapping = sourceAsMap; - } - + Map mapping = mappingMetadata.sourceAsMap(); Map properties = (Map) mapping.get("properties"); if (properties == null || properties.isEmpty()) { return mappingMetadata; @@ -918,7 +911,7 @@ private static MappingMetadata filterFields(MappingMetadata mappingMetadata, Pre filterFields("", properties, fieldPredicate); - return new MappingMetadata(mappingMetadata.type(), sourceAsMap); + return new MappingMetadata(MapperService.SINGLE_MAPPING_NAME, mapping); } @SuppressWarnings("unchecked") diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java index 99585895005ec..08a083f381924 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java @@ -1325,10 +1325,10 @@ private static void updateIndexMappingsAndBuildSortOrder( IndexMode indexMode = indexService.getIndexSettings() != null ? indexService.getIndexSettings().getMode() : IndexMode.STANDARD; final CompressedXContent defaultMapping = indexMode.getDefaultMapping(); if (defaultMapping != null) { - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, defaultMapping, MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(defaultMapping), MergeReason.INDEX_TEMPLATE); } for (CompressedXContent mapping : mappings) { - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, mapping, MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(mapping), MergeReason.INDEX_TEMPLATE); } indexMode.validateTimestampFieldMapping(request.dataStreamName() != null, mapperService.mappingLookup()); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java index 36a432b7625e9..bb7e4360d1b2c 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java @@ -1429,7 +1429,7 @@ private static void validateCompositeTemplate( try { MapperService mapperService = tempIndexService.mapperService(); for (CompressedXContent mapping : mappings) { - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, mapping, MapperService.MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); } if (template.getDataStreamTemplate() != null) { @@ -1475,7 +1475,7 @@ private static void validateTemplate(Settings validateSettings, CompressedXConte createdIndex = dummyIndexService.index(); if (mappings != null) { - dummyIndexService.mapperService().merge(MapperService.SINGLE_MAPPING_NAME, mappings, MergeReason.MAPPING_UPDATE); + dummyIndexService.mapperService().merge(new MappingMetadata(mappings), MergeReason.MAPPING_UPDATE); } } finally { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMappingService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMappingService.java index de97a8b5b2901..19518d815e399 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMappingService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMappingService.java @@ -146,7 +146,7 @@ private static ClusterState applyRequest( updateList.add(indexMetadata); // try and parse it (no need to add it here) so we can bail early in case of parsing exception // first, simulate: just call merge and ignore the result - Mapping mapping = mapperService.parseMapping(MapperService.SINGLE_MAPPING_NAME, mappingUpdateSource); + Mapping mapping = mapperService.parseMapping(new MappingMetadata(mappingUpdateSource)); MapperService.mergeMappings(mapperService.documentMapper(), mapping, MergeReason.MAPPING_UPDATE); } Metadata.Builder builder = Metadata.builder(metadata); @@ -163,11 +163,7 @@ private static ClusterState applyRequest( if (existingMapper != null) { existingSource = existingMapper.mappingSource(); } - DocumentMapper mergedMapper = mapperService.merge( - MapperService.SINGLE_MAPPING_NAME, - mappingUpdateSource, - MergeReason.MAPPING_UPDATE - ); + DocumentMapper mergedMapper = mapperService.merge(new MappingMetadata(mappingUpdateSource), MergeReason.MAPPING_UPDATE); CompressedXContent updatedSource = mergedMapper.mappingSource(); if (existingSource != null) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamService.java index e428d70a9d2f2..54f303c20340b 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamService.java @@ -47,12 +47,18 @@ public class MetadataMigrateToDataStreamService { private static final Logger logger = LogManager.getLogger(MetadataMigrateToDataStreamService.class); - private static final CompressedXContent TIMESTAMP_MAPPING; + private static final MappingMetadata TIMESTAMP_MAPPING; static { try { - TIMESTAMP_MAPPING = new CompressedXContent( - ((builder, params) -> builder.startObject(DataStreamTimestampFieldMapper.NAME).field("enabled", true).endObject()) + TIMESTAMP_MAPPING = new MappingMetadata( + new CompressedXContent( + ((builder, params) -> builder.startObject(MapperService.SINGLE_MAPPING_NAME) + .startObject(DataStreamTimestampFieldMapper.NAME) + .field("enabled", true) + .endObject() + .endObject()) + ) ); } catch (IOException e) { throw new AssertionError(e); @@ -195,7 +201,7 @@ static void prepareBackingIndex( MapperService mapperService = mapperSupplier.apply(im); mapperService.merge(im, MapperService.MergeReason.MAPPING_RECOVERY); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, TIMESTAMP_MAPPING, MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(TIMESTAMP_MAPPING, MapperService.MergeReason.MAPPING_UPDATE); DocumentMapper mapper = mapperService.documentMapper(); var imb = IndexMetadata.builder(im); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MapperService.java b/server/src/main/java/org/elasticsearch/index/mapper/MapperService.java index cbbc0ec7ab288..2f337b2b3ff4e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MapperService.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MapperService.java @@ -253,16 +253,15 @@ public void updateMapping(final IndexMetadata currentIndexMetadata, final IndexM MappingMetadata newMappingMetadata = newIndexMetadata.mapping(); if (newMappingMetadata != null) { - String type = newMappingMetadata.type(); - CompressedXContent incomingMappingSource = newMappingMetadata.source(); - Mapping incomingMapping = parseMapping(type, incomingMappingSource); + Mapping incomingMapping = parseMapping(newMappingMetadata); DocumentMapper previousMapper; synchronized (this) { previousMapper = this.mapper; - assert assertRefreshIsNotNeeded(previousMapper, type, incomingMapping); - this.mapper = newDocumentMapper(incomingMapping, MergeReason.MAPPING_RECOVERY, incomingMappingSource); + assert assertRefreshIsNotNeeded(previousMapper, incomingMapping); + this.mapper = newDocumentMapper(incomingMapping, MergeReason.MAPPING_RECOVERY, newMappingMetadata.source()); } String op = previousMapper != null ? "updated" : "added"; + CompressedXContent incomingMappingSource = newMappingMetadata.source(); if (logger.isDebugEnabled() && incomingMappingSource.compressed().length < 512) { logger.debug("[{}] {} mapping, source [{}]", index(), op, incomingMappingSource.string()); } else if (logger.isTraceEnabled()) { @@ -273,7 +272,7 @@ public void updateMapping(final IndexMetadata currentIndexMetadata, final IndexM } } - private boolean assertRefreshIsNotNeeded(DocumentMapper currentMapper, String type, Mapping incomingMapping) { + private boolean assertRefreshIsNotNeeded(DocumentMapper currentMapper, Mapping incomingMapping) { Mapping mergedMapping = mergeMappings(currentMapper, incomingMapping, MergeReason.MAPPING_RECOVERY); // skip the runtime section or removed runtime fields will make the assertion fail ToXContent.MapParams params = new ToXContent.MapParams(Collections.singletonMap(RootObjectMapper.TOXCONTENT_SKIP_RUNTIME, "true")); @@ -281,13 +280,13 @@ private boolean assertRefreshIsNotNeeded(DocumentMapper currentMapper, String ty try { mergedMappingSource = new CompressedXContent(mergedMapping, params); } catch (Exception e) { - throw new AssertionError("failed to serialize source for type [" + type + "]", e); + throw new AssertionError("failed to serialize mappings", e); } CompressedXContent incomingMappingSource; try { incomingMappingSource = new CompressedXContent(incomingMapping, params); } catch (Exception e) { - throw new AssertionError("failed to serialize source for type [" + type + "]", e); + throw new AssertionError("failed to serialize mappings", e); } // we used to ask the master to refresh its mappings whenever the result of merging the incoming mappings with the // current mappings differs from the incoming mappings. We now rather assert that this situation never happens. @@ -310,7 +309,7 @@ boolean assertNoUpdateRequired(final IndexMetadata newIndexMetadata) { // that the incoming mappings are the same as the current ones: we need to // parse the incoming mappings into a DocumentMapper and check that its // serialization is the same as the existing mapper - Mapping newMapping = parseMapping(mapping.type(), mapping.source()); + Mapping newMapping = parseMapping(mapping); final CompressedXContent currentSource = this.mapper.mappingSource(); final CompressedXContent newSource = newMapping.toCompressedXContent(); if (Objects.equals(currentSource, newSource) == false) { @@ -326,17 +325,17 @@ public void merge(IndexMetadata indexMetadata, MergeReason reason) { assert reason != MergeReason.MAPPING_UPDATE_PREFLIGHT; MappingMetadata mappingMetadata = indexMetadata.mapping(); if (mappingMetadata != null) { - merge(mappingMetadata.type(), mappingMetadata.source(), reason); + merge(mappingMetadata, reason); } } - public DocumentMapper merge(String type, CompressedXContent mappingSource, MergeReason reason) { + public DocumentMapper merge(MappingMetadata mappingMetadata, MergeReason reason) { final DocumentMapper currentMapper = this.mapper; - if (currentMapper != null && currentMapper.mappingSource().equals(mappingSource)) { + if (currentMapper != null && currentMapper.mappingSource().equals(mappingMetadata.source())) { return currentMapper; } synchronized (this) { - Mapping incomingMapping = parseMapping(type, mappingSource); + Mapping incomingMapping = parseMapping(mappingMetadata); Mapping mapping = mergeMappings(this.mapper, incomingMapping, reason); // TODO: In many cases the source here is equal to mappingSource so we need not serialize again. // We should identify these cases reliably and save expensive serialization here @@ -357,9 +356,9 @@ private DocumentMapper newDocumentMapper(Mapping mapping, MergeReason reason, Co return newMapper; } - public Mapping parseMapping(String mappingType, CompressedXContent mappingSource) { + public Mapping parseMapping(MappingMetadata mappingMetadata) { try { - return mappingParser.parse(mappingType, mappingSource); + return mappingParser.parse(mappingMetadata); } catch (Exception e) { throw new MapperParsingException("Failed to parse mapping: {}", e, e.getMessage()); } @@ -378,7 +377,7 @@ public static Mapping mergeMappings(DocumentMapper currentMapper, Mapping incomi private boolean assertSerialization(DocumentMapper mapper) { // capture the source now, it may change due to concurrent parsing final CompressedXContent mappingSource = mapper.mappingSource(); - Mapping newMapping = parseMapping(mapper.type(), mappingSource); + Mapping newMapping = parseMapping(new MappingMetadata(mapper.mappingSource())); if (newMapping.toCompressedXContent().equals(mappingSource) == false) { throw new AssertionError( "Mapping serialization result is different from source. \n--> Source [" diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MappingParser.java b/server/src/main/java/org/elasticsearch/index/mapper/MappingParser.java index c6b780a94c552..322563cbeb7c1 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MappingParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MappingParser.java @@ -8,10 +8,8 @@ package org.elasticsearch.index.mapper; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; -import org.elasticsearch.common.xcontent.XContentHelper; -import org.elasticsearch.core.Nullable; -import org.elasticsearch.xcontent.XContentType; import java.util.Collections; import java.util.HashMap; @@ -72,33 +70,18 @@ private static String getRemainingFields(Map map) { return remainingFields.toString(); } - @SuppressWarnings("unchecked") - Mapping parse(@Nullable String type, CompressedXContent source) throws MapperParsingException { - Objects.requireNonNull(source, "source cannot be null"); - Map mapping = XContentHelper.convertToMap(source.compressedReference(), true, XContentType.JSON).v2(); - if (mapping.isEmpty()) { - if (type == null) { - throw new MapperParsingException("malformed mapping, no type name found"); - } - } else { - String rootName = mapping.keySet().iterator().next(); - if (type == null || type.equals(rootName) || documentTypeResolver.apply(type).equals(rootName)) { - type = rootName; - mapping = (Map) mapping.get(rootName); - } - } - if (type == null) { - throw new MapperParsingException("Failed to derive type"); - } - if (type.isEmpty()) { - throw new MapperParsingException("type cannot be an empty string"); - } - return parse(type, mapping); + Mapping parse(MappingMetadata mappingMetadata) throws MapperParsingException { + Objects.requireNonNull(mappingMetadata, "mapping cannot be null"); + return parse(mappingMetadata.sourceAsMap()); } - private Mapping parse(String type, Map mapping) throws MapperParsingException { + private Mapping parse(Map mapping) throws MapperParsingException { - RootObjectMapper.Builder rootObjectMapper = RootObjectMapper.parse(type, mapping, this.mappingParserContext); + RootObjectMapper.Builder rootObjectMapper = RootObjectMapper.parse( + MapperService.SINGLE_MAPPING_NAME, + mapping, + this.mappingParserContext + ); Map, MetadataFieldMapper> metadataMappers = metadataMappersSupplier.get(); Map meta = null; diff --git a/server/src/main/java/org/elasticsearch/indices/SystemIndexManager.java b/server/src/main/java/org/elasticsearch/indices/SystemIndexManager.java index d46d4a4baea0a..bffcabcb2fdf7 100644 --- a/server/src/main/java/org/elasticsearch/indices/SystemIndexManager.java +++ b/server/src/main/java/org/elasticsearch/indices/SystemIndexManager.java @@ -288,11 +288,7 @@ private static Version readMappingVersion(SystemIndexDescriptor descriptor, Mapp @SuppressWarnings("unchecked") Map meta = (Map) mappingMetadata.sourceAsMap().get("_meta"); if (meta == null) { - logger.warn( - "Missing _meta field in mapping [{}] of index [{}], assuming mappings update required", - mappingMetadata.type(), - indexName - ); + logger.warn("Missing _meta field in mapping of index [{}], assuming mappings update required", indexName); // This can happen with old system indices, such as .watches, which were created before we had the convention of // storing a version under `_meta.` We should just replace the template to be sure. return Version.V_EMPTY; diff --git a/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestPutMappingAction.java b/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestPutMappingAction.java index c657bb906ca01..4642e25181808 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestPutMappingAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestPutMappingAction.java @@ -79,12 +79,12 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC } Map mappingSource = prepareV7Mappings(includeTypeName, sourceAsMap); - putMappingRequest.source(mappingSource); + putMappingRequest.source(Map.of(MapperService.SINGLE_MAPPING_NAME, mappingSource)); } else { if (MapperService.isMappingSourceTyped(MapperService.SINGLE_MAPPING_NAME, sourceAsMap)) { throw new IllegalArgumentException("Types cannot be provided in put mapping requests"); } - putMappingRequest.source(sourceAsMap); + putMappingRequest.source(Map.of(MapperService.SINGLE_MAPPING_NAME, sourceAsMap)); } putMappingRequest.timeout(request.paramAsTime("timeout", putMappingRequest.timeout())); diff --git a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java index e84f6e5e71e67..b70f29f5229e3 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -1660,10 +1660,7 @@ private static IndexMetadata convertLegacyIndex( // TODO: automatically add runtime field definitions for source-only snapshots } - Map newMapping = new LinkedHashMap<>(); - newMapping.put(mappingMetadata.type(), newMappingSource); - - MappingMetadata updatedMappingMetadata = new MappingMetadata(mappingMetadata.type(), newMapping); + MappingMetadata updatedMappingMetadata = new MappingMetadata(MapperService.SINGLE_MAPPING_NAME, newMappingSource); convertedIndexMetadataBuilder.putMapping(updatedMappingMetadata); IndexMetadata convertedIndexMetadata = convertedIndexMetadataBuilder.build(); @@ -1689,10 +1686,7 @@ private static IndexMetadata convertLegacyIndex( newMappingSource.clear(); newMappingSource.put("_meta", legacyMapping); - newMapping = new LinkedHashMap<>(); - newMapping.put(mappingMetadata.type(), newMappingSource); - - updatedMappingMetadata = new MappingMetadata(mappingMetadata.type(), newMapping); + updatedMappingMetadata = new MappingMetadata(MapperService.SINGLE_MAPPING_NAME, newMappingSource); convertedIndexMetadataBuilder.putMapping(updatedMappingMetadata); throw new IllegalArgumentException(e); } diff --git a/server/src/main/java/org/elasticsearch/tasks/TaskResultsService.java b/server/src/main/java/org/elasticsearch/tasks/TaskResultsService.java index d4f4058e358cb..f0686a715089c 100644 --- a/server/src/main/java/org/elasticsearch/tasks/TaskResultsService.java +++ b/server/src/main/java/org/elasticsearch/tasks/TaskResultsService.java @@ -121,6 +121,7 @@ private static XContentBuilder getTaskResultIndexMappings() { final XContentBuilder builder = jsonBuilder(); builder.startObject(); + builder.startObject("_doc"); { builder.startObject("_meta"); builder.field(TASK_RESULT_MAPPING_VERSION_META_FIELD, Version.CURRENT.toString()); @@ -199,7 +200,7 @@ private static XContentBuilder getTaskResultIndexMappings() { } builder.endObject(); } - + builder.endObject(); builder.endObject(); return builder; } catch (IOException e) { diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/MappingStatsTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/MappingStatsTests.java index 39543c35d13e6..cfed1162426c6 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/MappingStatsTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/MappingStatsTests.java @@ -107,8 +107,8 @@ public void testToXContent() { "mappings" : { "total_field_count" : 12, "total_deduplicated_field_count" : 6, - "total_deduplicated_mapping_size" : "260b", - "total_deduplicated_mapping_size_in_bytes" : 260, + "total_deduplicated_mapping_size" : "266b", + "total_deduplicated_mapping_size_in_bytes" : 266, "field_types" : [ { "name" : "dense_vector", @@ -227,8 +227,8 @@ public void testToXContentWithSomeSharedMappings() { "mappings" : { "total_field_count" : 18, "total_deduplicated_field_count" : 12, - "total_deduplicated_mapping_size" : "519b", - "total_deduplicated_mapping_size_in_bytes" : 519, + "total_deduplicated_mapping_size" : "530b", + "total_deduplicated_mapping_size_in_bytes" : 530, "field_types" : [ { "name" : "dense_vector", diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMappingServiceTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMappingServiceTests.java index ec7004e6faa22..ebba439fccc7d 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMappingServiceTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMappingServiceTests.java @@ -41,7 +41,7 @@ public void testMappingClusterStateUpdateDoesntChangeExistingIndices() throws Ex final ClusterService clusterService = getInstanceFromNode(ClusterService.class); // TODO - it will be nice to get a random mapping generator final PutMappingClusterStateUpdateRequest request = new PutMappingClusterStateUpdateRequest(""" - { "properties": { "field": { "type": "text" }}}"""); + { "_doc": { "properties": { "field": { "type": "text" }}}}"""); request.indices(new Index[] { indexService.index() }); final var resultingState = ClusterStateTaskExecutorUtils.executeAndAssertSuccessful( clusterService.state(), @@ -63,7 +63,7 @@ public void testClusterStateIsNotChangedWithIdenticalMappings() throws Exception final MetadataMappingService mappingService = getInstanceFromNode(MetadataMappingService.class); final ClusterService clusterService = getInstanceFromNode(ClusterService.class); final PutMappingClusterStateUpdateRequest request = new PutMappingClusterStateUpdateRequest(""" - { "properties": { "field": { "type": "text" }}}""").indices(new Index[] { indexService.index() }); + { "_doc": { "properties": { "field": { "type": "text" }}}}""").indices(new Index[] { indexService.index() }); final var resultingState1 = ClusterStateTaskExecutorUtils.executeAndAssertSuccessful( clusterService.state(), mappingService.putMappingExecutor, @@ -83,7 +83,7 @@ public void testMappingVersion() throws Exception { final MetadataMappingService mappingService = getInstanceFromNode(MetadataMappingService.class); final ClusterService clusterService = getInstanceFromNode(ClusterService.class); final PutMappingClusterStateUpdateRequest request = new PutMappingClusterStateUpdateRequest(""" - { "properties": { "field": { "type": "text" }}}"""); + { "_doc": { "properties": { "field": { "type": "text" }}}}"""); request.indices(new Index[] { indexService.index() }); final var resultingState = ClusterStateTaskExecutorUtils.executeAndAssertSuccessful( clusterService.state(), @@ -98,7 +98,7 @@ public void testMappingVersionUnchanged() throws Exception { final long previousVersion = indexService.getMetadata().getMappingVersion(); final MetadataMappingService mappingService = getInstanceFromNode(MetadataMappingService.class); final ClusterService clusterService = getInstanceFromNode(ClusterService.class); - final PutMappingClusterStateUpdateRequest request = new PutMappingClusterStateUpdateRequest("{ \"properties\": {}}"); + final PutMappingClusterStateUpdateRequest request = new PutMappingClusterStateUpdateRequest("{ \"_doc\": { \"properties\": {}} }"); request.indices(new Index[] { indexService.index() }); final var resultingState = ClusterStateTaskExecutorUtils.executeAndAssertSuccessful( clusterService.state(), diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamServiceTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamServiceTests.java index 49beb3ed58011..30185cbc22a71 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamServiceTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataMigrateToDataStreamServiceTests.java @@ -435,7 +435,7 @@ public void testCreateDataStreamWithoutSuppliedWriteIndex() { private MapperService getMapperService(IndexMetadata im) { try { - return createMapperService("{\"_doc\": " + im.mapping().source().toString() + "}"); + return createMapperService(im.mapping().source().toString()); } catch (IOException e) { throw new IllegalStateException(e); } diff --git a/server/src/test/java/org/elasticsearch/index/codec/PerFieldMapperCodecTests.java b/server/src/test/java/org/elasticsearch/index/codec/PerFieldMapperCodecTests.java index 75eb5d1abb52d..c9c1ddecc9397 100644 --- a/server/src/test/java/org/elasticsearch/index/codec/PerFieldMapperCodecTests.java +++ b/server/src/test/java/org/elasticsearch/index/codec/PerFieldMapperCodecTests.java @@ -10,6 +10,7 @@ import org.apache.lucene.codecs.lucene94.Lucene94Codec; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.BigArrays; @@ -61,7 +62,7 @@ private PerFieldMapperCodec createCodec(boolean timestampField, boolean timeSeri MapperService mapperService = MapperTestUtils.newMapperService(xContentRegistry(), createTempDir(), settings.build(), "test"); if (timestampField) { String mapping = """ - { + { "_doc" : { "_data_stream_timestamp": { "enabled": true }, @@ -70,9 +71,9 @@ private PerFieldMapperCodec createCodec(boolean timestampField, boolean timeSeri "type": "date" } } - } + } } """; - mapperService.merge("type", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); } return new PerFieldMapperCodec(Lucene94Codec.Mode.BEST_SPEED, mapperService, BigArrays.NON_RECYCLING_INSTANCE); } diff --git a/server/src/test/java/org/elasticsearch/index/fielddata/BinaryDVFieldDataTests.java b/server/src/test/java/org/elasticsearch/index/fielddata/BinaryDVFieldDataTests.java index bf3dbe3b105cf..c63463b87e9ac 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/BinaryDVFieldDataTests.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/BinaryDVFieldDataTests.java @@ -10,9 +10,7 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.ParsedDocument; @@ -34,21 +32,19 @@ protected boolean hasDocValues() { } public void testDocValue() throws Exception { - String mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("test") - .startObject("properties") - .startObject("field") - .field("type", "binary") - .field("doc_values", true) - .endObject() - .endObject() - .endObject() - .endObject() - ); - - DocumentMapper mapper = mapperService.merge("test", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("test") + .startObject("properties") + .startObject("field") + .field("type", "binary") + .field("doc_values", true) + .endObject() + .endObject() + .endObject() + .endObject(); + + DocumentMapper mapper = mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); List bytesList1 = new ArrayList<>(2); bytesList1.add(randomBytes()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/CamelCaseFieldNameTests.java b/server/src/test/java/org/elasticsearch/index/mapper/CamelCaseFieldNameTests.java index 9589d5af822e5..42f3f929f9a2a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/CamelCaseFieldNameTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/CamelCaseFieldNameTests.java @@ -8,6 +8,8 @@ package org.elasticsearch.index.mapper; +import org.elasticsearch.cluster.metadata.MappingMetadata; + public class CamelCaseFieldNameTests extends MapperServiceTestCase { public void testCamelCaseFieldNameStaysAsIs() throws Exception { @@ -24,7 +26,7 @@ public void testCamelCaseFieldNameStaysAsIs() throws Exception { assertNotNull(documentMapper.mappers().getMapper("thisIsCamelCase")); assertNull(documentMapper.mappers().getMapper("this_is_camel_case")); - documentMapper = mapperService.merge("_doc", documentMapper.mappingSource(), MapperService.MergeReason.MAPPING_UPDATE); + documentMapper = mapperService.merge(new MappingMetadata(documentMapper), MapperService.MergeReason.MAPPING_UPDATE); assertNotNull(documentMapper.mappers().getMapper("thisIsCamelCase")); assertNull(documentMapper.mappers().getMapper("this_is_camel_case")); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperTests.java index 1273f8c8bf6bb..08f8d72611789 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperTests.java @@ -13,6 +13,7 @@ import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; @@ -176,7 +177,7 @@ public void testConcurrentMergeTest() throws Throwable { Mapping update = doc.dynamicMappingsUpdate(); assert update != null; lastIntroducedFieldName.set(fieldName); - mapperService.merge("_doc", new CompressedXContent(update.toString()), MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(update.toString())), MergeReason.MAPPING_UPDATE); } } catch (Exception e) { error.set(e); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java index ad02f39e509ed..b6af0b4faf381 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java @@ -14,7 +14,6 @@ import org.elasticsearch.Version; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.test.VersionUtils; @@ -296,48 +295,44 @@ public void testDynamicTemplates() throws Exception { } public void testDynamicTemplatesForIndexTemplate() throws IOException { - String mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startArray("dynamic_templates") - .startObject() - .startObject("first_template") - .field("path_match", "first") - .startObject("mapping") - .field("type", "keyword") - .endObject() - .endObject() - .endObject() - .startObject() - .startObject("second_template") - .field("path_match", "second") - .startObject("mapping") - .field("type", "keyword") - .endObject() - .endObject() - .endObject() - .endArray() - .endObject() - ); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startArray("dynamic_templates") + .startObject() + .startObject("first_template") + .field("path_match", "first") + .startObject("mapping") + .field("type", "keyword") + .endObject() + .endObject() + .endObject() + .startObject() + .startObject("second_template") + .field("path_match", "second") + .startObject("mapping") + .field("type", "keyword") + .endObject() + .endObject() + .endObject() + .endArray() + .endObject() + .endObject(); MapperService mapperService = createMapperService(Version.CURRENT, Settings.EMPTY, () -> true); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping), MapperService.MergeReason.INDEX_TEMPLATE); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); // There should be no update if templates are not set. - mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("properties") - .startObject("field") - .field("type", "integer") - .endObject() - .endObject() - .endObject() - ); - DocumentMapper mapper = mapperService.merge( - MapperService.SINGLE_MAPPING_NAME, - new CompressedXContent(mapping), - MapperService.MergeReason.INDEX_TEMPLATE - ); + mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startObject("properties") + .startObject("field") + .field("type", "integer") + .endObject() + .endObject() + .endObject() + .endObject(); + DocumentMapper mapper = mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); DynamicTemplate[] templates = mapper.mapping().getRoot().dynamicTemplates(); assertEquals(2, templates.length); @@ -347,34 +342,30 @@ public void testDynamicTemplatesForIndexTemplate() throws IOException { assertEquals("second", templates[1].pathMatch()); // Dynamic templates should be appended and deduplicated. - mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startArray("dynamic_templates") - .startObject() - .startObject("third_template") - .field("path_match", "third") - .startObject("mapping") - .field("type", "integer") - .endObject() - .endObject() - .endObject() - .startObject() - .startObject("second_template") - .field("path_match", "second_updated") - .startObject("mapping") - .field("type", "double") - .endObject() - .endObject() - .endObject() - .endArray() - .endObject() - ); - mapper = mapperService.merge( - MapperService.SINGLE_MAPPING_NAME, - new CompressedXContent(mapping), - MapperService.MergeReason.INDEX_TEMPLATE - ); + mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startArray("dynamic_templates") + .startObject() + .startObject("third_template") + .field("path_match", "third") + .startObject("mapping") + .field("type", "integer") + .endObject() + .endObject() + .endObject() + .startObject() + .startObject("second_template") + .field("path_match", "second_updated") + .startObject("mapping") + .field("type", "double") + .endObject() + .endObject() + .endObject() + .endArray() + .endObject() + .endObject(); + mapper = mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.INDEX_TEMPLATE); templates = mapper.mapping().getRoot().dynamicTemplates(); assertEquals(3, templates.length); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/JavaMultiFieldMergeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/JavaMultiFieldMergeTests.java index a422fb58182d0..0a411fe07b1a4 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/JavaMultiFieldMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/JavaMultiFieldMergeTests.java @@ -9,6 +9,7 @@ package org.elasticsearch.index.mapper; import org.apache.lucene.index.IndexableField; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.xcontent.XContentFactory; @@ -20,6 +21,7 @@ import static org.hamcrest.Matchers.nullValue; public class JavaMultiFieldMergeTests extends MapperServiceTestCase { + public void testMergeMultiField() throws Exception { String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/test-mapping1.json"); MapperService mapperService = createMapperService(mapping); @@ -35,7 +37,7 @@ public void testMergeMultiField() throws Exception { assertThat(f, nullValue()); mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/test-mapping2.json"); - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertTrue(mapperService.fieldType("name").isSearchable()); @@ -51,7 +53,7 @@ public void testMergeMultiField() throws Exception { assertThat(f, notNullValue()); mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/test-mapping3.json"); - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertTrue(mapperService.fieldType("name").isSearchable()); @@ -61,7 +63,7 @@ public void testMergeMultiField() throws Exception { assertThat(mapperService.fieldType("name.not_indexed3"), nullValue()); mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/test-mapping4.json"); - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertTrue(mapperService.fieldType("name").isSearchable()); @@ -85,7 +87,7 @@ public void testUpgradeFromMultiFieldTypeToMultiFields() throws Exception { assertThat(f, nullValue()); mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/upgrade1.json"); - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertTrue(mapperService.fieldType("name").isSearchable()); @@ -101,7 +103,7 @@ public void testUpgradeFromMultiFieldTypeToMultiFields() throws Exception { assertThat(f, notNullValue()); mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/upgrade2.json"); - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertTrue(mapperService.fieldType("name").isSearchable()); @@ -112,7 +114,7 @@ public void testUpgradeFromMultiFieldTypeToMultiFields() throws Exception { mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/merge/upgrade3.json"); try { - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); fail(); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), containsString("Cannot update parameter [index] from [true] to [false]")); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java index 5cefbfeadfeb2..a8165a3cbd60b 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java @@ -11,6 +11,7 @@ import org.apache.lucene.index.IndexableField; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; @@ -257,7 +258,7 @@ public void testMappingRecoverySkipFieldNameLengthLimit() throws Throwable { ) ); - DocumentMapper documentMapper = mapperService.merge("_doc", mapping, MergeReason.MAPPING_RECOVERY); + DocumentMapper documentMapper = mapperService.merge(new MappingMetadata(mapping), MergeReason.MAPPING_RECOVERY); assertEquals(testString, documentMapper.mappers().getMapper(testString).simpleName()); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MappingParserTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MappingParserTests.java index 947b64901c99e..59d8911183f94 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MappingParserTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MappingParserTests.java @@ -9,7 +9,7 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.Version; -import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexSettings; @@ -71,7 +71,7 @@ public void testFieldNameWithDotsDisallowed() throws Exception { b.startObject("foo.bar").field("type", "text").endObject(); b.startObject("foo.baz").field("type", "keyword").endObject(); }); - Mapping mapping = createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)); Mapper object = mapping.getRoot().getMapper("foo"); assertThat(object, CoreMatchers.instanceOf(ObjectMapper.class)); @@ -93,7 +93,7 @@ public void testFieldNameWithDeepDots() throws Exception { } b.endObject(); }); - Mapping mapping = createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)); MappingLookup mappingLookup = MappingLookup.fromMapping(mapping); assertNotNull(mappingLookup.getMapper("foo.bar")); assertNotNull(mappingLookup.getMapper("foo.baz.deep.field")); @@ -107,7 +107,7 @@ public void testFieldNameWithDotPrefixDisallowed() throws IOException { }); IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertTrue(e.getMessage(), e.getMessage().contains("mapper [foo] cannot be changed from type [text] to [ObjectMapper]")); } @@ -133,7 +133,7 @@ public void testMultiFieldsWithFieldAlias() throws IOException { }); MapperParsingException e = expectThrows( MapperParsingException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("Type [alias] cannot be used in multi field", e.getMessage()); } @@ -142,7 +142,7 @@ public void testBadMetadataMapper() throws IOException { XContentBuilder builder = topMapping(b -> { b.field(RoutingFieldMapper.NAME, "required"); }); IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("[_routing] config must be an object", e.getMessage()); } @@ -182,7 +182,7 @@ to get the wrong path (missing the first portion). } } """; - Mapping mapping = createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(mappingAsString)); + Mapping mapping = createMappingParser(Settings.EMPTY).parse(new MappingMetadata(new CompressedXContent(mappingAsString))); assertEquals(1, mapping.getRoot().mappers.size()); Mapper object = mapping.getRoot().getMapper("obj"); assertThat(object, CoreMatchers.instanceOf(ObjectMapper.class)); @@ -218,7 +218,7 @@ public void testFieldStartingWithDot() throws Exception { XContentBuilder builder = mapping(b -> b.startObject(".foo").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); // TODO isn't this error misleading? assertEquals("field name cannot be an empty string", iae.getMessage()); @@ -226,7 +226,7 @@ public void testFieldStartingWithDot() throws Exception { public void testFieldEndingWithDot() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("foo.").field("type", randomFieldType()).endObject()); - Mapping mapping = createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)); // TODO this needs fixing as part of addressing https://github.com/elastic/elasticsearch/issues/28948 assertNotNull(mapping.getRoot().mappers.get("foo")); assertNull(mapping.getRoot().mappers.get("foo.")); @@ -236,7 +236,7 @@ public void testFieldTrailingDots() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("top..foo").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); // TODO isn't this error misleading? assertEquals("field name cannot be an empty string", iae.getMessage()); @@ -244,7 +244,7 @@ public void testFieldTrailingDots() throws Exception { public void testDottedFieldEndingWithDot() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("foo.bar.").field("type", randomFieldType()).endObject()); - Mapping mapping = createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)); // TODO this needs fixing as part of addressing https://github.com/elastic/elasticsearch/issues/28948 assertNotNull(((ObjectMapper) mapping.getRoot().mappers.get("foo")).mappers.get("bar")); assertNull(((ObjectMapper) mapping.getRoot().mappers.get("foo")).mappers.get("bar.")); @@ -254,7 +254,7 @@ public void testFieldStartingAndEndingWithDot() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("foo..bar.").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); // TODO isn't this error misleading? assertEquals("field name cannot be an empty string", iae.getMessage()); @@ -264,7 +264,7 @@ public void testDottedFieldWithTrailingWhitespace() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("top. .foo").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); // TODO isn't this error misleading? assertEquals("field name cannot contain only whitespaces", iae.getMessage()); @@ -275,7 +275,7 @@ public void testEmptyFieldName() throws Exception { XContentBuilder builder = mapping(b -> b.startObject("").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("field name cannot be an empty string", iae.getMessage()); } @@ -283,7 +283,7 @@ public void testEmptyFieldName() throws Exception { XContentBuilder builder = mappingNoSubobjects(b -> b.startObject("").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("field name cannot be an empty string", iae.getMessage()); } @@ -294,7 +294,7 @@ public void testBlankFieldName() throws Exception { XContentBuilder builder = mapping(b -> b.startObject(" ").field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("field name cannot contain only whitespaces", iae.getMessage()); } @@ -302,7 +302,7 @@ public void testBlankFieldName() throws Exception { XContentBuilder builder = mappingNoSubobjects(b -> b.startObject(" ").field("type", "keyword").endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("field name cannot contain only whitespaces", iae.getMessage()); } @@ -313,19 +313,19 @@ public void testBlankFieldNameBefore8_6_0() throws Exception { { XContentBuilder builder = mapping(b -> b.startObject(" ").field("type", randomFieldType()).endObject()); MappingParser mappingParser = createMappingParser(Settings.EMPTY, version); - Mapping mapping = mappingParser.parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = mappingParser.parse(toMappingMetadata(builder)); assertNotNull(mapping.getRoot().getMapper(" ")); } { XContentBuilder builder = mapping(b -> b.startObject("top. .foo").field("type", randomFieldType()).endObject()); MappingParser mappingParser = createMappingParser(Settings.EMPTY, version); - Mapping mapping = mappingParser.parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = mappingParser.parse(toMappingMetadata(builder)); assertNotNull(((ObjectMapper) mapping.getRoot().getMapper("top")).getMapper(" ")); } { XContentBuilder builder = mappingNoSubobjects(b -> b.startObject(" ").field("type", "keyword").endObject()); MappingParser mappingParser = createMappingParser(Settings.EMPTY, version); - Mapping mapping = mappingParser.parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + Mapping mapping = mappingParser.parse(toMappingMetadata(builder)); assertNotNull(mapping.getRoot().getMapper(" ")); } } @@ -336,7 +336,7 @@ public void testFieldNameDotsOnly() throws Exception { XContentBuilder builder = mapping(b -> b.startObject(fieldName).field("type", randomFieldType()).endObject()); IllegalArgumentException iae = expectThrows( IllegalArgumentException.class, - () -> createMappingParser(Settings.EMPTY).parse("_doc", new CompressedXContent(BytesReference.bytes(builder))) + () -> createMappingParser(Settings.EMPTY).parse(toMappingMetadata(builder)) ); assertEquals("field name cannot contain only dots", iae.getMessage()); } @@ -346,7 +346,7 @@ public void testDynamicFieldEdgeCaseNamesSubobjectsFalse() throws Exception { MappingParser mappingParser = createMappingParser(Settings.EMPTY); for (String fieldName : DocumentParserTests.VALID_FIELD_NAMES_NO_SUBOBJECTS) { XContentBuilder builder = mappingNoSubobjects(b -> b.startObject(fieldName).field("type", "keyword").endObject()); - assertNotNull(mappingParser.parse("_doc", new CompressedXContent(BytesReference.bytes(builder)))); + assertNotNull(mappingParser.parse(toMappingMetadata(builder))); } } @@ -356,7 +356,7 @@ public void testDynamicFieldEdgeCaseNamesRuntimeSection() throws Exception { MappingParser mappingParser = createMappingParser(Settings.EMPTY); for (String fieldName : DocumentParserTests.VALID_FIELD_NAMES_NO_SUBOBJECTS) { XContentBuilder builder = runtimeMapping(b -> b.startObject(fieldName).field("type", "keyword").endObject()); - mappingParser.parse("_doc", new CompressedXContent(BytesReference.bytes(builder))); + mappingParser.parse(toMappingMetadata(builder)); } } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/NestedObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/NestedObjectMapperTests.java index d106908fad5d3..36b1a14e504d1 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/NestedObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/NestedObjectMapperTests.java @@ -10,6 +10,7 @@ import org.apache.lucene.index.IndexableField; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; @@ -514,7 +515,7 @@ public void testMultipleLevelsIncludeRoot1() throws Exception { ); MergeReason mergeReason = randomFrom(MergeReason.MAPPING_UPDATE, MergeReason.INDEX_TEMPLATE); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping), mergeReason); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), mergeReason); DocumentMapper docMapper = mapperService.documentMapper(); ParsedDocument doc = docMapper.parse( @@ -620,7 +621,7 @@ public void testMultipleLevelsIncludeRoot2() throws Exception { ); MergeReason mergeReason = randomFrom(MergeReason.MAPPING_UPDATE, MergeReason.INDEX_TEMPLATE); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping), mergeReason); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), mergeReason); DocumentMapper docMapper = mapperService.documentMapper(); ParsedDocument doc = docMapper.parse( @@ -680,7 +681,7 @@ public void testMultipleLevelsIncludeRootWithMerge() throws Exception { .endObject() .endObject() ); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(firstMapping), MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(firstMapping)), MergeReason.INDEX_TEMPLATE); String secondMapping = Strings.toString( XContentFactory.jsonBuilder() @@ -703,7 +704,7 @@ public void testMultipleLevelsIncludeRootWithMerge() throws Exception { .endObject() ); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(secondMapping), MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(secondMapping)), MergeReason.INDEX_TEMPLATE); DocumentMapper docMapper = mapperService.documentMapper(); ParsedDocument doc = docMapper.parse( diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java index 0d1a47b575877..6328c13d35408 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java @@ -9,9 +9,9 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.mapper.MapperService.MergeReason; @@ -118,10 +118,7 @@ public void testMerge() throws IOException { MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "keyword"))); DocumentMapper mapper = mapperService.documentMapper(); assertNull(mapper.mapping().getRoot().dynamic()); - Mapping mergeWith = mapperService.parseMapping( - "_doc", - new CompressedXContent(BytesReference.bytes(topMapping(b -> b.field("dynamic", "strict")))) - ); + Mapping mergeWith = mapperService.parseMapping(toMappingMetadata(topMapping(b -> b.field("dynamic", "strict")))); Mapping merged = mapper.mapping().merge(mergeWith, reason); assertEquals(Dynamic.STRICT, merged.getRoot().dynamic()); } @@ -144,6 +141,7 @@ public void testMergeEnabledForIndexTemplates() throws IOException { String update = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .field("type", "object") @@ -151,8 +149,9 @@ public void testMergeEnabledForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); - mapper = mapperService.merge("type", new CompressedXContent(update), MergeReason.INDEX_TEMPLATE); + mapper = mapperService.merge(new MappingMetadata(new CompressedXContent(update)), MergeReason.INDEX_TEMPLATE); ObjectMapper objectMapper = mapper.mappers().objectMappers().get("object"); assertNotNull(objectMapper); @@ -163,6 +162,7 @@ public void testMergeEnabledForIndexTemplates() throws IOException { update = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .field("type", "object") @@ -171,8 +171,9 @@ public void testMergeEnabledForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); - mapper = mapperService.merge("type", new CompressedXContent(update), MergeReason.INDEX_TEMPLATE); + mapper = mapperService.merge(new MappingMetadata(new CompressedXContent(update)), MergeReason.INDEX_TEMPLATE); objectMapper = mapper.mappers().objectMappers().get("object"); assertNotNull(objectMapper); @@ -185,6 +186,7 @@ public void testFieldReplacementForIndexTemplates() throws IOException { String mapping = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .startObject("properties") @@ -198,12 +200,14 @@ public void testFieldReplacementForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping), MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MergeReason.INDEX_TEMPLATE); String update = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .startObject("properties") @@ -217,12 +221,9 @@ public void testFieldReplacementForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); - DocumentMapper mapper = mapperService.merge( - MapperService.SINGLE_MAPPING_NAME, - new CompressedXContent(update), - MergeReason.INDEX_TEMPLATE - ); + DocumentMapper mapper = mapperService.merge(new MappingMetadata(new CompressedXContent(update)), MergeReason.INDEX_TEMPLATE); String expected = Strings.toString( XContentFactory.jsonBuilder() @@ -255,6 +256,7 @@ public void testDisallowFieldReplacementForIndexTemplates() throws IOException { String mapping = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .startObject("properties") @@ -268,12 +270,14 @@ public void testDisallowFieldReplacementForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping), MergeReason.INDEX_TEMPLATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MergeReason.INDEX_TEMPLATE); String firstUpdate = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .startObject("properties") @@ -284,16 +288,18 @@ public void testDisallowFieldReplacementForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(firstUpdate), MergeReason.INDEX_TEMPLATE) + () -> mapperService.merge(new MappingMetadata(new CompressedXContent(firstUpdate)), MergeReason.INDEX_TEMPLATE) ); assertThat(e.getMessage(), containsString("can't merge a non object mapping [object.field2] with an object mapping")); String secondUpdate = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject("object") .startObject("properties") @@ -304,10 +310,11 @@ public void testDisallowFieldReplacementForIndexTemplates() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); e = expectThrows( IllegalArgumentException.class, - () -> mapperService.merge(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(secondUpdate), MergeReason.INDEX_TEMPLATE) + () -> mapperService.merge(new MappingMetadata(new CompressedXContent(secondUpdate)), MergeReason.INDEX_TEMPLATE) ); assertThat(e.getMessage(), containsString("can't merge a non object mapping [object.field1] with an object mapping")); } @@ -458,10 +465,10 @@ public void testSubobjectsCannotBeUpdated() throws IOException { MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "object"))); DocumentMapper mapper = mapperService.documentMapper(); assertNull(mapper.mapping().getRoot().dynamic()); - Mapping mergeWith = mapperService.parseMapping("_doc", new CompressedXContent(BytesReference.bytes(fieldMapping(b -> { + Mapping mergeWith = mapperService.parseMapping(toMappingMetadata(fieldMapping(b -> { b.field("type", "object"); b.field("subobjects", "false"); - })))); + }))); MapperException exception = expectThrows( MapperException.class, () -> mapper.mapping().merge(mergeWith, MergeReason.MAPPING_UPDATE) @@ -473,10 +480,7 @@ public void testSubobjectsCannotBeUpdatedOnRoot() throws IOException { MapperService mapperService = createMapperService(topMapping(b -> b.field("subobjects", false))); DocumentMapper mapper = mapperService.documentMapper(); assertNull(mapper.mapping().getRoot().dynamic()); - Mapping mergeWith = mapperService.parseMapping( - "_doc", - new CompressedXContent(BytesReference.bytes(topMapping(b -> { b.field("subobjects", true); }))) - ); + Mapping mergeWith = mapperService.parseMapping(toMappingMetadata(topMapping(b -> { b.field("subobjects", true); }))); MapperException exception = expectThrows( MapperException.class, () -> mapper.mapping().merge(mergeWith, MergeReason.MAPPING_UPDATE) diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ParametrizedMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ParametrizedMapperTests.java index 77bed713ecf89..984cec763fe57 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ParametrizedMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ParametrizedMapperTests.java @@ -10,6 +10,7 @@ import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.lucene.Lucene; @@ -463,7 +464,7 @@ public void testObjectSerialization() throws IOException { MapperService mapperService = createMapperService(mapping); assertEquals(mapping, Strings.toString(mapperService.documentMapper().mapping())); - mapperService.merge("_doc", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); assertEquals(mapping, Strings.toString(mapperService.documentMapper().mapping())); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldQueryStringQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldQueryStringQueryBuilderTests.java index c63727b0dfa9b..4104f1bd917f4 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldQueryStringQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldQueryStringQueryBuilderTests.java @@ -19,8 +19,6 @@ import org.apache.lucene.search.PointRangeQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.network.InetAddresses; import org.elasticsearch.common.time.DateMathParser; import org.elasticsearch.index.query.QueryStringQueryBuilder; @@ -46,28 +44,25 @@ public class RangeFieldQueryStringQueryBuilderTests extends AbstractQueryTestCas @Override protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { mapperService.merge( - "_doc", - new CompressedXContent( - Strings.toString( - PutMappingRequest.simpleMapping( - INTEGER_RANGE_FIELD_NAME, - "type=integer_range", - LONG_RANGE_FIELD_NAME, - "type=long_range", - FLOAT_RANGE_FIELD_NAME, - "type=float_range", - DOUBLE_RANGE_FIELD_NAME, - "type=double_range", - DATE_RANGE_FIELD_NAME, - "type=date_range", - IP_RANGE_FIELD_NAME, - "type=ip_range" - ) + toMappingMetadata( + PutMappingRequest.simpleMapping( + INTEGER_RANGE_FIELD_NAME, + "type=integer_range", + LONG_RANGE_FIELD_NAME, + "type=long_range", + FLOAT_RANGE_FIELD_NAME, + "type=float_range", + DOUBLE_RANGE_FIELD_NAME, + "type=double_range", + DATE_RANGE_FIELD_NAME, + "type=date_range", + IP_RANGE_FIELD_NAME, + "type=ip_range" ) + ), MapperService.MergeReason.MAPPING_UPDATE ); - } public void testIntegerRangeQuery() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ReloadableAnalyzerTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ReloadableAnalyzerTests.java index 85ba074a7b96f..38b21e8be3be8 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ReloadableAnalyzerTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ReloadableAnalyzerTests.java @@ -10,8 +10,6 @@ import org.apache.lucene.analysis.TokenStream; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.analysis.AnalysisMode; import org.elasticsearch.index.analysis.AnalysisRegistry; @@ -23,6 +21,7 @@ import org.elasticsearch.plugins.AnalysisPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import java.io.IOException; @@ -48,31 +47,27 @@ public void testReloadSearchAnalyzers() throws IOException { .build(); MapperService mapperService = createIndex("test_index", settings).mapperService(); - CompressedXContent mapping = new CompressedXContent( - BytesReference.bytes( - XContentFactory.jsonBuilder() - .startObject() - .startObject("_doc") - .startObject("properties") - .startObject("field") - .field("type", "text") - .field("analyzer", "simple") - .field("search_analyzer", "reloadableAnalyzer") - .field("search_quote_analyzer", "stop") - .endObject() - .startObject("otherField") - .field("type", "text") - .field("analyzer", "standard") - .field("search_analyzer", "simple") - .field("search_quote_analyzer", "reloadableAnalyzer") - .endObject() - .endObject() - .endObject() - .endObject() - ) - ); - - mapperService.merge("_doc", mapping, MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startObject("properties") + .startObject("field") + .field("type", "text") + .field("analyzer", "simple") + .field("search_analyzer", "reloadableAnalyzer") + .field("search_quote_analyzer", "stop") + .endObject() + .startObject("otherField") + .field("type", "text") + .field("analyzer", "standard") + .field("search_analyzer", "simple") + .field("search_quote_analyzer", "reloadableAnalyzer") + .endObject() + .endObject() + .endObject() + .endObject(); + + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); IndexAnalyzers current = mapperService.getIndexAnalyzers(); ReloadableCustomAnalyzer originalReloadableAnalyzer = (ReloadableCustomAnalyzer) current.get("reloadableAnalyzer").analyzer(); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java index 5bd85a6dcdea7..5a976265d5828 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.Collections; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; public class RootObjectMapperTests extends MapperServiceTestCase { @@ -353,9 +352,9 @@ public void testEmptyType() throws Exception { .endObject() ); - // Empty name not allowed in index created after 5.0 - Exception e = expectThrows(MapperParsingException.class, () -> createMapperService(mapping)); - assertThat(e.getMessage(), containsString("type cannot be an empty string")); + // Type names are now ignored completely + MapperService mapperService = createMapperService(mapping); + assertNotNull(mapperService.fieldType("name")); } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java index eb961b466f470..9aaee380dacd7 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingTests.java @@ -10,8 +10,6 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.cluster.service.ClusterService; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexService; @@ -68,8 +66,7 @@ protected void testConflictWhileMergingAndMappingUnchanged(XContentBuilder mappi CompressedXContent mappingBeforeUpdate = indexService.mapperService().documentMapper().mappingSource(); // simulate like in MetadataMappingService#putMapping try { - indexService.mapperService() - .merge("type", new CompressedXContent(BytesReference.bytes(mappingUpdate)), MapperService.MergeReason.MAPPING_UPDATE); + indexService.mapperService().merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); fail(); } catch (IllegalArgumentException e) { // expected @@ -105,13 +102,13 @@ public void testConflictSameType() throws Exception { IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> mapperService.merge("type", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE) + () -> mapperService.merge(toMappingMetadata(update), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), containsString("mapper [foo] cannot be changed from type [long] to [double]")); e = expectThrows( IllegalArgumentException.class, - () -> mapperService.merge("type", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE) + () -> mapperService.merge(toMappingMetadata(update), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), containsString("mapper [foo] cannot be changed from type [long] to [double]")); @@ -147,7 +144,7 @@ public void testConflictNewType() throws Exception { IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> mapperService.merge("type", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE) + () -> mapperService.merge(toMappingMetadata(update), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), containsString("mapper [foo] cannot be changed from type [long] to [double]")); @@ -172,56 +169,52 @@ public void testReuseMetaField() throws IOException { MapperParsingException e = expectThrows( MapperParsingException.class, - () -> mapperService.merge("type", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE) + () -> mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), containsString("Field [_id] is defined more than once")); MapperParsingException e2 = expectThrows( MapperParsingException.class, - () -> mapperService.merge("type", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE) + () -> mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE) ); assertThat(e2.getMessage(), containsString("Field [_id] is defined more than once")); } public void testRejectFieldDefinedTwice() throws IOException { - String mapping1 = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject("foo") - .field("type", "object") - .endObject() - .endObject() - .endObject() - .endObject() - ); - String mapping2 = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject("foo") - .field("type", "long") - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping1 = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject("foo") + .field("type", "object") + .endObject() + .endObject() + .endObject() + .endObject(); + XContentBuilder mapping2 = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject("foo") + .field("type", "long") + .endObject() + .endObject() + .endObject() + .endObject(); MapperService mapperService1 = createIndex("test1").mapperService(); - mapperService1.merge("type", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE); + mapperService1.merge(toMappingMetadata(mapping1), MergeReason.MAPPING_UPDATE); IllegalArgumentException e = expectThrows( IllegalArgumentException.class, - () -> mapperService1.merge("type", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE) + () -> mapperService1.merge(toMappingMetadata(mapping2), MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), equalTo("can't merge a non object mapping [foo] with an object mapping")); MapperService mapperService2 = createIndex("test2").mapperService(); - mapperService2.merge("type", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE); + mapperService2.merge(toMappingMetadata(mapping2), MergeReason.MAPPING_UPDATE); e = expectThrows( IllegalArgumentException.class, - () -> mapperService2.merge("type", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE) + () -> mapperService2.merge(toMappingMetadata(mapping1), MergeReason.MAPPING_UPDATE) ); assertThat(e.getMessage(), equalTo("can't merge a non object mapping [foo] with an object mapping")); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapperTests.java index 87b534adc73d9..23089d81001cb 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapperTests.java @@ -11,7 +11,6 @@ import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.mapper.DocumentMapper; @@ -22,6 +21,7 @@ import org.elasticsearch.index.mapper.SourceToParse; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.test.VersionUtils; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentType; @@ -49,23 +49,18 @@ public void testSparseVectorWith8xIndex() throws Exception { IndexService indexService = createIndex("index", settings); MapperService mapperService = indexService.mapperService(); - BytesReference mapping = BytesReference.bytes( - XContentFactory.jsonBuilder() - .startObject() - .startObject("_doc") - .startObject("properties") - .startObject("my-vector") - .field("type", "sparse_vector") - .endObject() - .endObject() - .endObject() - .endObject() - ); - - MapperParsingException e = expectThrows( - MapperParsingException.class, - () -> mapperService.parseMapping(MapperService.SINGLE_MAPPING_NAME, new CompressedXContent(mapping)) - ); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startObject("properties") + .startObject("my-vector") + .field("type", "sparse_vector") + .endObject() + .endObject() + .endObject() + .endObject(); + + MapperParsingException e = expectThrows(MapperParsingException.class, () -> mapperService.parseMapping(toMappingMetadata(mapping))); assertThat(e.getMessage(), containsString(SparseVectorFieldMapper.ERROR_MESSAGE)); } @@ -76,24 +71,18 @@ public void testSparseVectorWith7xIndex() throws Exception { IndexService indexService = createIndex("index", settings); MapperService mapperService = indexService.mapperService(); - BytesReference mapping = BytesReference.bytes( - XContentFactory.jsonBuilder() - .startObject() - .startObject("_doc") - .startObject("properties") - .startObject("my-vector") - .field("type", "sparse_vector") - .endObject() - .endObject() - .endObject() - .endObject() - ); - - DocumentMapper mapper = mapperService.merge( - MapperService.SINGLE_MAPPING_NAME, - new CompressedXContent(mapping), - MapperService.MergeReason.MAPPING_UPDATE - ); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("_doc") + .startObject("properties") + .startObject("my-vector") + .field("type", "sparse_vector") + .endObject() + .endObject() + .endObject() + .endObject(); + + DocumentMapper mapper = mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); assertWarnings(SparseVectorFieldMapper.ERROR_MESSAGE_7X); // Check that new vectors cannot be indexed. diff --git a/server/src/test/java/org/elasticsearch/index/query/IntervalQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/IntervalQueryBuilderTests.java index 79cc850c4b8cc..7170377750d9c 100644 --- a/server/src/test/java/org/elasticsearch/index/query/IntervalQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/IntervalQueryBuilderTests.java @@ -19,7 +19,6 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.script.Script; @@ -79,7 +78,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws .endObject() .endObject(); - mapperService.merge("_doc", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); } private static IntervalsSourceProvider createRandomSource(int depth, boolean useScripts) { diff --git a/server/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java index 954f0881fca03..670649d8cf1be 100644 --- a/server/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.unit.Fuzziness; @@ -387,11 +386,8 @@ public void testExceptionUsingAnalyzerOnNumericField() { @Override protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { mapperService.merge( - "_doc", - new CompressedXContent( - Strings.toString( - PutMappingRequest.simpleMapping("string_boost", "type=text", "string_no_pos", "type=text,index_options=docs") - ) + toMappingMetadata( + PutMappingRequest.simpleMapping("string_boost", "type=text", "string_no_pos", "type=text,index_options=docs") ), MapperService.MergeReason.MAPPING_UPDATE ); diff --git a/server/src/test/java/org/elasticsearch/index/query/NestedQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/NestedQueryBuilderTests.java index c690154355829..7929d897edfa2 100644 --- a/server/src/test/java/org/elasticsearch/index/query/NestedQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/NestedQueryBuilderTests.java @@ -16,6 +16,7 @@ import org.elasticsearch.ElasticsearchException; import org.elasticsearch.Version; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; @@ -51,26 +52,27 @@ public class NestedQueryBuilderTests extends AbstractQueryTestCase> getPlugins() { @Override protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { - String docType = "_doc"; mapperService.merge( - docType, - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping("m_s_m", "type=long"))), + toMappingMetadata(PutMappingRequest.simpleMapping("m_s_m", "type=long")), MapperService.MergeReason.MAPPING_UPDATE ); } diff --git a/server/src/test/java/org/elasticsearch/index/search/MultiMatchQueryParserTests.java b/server/src/test/java/org/elasticsearch/index/search/MultiMatchQueryParserTests.java index db418016fb70f..8f5761625c91a 100644 --- a/server/src/test/java/org/elasticsearch/index/search/MultiMatchQueryParserTests.java +++ b/server/src/test/java/org/elasticsearch/index/search/MultiMatchQueryParserTests.java @@ -20,7 +20,7 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.tests.analysis.MockSynonymAnalyzer; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.Strings; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.Settings; @@ -35,6 +35,7 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.test.MockKeywordPlugin; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.junit.Before; @@ -89,7 +90,7 @@ public void setup() throws IOException { } } """; - mapperService.merge("person", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(new MappingMetadata(new CompressedXContent(mapping)), MapperService.MergeReason.MAPPING_UPDATE); this.indexService = indexService; } @@ -342,32 +343,30 @@ public void testKeywordSplitQueriesOnWhitespace() throws IOException { .build() ); MapperService mapperService = indexService.mapperService(); - String mapping = Strings.toString( - XContentFactory.jsonBuilder() - .startObject() - .startObject("type") - .startObject("properties") - .startObject("field") - .field("type", "keyword") - .endObject() - .startObject("field_normalizer") - .field("type", "keyword") - .field("normalizer", "my_lowercase") - .endObject() - .startObject("field_split") - .field("type", "keyword") - .field("split_queries_on_whitespace", true) - .endObject() - .startObject("field_split_normalizer") - .field("type", "keyword") - .field("normalizer", "my_lowercase") - .field("split_queries_on_whitespace", true) - .endObject() - .endObject() - .endObject() - .endObject() - ); - mapperService.merge("type", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + XContentBuilder mapping = XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("properties") + .startObject("field") + .field("type", "keyword") + .endObject() + .startObject("field_normalizer") + .field("type", "keyword") + .field("normalizer", "my_lowercase") + .endObject() + .startObject("field_split") + .field("type", "keyword") + .field("split_queries_on_whitespace", true) + .endObject() + .startObject("field_split_normalizer") + .field("type", "keyword") + .field("normalizer", "my_lowercase") + .field("split_queries_on_whitespace", true) + .endObject() + .endObject() + .endObject() + .endObject(); + mapperService.merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); SearchExecutionContext searchExecutionContext = indexService.newSearchExecutionContext( randomInt(20), 0, diff --git a/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java b/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java index f7b1c94610c1b..99c8fde52664d 100644 --- a/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java +++ b/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java @@ -3129,7 +3129,7 @@ public void testRecoverFromLocalShard() throws IOException { assertThat(requestedMappingUpdates, hasKey("_doc")); assertThat(requestedMappingUpdates.get("_doc").source().string(), equalTo(""" - {"properties":{"foo":{"type":"text"}}}""")); + {"_doc":{"properties":{"foo":{"type":"text"}}}}""")); closeShards(sourceShard, targetShard); } diff --git a/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java b/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java index a52fd7e608d24..96b3c461c1a40 100644 --- a/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java +++ b/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java @@ -20,6 +20,7 @@ import org.apache.lucene.search.similarities.LMJelinekMercerSimilarity; import org.apache.lucene.search.similarities.LambdaTTF; import org.apache.lucene.search.similarities.NormalizationH2; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; @@ -254,7 +255,7 @@ public void testResolveSimilaritiesFromMapping_Unknown() throws IOException { IndexService indexService = createIndex("foo"); MapperParsingException e = expectThrows( MapperParsingException.class, - () -> indexService.mapperService().parseMapping("type", new CompressedXContent(mapping)) + () -> indexService.mapperService().parseMapping(new MappingMetadata(new CompressedXContent(mapping))) ); assertThat(e.getMessage(), equalTo("Failed to parse mapping: Unknown Similarity type [unknown_similarity] for field [field1]")); } diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoPointShapeQueryTests.java b/server/src/test/java/org/elasticsearch/search/geo/GeoPointShapeQueryTests.java index 391a3fcab48b9..604eff91ea9a0 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoPointShapeQueryTests.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoPointShapeQueryTests.java @@ -67,6 +67,7 @@ public void testFieldAlias() throws IOException { String mapping = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject(defaultFieldName) .field("type", "geo_point") @@ -77,6 +78,7 @@ public void testFieldAlias() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); client().admin().indices().prepareCreate(defaultIndexName).setMapping(mapping).get(); diff --git a/server/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java b/server/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java index fa97b1c1d9536..dd981c003de9f 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java @@ -17,9 +17,7 @@ import org.apache.lucene.index.IndexableField; import org.apache.lucene.search.suggest.document.ContextSuggestField; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.mapper.CompletionFieldMapper.CompletionFieldType; import org.elasticsearch.index.mapper.DocumentMapper; @@ -51,26 +49,24 @@ public class CategoryContextMappingTests extends ESSingleNodeTestCase { public void testIndexingWithNoContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -101,26 +97,24 @@ public void testIndexingWithNoContexts() throws Exception { } public void testIndexingWithSimpleContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -146,26 +140,24 @@ public void testIndexingWithSimpleContexts() throws Exception { } public void testIndexingWithSimpleNumberContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -191,26 +183,24 @@ public void testIndexingWithSimpleNumberContexts() throws Exception { } public void testIndexingWithSimpleBooleanContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -236,26 +226,24 @@ public void testIndexingWithSimpleBooleanContexts() throws Exception { } public void testIndexingWithSimpleNULLContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); XContentBuilder builder = jsonBuilder().startObject() .startArray("completion") .startObject() @@ -279,26 +267,24 @@ public void testIndexingWithSimpleNULLContexts() throws Exception { } public void testIndexingWithContextList() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -322,26 +308,24 @@ public void testIndexingWithContextList() throws Exception { } public void testIndexingWithMixedTypeContextList() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); ParsedDocument parsedDocument = defaultMapper.parse( new SourceToParse( @@ -365,26 +349,24 @@ public void testIndexingWithMixedTypeContextList() throws Exception { } public void testIndexingWithMixedTypeContextListHavingNULL() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); XContentBuilder builder = jsonBuilder().startObject() .startObject("completion") .array("input", "suggestion5", "suggestion6", "suggestion7") @@ -403,30 +385,28 @@ public void testIndexingWithMixedTypeContextListHavingNULL() throws Exception { } public void testIndexingWithMultipleContexts() throws Exception { - String mapping = Strings.toString( - jsonBuilder().startObject() - .startObject("type1") - .startObject("properties") - .startObject("completion") - .field("type", "completion") - .startArray("contexts") - .startObject() - .field("name", "ctx") - .field("type", "category") - .endObject() - .startObject() - .field("name", "type") - .field("type", "category") - .endObject() - .endArray() - .endObject() - .endObject() - .endObject() - .endObject() - ); + XContentBuilder mapping = jsonBuilder().startObject() + .startObject("type1") + .startObject("properties") + .startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .startObject() + .field("name", "type") + .field("type", "category") + .endObject() + .endArray() + .endObject() + .endObject() + .endObject() + .endObject(); DocumentMapper defaultMapper = createIndex("test").mapperService() - .merge("type1", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + .merge(toMappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); Mapper fieldMapper = defaultMapper.mappers().getMapper("completion"); XContentBuilder builder = jsonBuilder().startObject() .startArray("completion") diff --git a/server/src/test/java/org/elasticsearch/search/vectors/KnnVectorQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/search/vectors/KnnVectorQueryBuilderTests.java index d52cafc8e6857..cce93b8a4ff14 100644 --- a/server/src/test/java/org/elasticsearch/search/vectors/KnnVectorQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/vectors/KnnVectorQueryBuilderTests.java @@ -13,8 +13,6 @@ import org.apache.lucene.search.KnnVectorQuery; import org.apache.lucene.search.Query; import org.elasticsearch.Version; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.StreamInput; @@ -46,6 +44,7 @@ public class KnnVectorQueryBuilderTests extends AbstractQueryTestCase ne .endObject() ); final DocumentMapper nestedMapper = mapperService.merge( - "type", - new CompressedXContent(nestedMapping), + new MappingMetadata(new CompressedXContent(nestedMapping)), MapperService.MergeReason.MAPPING_UPDATE ); return (docId, nestedFieldValues) -> { diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperServiceTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperServiceTestCase.java index 64873bab78024..75f5b968c9604 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperServiceTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperServiceTestCase.java @@ -21,6 +21,7 @@ import org.apache.lucene.util.Accountable; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.TriFunction; import org.elasticsearch.common.breaker.CircuitBreaker; @@ -299,18 +300,26 @@ protected final void merge(MapperService mapperService, XContentBuilder mapping) * Merge a new mapping into the one in the provided {@link MapperService}. */ protected final void merge(MapperService mapperService, String mapping) throws IOException { - mapperService.merge(null, new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(mappingMetadata(mapping), MapperService.MergeReason.MAPPING_UPDATE); } protected final void merge(MapperService mapperService, MapperService.MergeReason reason, String mapping) throws IOException { - mapperService.merge(null, new CompressedXContent(mapping), reason); + mapperService.merge(mappingMetadata(mapping), reason); } /** * Merge a new mapping into the one in the provided {@link MapperService} with a specific {@code MergeReason} */ protected final void merge(MapperService mapperService, MapperService.MergeReason reason, XContentBuilder mapping) throws IOException { - mapperService.merge(null, new CompressedXContent(BytesReference.bytes(mapping)), reason); + mapperService.merge(mappingMetadata(mapping), reason); + } + + private static MappingMetadata mappingMetadata(String mapping) throws IOException { + return new MappingMetadata(new CompressedXContent(mapping)); + } + + private static MappingMetadata mappingMetadata(XContentBuilder mapping) throws IOException { + return mappingMetadata(Strings.toString(mapping)); } protected final XContentBuilder topMapping(CheckedConsumer buildFields) throws IOException { diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/MetadataMapperTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/MetadataMapperTestCase.java index 1b9dcd1a5cf5a..45d7e1d6d1ed7 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/MetadataMapperTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/MetadataMapperTestCase.java @@ -9,6 +9,7 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.test.VersionUtils; @@ -119,7 +120,7 @@ public final void testUnsupportedParametersAreRejected() throws IOException { + "}"; MapperParsingException exception = expectThrows( MapperParsingException.class, - () -> mapperService.parseMapping("_doc", new CompressedXContent(mappingAsString)) + () -> mapperService.parseMapping(new MappingMetadata(new CompressedXContent(mappingAsString))) ); assertEquals( "Failed to parse mapping: unknown parameter [anything] on metadata field [" + fieldName() + "]", @@ -135,7 +136,7 @@ public final void testFixedMetaFieldsAreNotConfigurable() throws IOException { String mappingAsString = "{\n" + " \"_doc\" : {\n" + " \"" + fieldName() + "\" : {\n" + " }\n" + " }\n" + "}"; MapperParsingException exception = expectThrows( MapperParsingException.class, - () -> mapperService.parseMapping("_doc", new CompressedXContent(mappingAsString)) + () -> mapperService.parseMapping(new MappingMetadata(new CompressedXContent(mappingAsString))) ); assertEquals("Failed to parse mapping: " + fieldName() + " is not configurable", exception.getMessage()); } @@ -160,7 +161,7 @@ public void testTypeAndFriendsAreAcceptedBefore_8_6_0() throws IOException { + " }\n" + " }\n" + "}"; - assertNotNull(mapperService.parseMapping("_doc", new CompressedXContent(mappingAsString))); + assertNotNull(mapperService.parseMapping(new MappingMetadata(new CompressedXContent(mappingAsString)))); } } @@ -183,7 +184,7 @@ public void testTypeAndFriendsAreDeprecatedFrom_8_6_0() throws IOException { + " }\n" + " }\n" + "}"; - assertNotNull(mapperService.parseMapping("_doc", new CompressedXContent(mappingAsString))); + assertNotNull(mapperService.parseMapping(new MappingMetadata(new CompressedXContent(mappingAsString)))); assertWarnings("Parameter [" + param + "] has no effect on metadata field [" + fieldName() + "] and will be removed in future"); } } diff --git a/test/framework/src/main/java/org/elasticsearch/search/geo/BasePointShapeQueryTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/geo/BasePointShapeQueryTestCase.java index d128a65acb14f..3c4e859c4d9dd 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/geo/BasePointShapeQueryTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/geo/BasePointShapeQueryTestCase.java @@ -310,12 +310,14 @@ public void testIndexPointsIndexedRectangle() throws Exception { String queryShapesMapping = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject(indexedShapePath) .field("type", fieldTypeName()) .endObject() .endObject() .endObject() + .endObject() ); client().admin().indices().prepareCreate(indexedShapeIndex).setMapping(queryShapesMapping).get(); ensureGreen(); diff --git a/test/framework/src/main/java/org/elasticsearch/search/geo/BaseShapeQueryTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/geo/BaseShapeQueryTestCase.java index b1319e59e8515..9853c9732fac5 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/geo/BaseShapeQueryTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/geo/BaseShapeQueryTestCase.java @@ -72,6 +72,7 @@ public void testFieldAlias() throws IOException { String mapping = Strings.toString( XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject(defaultFieldName) .field("type", fieldTypeName()) @@ -82,6 +83,7 @@ public void testFieldAlias() throws IOException { .endObject() .endObject() .endObject() + .endObject() ); client().admin().indices().prepareCreate(defaultIndexName).setMapping(mapping).get(); @@ -299,11 +301,13 @@ public void testGeometryCollectionRelations() throws Exception { public void testEdgeCases() throws Exception { XContentBuilder xcb = XContentFactory.jsonBuilder() .startObject() + .startObject("_doc") .startObject("properties") .startObject(defaultFieldName) .field("type", fieldTypeName()) .endObject() .endObject() + .endObject() .endObject(); String mapping = Strings.toString(xcb); client().admin().indices().prepareCreate(defaultIndexName).setMapping(mapping).get(); diff --git a/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java index 3e7d3f046d4c5..83bd8aa8d6338 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java @@ -23,6 +23,7 @@ import org.elasticsearch.action.termvectors.MultiTermVectorsResponse; import org.elasticsearch.client.internal.Client; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -423,50 +424,51 @@ public void onRemoval(ShardId shardId, Accountable accountable) { if (registerType) { mapperService.merge( - "_doc", - new CompressedXContent( - Strings.toString( - PutMappingRequest.simpleMapping( - TEXT_FIELD_NAME, - "type=text", - KEYWORD_FIELD_NAME, - "type=keyword", - TEXT_ALIAS_FIELD_NAME, - "type=alias,path=" + TEXT_FIELD_NAME, - INT_FIELD_NAME, - "type=integer", - INT_ALIAS_FIELD_NAME, - "type=alias,path=" + INT_FIELD_NAME, - INT_RANGE_FIELD_NAME, - "type=integer_range", - DOUBLE_FIELD_NAME, - "type=double", - BOOLEAN_FIELD_NAME, - "type=boolean", - DATE_NANOS_FIELD_NAME, - "type=date_nanos", - DATE_FIELD_NAME, - "type=date", - DATE_ALIAS_FIELD_NAME, - "type=alias,path=" + DATE_FIELD_NAME, - DATE_RANGE_FIELD_NAME, - "type=date_range", - OBJECT_FIELD_NAME, - "type=object", - GEO_POINT_FIELD_NAME, - "type=geo_point", - GEO_POINT_ALIAS_FIELD_NAME, - "type=alias,path=" + GEO_POINT_FIELD_NAME, - BINARY_FIELD_NAME, - "type=binary" + new MappingMetadata( + new CompressedXContent( + Strings.toString( + PutMappingRequest.simpleMapping( + TEXT_FIELD_NAME, + "type=text", + KEYWORD_FIELD_NAME, + "type=keyword", + TEXT_ALIAS_FIELD_NAME, + "type=alias,path=" + TEXT_FIELD_NAME, + INT_FIELD_NAME, + "type=integer", + INT_ALIAS_FIELD_NAME, + "type=alias,path=" + INT_FIELD_NAME, + INT_RANGE_FIELD_NAME, + "type=integer_range", + DOUBLE_FIELD_NAME, + "type=double", + BOOLEAN_FIELD_NAME, + "type=boolean", + DATE_NANOS_FIELD_NAME, + "type=date_nanos", + DATE_FIELD_NAME, + "type=date", + DATE_ALIAS_FIELD_NAME, + "type=alias,path=" + DATE_FIELD_NAME, + DATE_RANGE_FIELD_NAME, + "type=date_range", + OBJECT_FIELD_NAME, + "type=object", + GEO_POINT_FIELD_NAME, + "type=geo_point", + GEO_POINT_ALIAS_FIELD_NAME, + "type=alias,path=" + GEO_POINT_FIELD_NAME, + BINARY_FIELD_NAME, + "type=binary" + ) ) ) ), MapperService.MergeReason.MAPPING_UPDATE ); // also add mappings for two inner field in the object field - mapperService.merge("_doc", new CompressedXContent(Strings.format(""" - { + mapperService.merge(new MappingMetadata(new CompressedXContent(Strings.format(""" + { "_doc" : { "properties": { "%s": { "type": "object", @@ -480,7 +482,7 @@ public void onRemoval(ShardId shardId, Accountable accountable) { } } } - }""", OBJECT_FIELD_NAME, DATE_FIELD_NAME, INT_FIELD_NAME)), MapperService.MergeReason.MAPPING_UPDATE); + }}""", OBJECT_FIELD_NAME, DATE_FIELD_NAME, INT_FIELD_NAME))), MapperService.MergeReason.MAPPING_UPDATE); testCase.initializeAdditionalMappings(mapperService); } } diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index ec84f606fd0f1..21333b8f40b3e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -44,7 +44,9 @@ import org.elasticsearch.client.internal.Requests; import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteable; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; @@ -1901,4 +1903,8 @@ protected static SecureRandom secureRandomFips(final byte[] seed) throws NoSuchA secureRandomFips.setSeed(seed); // DEFAULT/BCFIPS setSeed() is non-deterministic return secureRandomFips; } + + protected static MappingMetadata toMappingMetadata(XContentBuilder b) throws IOException { + return new MappingMetadata(new CompressedXContent(BytesReference.bytes(b))); + } } diff --git a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java index 0aebc349c4174..08292b0d53efe 100644 --- a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java +++ b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java @@ -21,7 +21,6 @@ import java.util.Locale; import java.util.Map; import java.util.function.BiConsumer; -import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; @@ -134,7 +133,6 @@ private static void fieldLevelMappingIssue(IndexMetadata indexMetadata, BiConsum * iterates through the "properties" field of mappings and returns any predicates that match in the * form of issue-strings. * - * @param type the document type * @param parentMap the mapping to read properties from * @param predicate the predicate to check against for issues, issue is returned if predicate evaluates to true * @param fieldFormatter a function that takes a type and mapping field entry and returns a formatted field representation @@ -142,10 +140,9 @@ private static void fieldLevelMappingIssue(IndexMetadata indexMetadata, BiConsum */ @SuppressWarnings("unchecked") static List findInPropertiesRecursively( - String type, Map parentMap, Function, Boolean> predicate, - BiFunction, String> fieldFormatter, + Function, String> fieldFormatter, String fieldBeginMarker, String fieldEndMarker ) { @@ -157,7 +154,7 @@ static List findInPropertiesRecursively( for (Map.Entry entry : properties.entrySet()) { Map valueMap = (Map) entry.getValue(); if (predicate.apply(valueMap)) { - issues.add(fieldBeginMarker + fieldFormatter.apply(type, entry) + fieldEndMarker); + issues.add(fieldBeginMarker + fieldFormatter.apply(entry) + fieldEndMarker); } Map values = (Map) valueMap.get("fields"); @@ -166,29 +163,18 @@ static List findInPropertiesRecursively( Map multifieldValueMap = (Map) multifieldEntry.getValue(); if (predicate.apply(multifieldValueMap)) { issues.add( - fieldBeginMarker - + fieldFormatter.apply(type, entry) - + ", multifield: " - + multifieldEntry.getKey() - + fieldEndMarker + fieldBeginMarker + fieldFormatter.apply(entry) + ", multifield: " + multifieldEntry.getKey() + fieldEndMarker ); } if (multifieldValueMap.containsKey("properties")) { issues.addAll( - findInPropertiesRecursively( - type, - multifieldValueMap, - predicate, - fieldFormatter, - fieldBeginMarker, - fieldEndMarker - ) + findInPropertiesRecursively(multifieldValueMap, predicate, fieldFormatter, fieldBeginMarker, fieldEndMarker) ); } } } if (valueMap.containsKey("properties")) { - issues.addAll(findInPropertiesRecursively(type, valueMap, predicate, fieldFormatter, fieldBeginMarker, fieldEndMarker)); + issues.addAll(findInPropertiesRecursively(valueMap, predicate, fieldFormatter, fieldBeginMarker, fieldEndMarker)); } } @@ -201,7 +187,6 @@ static DeprecationIssue deprecatedCamelCasePattern(IndexMetadata indexMetadata) indexMetadata, ((mappingMetadata, sourceAsMap) -> fields.addAll( findInPropertiesRecursively( - mappingMetadata.type(), sourceAsMap, IndexDeprecationChecks::isDateFieldWithCamelCasePattern, IndexDeprecationChecks::changeFormatToSnakeCase, @@ -236,7 +221,7 @@ private static boolean isDateFieldWithCamelCasePattern(Map property) { return false; } - private static String changeFormatToSnakeCase(String type, Map.Entry entry) { + private static String changeFormatToSnakeCase(Map.Entry entry) { Map value = (Map) entry.getValue(); final String formatFieldValue = (String) value.get("format"); String[] patterns = DateFormatter.splitCombinedPatterns(formatFieldValue); diff --git a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java index 75c9d2c3c257b..5cc28f7efd872 100644 --- a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java +++ b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java @@ -9,6 +9,7 @@ import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; @@ -99,7 +100,7 @@ public void testDynamicValue() throws Exception { assertNotNull(doc.dynamicMappingsUpdate()); CompressedXContent mappingUpdate = new CompressedXContent(Strings.toString(doc.dynamicMappingsUpdate())); - DocumentMapper updatedMapper = mapperService.merge("_doc", mappingUpdate, MergeReason.MAPPING_UPDATE); + DocumentMapper updatedMapper = mapperService.merge(new MappingMetadata(mappingUpdate), MergeReason.MAPPING_UPDATE); String expectedMapping = Strings.toString(fieldMapping(b -> b.field("type", "constant_keyword").field("value", "foo"))); assertEquals(expectedMapping, updatedMapper.mappingSource().toString()); @@ -119,7 +120,7 @@ public void testDynamicValueFieldLimit() throws Exception { assertNotNull(doc.dynamicMappingsUpdate()); CompressedXContent mappingUpdate = new CompressedXContent(Strings.toString(doc.dynamicMappingsUpdate())); - DocumentMapper updatedMapper = mapperService.merge("_doc", mappingUpdate, MergeReason.MAPPING_UPDATE); + DocumentMapper updatedMapper = mapperService.merge(new MappingMetadata(mappingUpdate), MergeReason.MAPPING_UPDATE); String expectedMapping = Strings.toString(fieldMapping(b -> b.field("type", "constant_keyword").field("value", "foo"))); assertEquals(expectedMapping, updatedMapper.mappingSource().toString()); diff --git a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/downsample/TransportRollupAction.java b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/downsample/TransportRollupAction.java index 1c52ef19dbbf4..1f99010ad31a9 100644 --- a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/downsample/TransportRollupAction.java +++ b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/downsample/TransportRollupAction.java @@ -33,6 +33,7 @@ import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.MetadataCreateIndexService; import org.elasticsearch.cluster.routing.allocation.allocator.AllocationActionListener; @@ -229,8 +230,8 @@ protected void masterOperation( // 2. Extract rollup config from index mappings final MapperService mapperService = indicesService.createIndexMapperServiceForValidation(sourceIndexMetadata); - final CompressedXContent sourceIndexCompressedXContent = new CompressedXContent(sourceIndexMappings); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, sourceIndexCompressedXContent, MapperService.MergeReason.INDEX_TEMPLATE); + final MappingMetadata sourceMapping = new MappingMetadata(MapperService.SINGLE_MAPPING_NAME, sourceIndexMappings); + mapperService.merge(sourceMapping, MapperService.MergeReason.INDEX_TEMPLATE); // Validate downsampling interval validateDownsamplingInterval(mapperService, request.getDownsampleConfig()); @@ -423,7 +424,7 @@ public static String createRollupIndexMapping( final MapperService mapperService, final Map sourceIndexMappings ) throws IOException { - final XContentBuilder builder = XContentFactory.jsonBuilder().startObject(); + final XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("_doc"); addDynamicTemplates(builder); @@ -434,11 +435,12 @@ public static String createRollupIndexMapping( builder.endObject(); // match initial startObject builder.endObject(); // match startObject("properties") + builder.endObject(); // _doc final CompressedXContent rollupDiffXContent = CompressedXContent.fromJSON( XContentHelper.convertToJson(BytesReference.bytes(builder), false, XContentType.JSON) ); - return mapperService.merge(MapperService.SINGLE_MAPPING_NAME, rollupDiffXContent, MapperService.MergeReason.INDEX_TEMPLATE) + return mapperService.merge(new MappingMetadata(rollupDiffXContent), MapperService.MergeReason.INDEX_TEMPLATE) .mappingSource() .uncompressed() .utf8ToString(); diff --git a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/downsample/DownsampleActionSingleNodeTests.java b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/downsample/DownsampleActionSingleNodeTests.java index 5a34a95f74a2e..1376857ce9ca2 100644 --- a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/downsample/DownsampleActionSingleNodeTests.java +++ b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/downsample/DownsampleActionSingleNodeTests.java @@ -29,6 +29,7 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.metadata.Template; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.document.DocumentField; @@ -738,8 +739,8 @@ private void assertRollupIndex(String sourceIndex, String rollupIndex, Downsampl final IndexMetadata indexMetadata = client().admin().cluster().prepareState().get().getState().getMetadata().index(sourceIndex); final IndicesService indicesService = getInstanceFromNode(IndicesService.class); final MapperService mapperService = indicesService.createIndexMapperServiceForValidation(indexMetadata); - final CompressedXContent sourceIndexCompressedXContent = new CompressedXContent(sourceIndexMappings); - mapperService.merge(MapperService.SINGLE_MAPPING_NAME, sourceIndexCompressedXContent, MapperService.MergeReason.INDEX_TEMPLATE); + final MappingMetadata mappingMetadata = new MappingMetadata(MapperService.SINGLE_MAPPING_NAME, sourceIndexMappings); + mapperService.merge(mappingMetadata, MapperService.MergeReason.INDEX_TEMPLATE); TimeseriesFieldTypeHelper helper = new TimeseriesFieldTypeHelper.Builder(mapperService).build(config.getTimestampField()); Map metricFields = new HashMap<>(); diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/support/SecurityIndexManager.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/support/SecurityIndexManager.java index 1277d99c2acca..548d3a591ee01 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/support/SecurityIndexManager.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/support/SecurityIndexManager.java @@ -318,7 +318,7 @@ private static Version readMappingVersion(String indexName, MappingMetadata mapp @SuppressWarnings("unchecked") Map meta = (Map) mappingMetadata.sourceAsMap().get("_meta"); if (meta == null) { - logger.info("Missing _meta field in mapping [{}] of index [{}]", mappingMetadata.type(), indexName); + logger.info("Missing _meta field in mapping of index [{}]", indexName); throw new IllegalStateException("Cannot read security-version string in index " + indexName); } return Version.fromString((String) meta.get(SECURITY_VERSION_STRING)); diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoBoundingBoxQueryBuilderGeoShapeTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoBoundingBoxQueryBuilderGeoShapeTests.java index 3f238df92a14c..9366170186e80 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoBoundingBoxQueryBuilderGeoShapeTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoBoundingBoxQueryBuilderGeoShapeTests.java @@ -11,8 +11,6 @@ import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.GeoBoundingBoxQueryBuilder; @@ -40,7 +38,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws GEO_SHAPE_ALIAS_FIELD_NAME, "type=alias,path=" + GEO_SHAPE_FIELD_NAME ); - mapperService.merge("_doc", new CompressedXContent(Strings.toString(builder)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(builder), MapperService.MergeReason.MAPPING_UPDATE); } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoDistanceQueryBuilderGeoShapeTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoDistanceQueryBuilderGeoShapeTests.java index 52857c30813c8..21d58e73b5c70 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoDistanceQueryBuilderGeoShapeTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoDistanceQueryBuilderGeoShapeTests.java @@ -11,8 +11,6 @@ import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.GeoDistanceQueryBuilder; @@ -41,7 +39,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws GEO_SHAPE_ALIAS_FIELD_NAME, "type=alias,path=" + GEO_SHAPE_FIELD_NAME ); - mapperService.merge("_doc", new CompressedXContent(Strings.toString(builder)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(builder), MapperService.MergeReason.MAPPING_UPDATE); } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoGridQueryBuilderTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoGridQueryBuilderTests.java index fc782adc5c5c1..bf88a0de7e651 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoGridQueryBuilderTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoGridQueryBuilderTests.java @@ -15,7 +15,6 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.geo.GeometryTestUtils; import org.elasticsearch.geometry.Rectangle; import org.elasticsearch.geometry.utils.Geohash; @@ -54,7 +53,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws GEO_SHAPE_ALIAS_FIELD_NAME, "type=alias,path=" + GEO_SHAPE_FIELD_NAME ); - mapperService.merge("_doc", new CompressedXContent(Strings.toString(builder)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(builder), MapperService.MergeReason.MAPPING_UPDATE); } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeQueryBuilderGeoShapeTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeQueryBuilderGeoShapeTests.java index 596e0d9c730c8..038652bfe3970 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeQueryBuilderGeoShapeTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeQueryBuilderGeoShapeTests.java @@ -8,8 +8,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.geo.GeometryTestUtils; import org.elasticsearch.geometry.Geometry; @@ -42,7 +40,7 @@ protected void initializeAdditionalMappings(MapperService mapperService) throws GEO_SHAPE_ALIAS_FIELD_NAME, "type=alias,path=" + GEO_SHAPE_FIELD_NAME ); - mapperService.merge("_doc", new CompressedXContent(Strings.toString(builder)), MapperService.MergeReason.MAPPING_UPDATE); + mapperService.merge(toMappingMetadata(builder), MapperService.MergeReason.MAPPING_UPDATE); } @Override diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeWithDocValuesQueryBuilderTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeWithDocValuesQueryBuilderTests.java index 48f1c4401d3be..66167a5d34600 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeWithDocValuesQueryBuilderTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/GeoShapeWithDocValuesQueryBuilderTests.java @@ -11,8 +11,6 @@ import org.apache.lucene.search.IndexOrDocValuesQuery; import org.apache.lucene.search.Query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.geo.GeometryTestUtils; import org.elasticsearch.geometry.Geometry; import org.elasticsearch.index.mapper.MappedFieldType; @@ -42,14 +40,12 @@ protected Collection> getPlugins() { protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { if (randomBoolean()) { mapperService.merge( - "_doc", - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping("test", "type=geo_shape"))), + toMappingMetadata(PutMappingRequest.simpleMapping("test", "type=geo_shape")), MapperService.MergeReason.MAPPING_UPDATE ); } else { mapperService.merge( - "_doc", - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping("test", "type=geo_shape,doc_values=false"))), + toMappingMetadata(PutMappingRequest.simpleMapping("test", "type=geo_shape,doc_values=false")), MapperService.MergeReason.MAPPING_UPDATE ); } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverPointTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverPointTests.java index 90b57b95b03e3..2cf048c7d5973 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverPointTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverPointTests.java @@ -7,8 +7,6 @@ package org.elasticsearch.xpack.spatial.index.query; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.geometry.Geometry; import org.elasticsearch.geometry.ShapeType; @@ -22,8 +20,7 @@ public class ShapeQueryBuilderOverPointTests extends ShapeQueryBuilderTests { @Override protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { mapperService.merge( - docType, - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping(fieldName(), "type=point"))), + toMappingMetadata(PutMappingRequest.simpleMapping(fieldName(), "type=point")), MapperService.MergeReason.MAPPING_UPDATE ); } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverShapeTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverShapeTests.java index cf0ebb1e43af2..b392f2fe41cfd 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverShapeTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/query/ShapeQueryBuilderOverShapeTests.java @@ -8,8 +8,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.geometry.Geometry; import org.elasticsearch.geometry.ShapeType; @@ -24,8 +22,7 @@ public class ShapeQueryBuilderOverShapeTests extends ShapeQueryBuilderTests { @Override protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { mapperService.merge( - docType, - new CompressedXContent(Strings.toString(PutMappingRequest.simpleMapping(fieldName(), "type=shape"))), + toMappingMetadata(PutMappingRequest.simpleMapping(fieldName(), "type=shape")), MapperService.MergeReason.MAPPING_UPDATE ); } From 8db704c5ea07fd3f1060ad4f0da0f1c7371ab264 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Tue, 17 Jan 2023 12:23:29 +0000 Subject: [PATCH 2/2] javadocs to make this a bit clearer --- .../cluster/metadata/MappingMetadata.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java index 3bc16d6e676d1..74fab52ccdab5 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MappingMetadata.java @@ -54,6 +54,12 @@ public MappingMetadata(DocumentMapper docMapper) { this.routingRequired = docMapper.routingFieldMapper().required(); } + /** + * Create MappingMetadata from compressed XContent + * + * The xcontent should have a containing map whose key is a type - typically '_doc'. This + * will be discarded when the mapping is returned via {@link #sourceAsMap()} + */ public MappingMetadata(CompressedXContent mapping) { this.source = mapping; // TODO do this via pull parsing - we don't need to reify the whole map! @@ -67,6 +73,11 @@ public MappingMetadata(CompressedXContent mapping) { } } + /** + * Create MappingMetadata from a java map + * @param type the type, typically _doc + * @param mapping the mappings, which may or not be wrapped with the type + */ public MappingMetadata(String type, Map mapping) { this.type = type; try {