From 78d310e0aebf6aea882d755ffc1a0ed3336853c0 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 16:38:14 +0200 Subject: [PATCH 01/13] Read subobjects mapping parameter in advance As part of #86166 we added support for a new mapping parameter called `subobjects` that can be set to the `object` field type. Such parameter will affect not only how incoming documents will be dinamically mapped in the future, but also how field names are treated as part of the mappings themselves. Mappings get parsed into a map, where keys ordering is not guaranteed. In case a mappings call contains `subobjects` set to `false` and also sub-fields for that same object, we need to make sure that we read the parameter in advance in order to know how to treat the sub-field and decide whether we need to expand dots in field names or leave them as they are. --- .../test/index/91_metrics_no_subobjects.yml | 53 +++++++++++++++++-- .../index/mapper/NestedObjectMapper.java | 7 +-- .../index/mapper/ObjectMapper.java | 13 +++-- .../index/mapper/RootObjectMapper.java | 1 + 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml index 721afdf2812e2..1f3211e2fbcc8 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml @@ -1,5 +1,5 @@ --- -"Metrics indexing": +"Metrics object indexing": - skip: version: " - 8.2.99" reason: added in 8.3.0 @@ -16,6 +16,9 @@ mapping: type: object subobjects: false + properties: + host.name: + type: keyword - do: index: @@ -23,15 +26,59 @@ id: 1 refresh: true body: - { metrics.time: 10, metrics.time.max: 100, metrics.time.min: 1 } + { metrics.host.name: localhost, metrics.host.id: 1, metrics.time: 10, metrics.time.max: 100, metrics.time.min: 1 } - do: field_caps: index: test-1 - fields: metrics.time* + fields: metrics* + - match: {fields.metrics\.host\.id.long.searchable: true} + - match: {fields.metrics\.host\.id.long.aggregatable: true} + - match: {fields.metrics\.host\.name.keyword.searchable: true} + - match: {fields.metrics\.host\.name.keyword.aggregatable: true} - match: {fields.metrics\.time.long.searchable: true} - match: {fields.metrics\.time.long.aggregatable: true} - match: {fields.metrics\.time\.max.long.searchable: true} - match: {fields.metrics\.time\.max.long.aggregatable: true} - match: {fields.metrics\.time\.min.long.searchable: true} - match: {fields.metrics\.time\.min.long.aggregatable: true} + +--- +"Root without subobjects": + - skip: + version: " - 8.2.99" + reason: added in 8.3.0 + + - do: + indices.put_template: + name: test + body: + index_patterns: test-* + mappings: + subobjects: false + properties: + host.name: + type: keyword + + - do: + index: + index: test-1 + id: 1 + refresh: true + body: + { host.name: localhost, host.id: 1, time: 10, time.max: 100, time.min: 1 } + + - do: + field_caps: + index: test-1 + fields: [host*, time*] + - match: {fields.host\.name.keyword.searchable: true} + - match: {fields.host\.name.keyword.aggregatable: true} + - match: {fields.host\.id.keyword.searchable: true} + - match: {fields.host\.id.keyword.aggregatable: true} + - match: {fields.time.long.searchable: true} + - match: {fields.time.long.aggregatable: true} + - match: {fields.time\.max.long.searchable: true} + - match: {fields.time\.max.long.aggregatable: true} + - match: {fields.time\.min.long.searchable: true} + - match: {fields.time\.min.long.aggregatable: true} diff --git a/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java index c228b70db8eab..9061235658735 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java @@ -58,6 +58,10 @@ public static class TypeParser extends ObjectMapper.TypeParser { public Mapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { NestedObjectMapper.Builder builder = new NestedObjectMapper.Builder(name, parserContext.indexVersionCreated()); + parseSubobjects(node, builder); + if (builder.subobjects.explicit()) { + throw new MapperParsingException("Nested type [" + name + "] does not support [subobjects] parameter"); + } parseNested(name, node, builder); for (Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); @@ -67,9 +71,6 @@ public Mapper.Builder parse(String name, Map node, MappingParser iterator.remove(); } } - if (builder.subobjects.explicit()) { - throw new MapperParsingException("Nested type [" + name + "] does not support [subobjects] parameter"); - } return builder; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java index 2d88ff7c657a5..1a7e268223425 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -187,6 +187,7 @@ public boolean supportsVersion(Version indexCreatedVersion) { public Mapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { ObjectMapper.Builder builder = new Builder(name); + parseSubobjects(node, builder); for (Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); String fieldName = entry.getKey(); @@ -219,9 +220,6 @@ protected static boolean parseObjectOrDocumentTypeProperties( } else if (fieldName.equals("enabled")) { builder.enabled(XContentMapValues.nodeBooleanValue(fieldNode, fieldName + ".enabled")); return true; - } else if (fieldName.equals("subobjects")) { - builder.subobjects(XContentMapValues.nodeBooleanValue(fieldNode, fieldName + ".subobjects")); - return true; } else if (fieldName.equals("properties")) { if (fieldNode instanceof Collection && ((Collection) fieldNode).isEmpty()) { // nothing to do here, empty (to support "properties: []" case) @@ -242,6 +240,13 @@ protected static boolean parseObjectOrDocumentTypeProperties( return false; } + protected static void parseSubobjects(Map node, ObjectMapper.Builder builder) { + Object subobjectsNode = node.remove("subobjects"); + if (subobjectsNode != null) { + builder.subobjects(XContentMapValues.nodeBooleanValue(subobjectsNode, "subobjects.subobjects")); + } + } + protected static void parseProperties( ObjectMapper.Builder objBuilder, Map propsNode, @@ -493,6 +498,8 @@ protected void doMerge(final ObjectMapper mergeWith, MergeReason reason) { } if (mergedMappers != null) { mappers = Map.copyOf(mergedMappers); + System.out.println(mappers); + Thread.dumpStack(); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java index d1f446f8ab070..939b347247aea 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java @@ -153,6 +153,7 @@ static final class TypeParser extends ObjectMapper.TypeParser { public RootObjectMapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { RootObjectMapper.Builder builder = new Builder(name); + parseSubobjects(node, builder); Iterator> iterator = node.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); From dd7f77e5000131a4feb68cd29709ec8f384693be Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 16:42:45 +0200 Subject: [PATCH 02/13] leftover --- .../main/java/org/elasticsearch/index/mapper/ObjectMapper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java index 1a7e268223425..524ed98e43d96 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -498,8 +498,6 @@ protected void doMerge(final ObjectMapper mergeWith, MergeReason reason) { } if (mergedMappers != null) { mappers = Map.copyOf(mergedMappers); - System.out.println(mappers); - Thread.dumpStack(); } } From efa60b6735ec9435e4583e2b6650a63e05b436e3 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 17:28:12 +0200 Subject: [PATCH 03/13] make subobjects final in ObjectMapper.Builder --- .../index/mapper/DocumentMapper.java | 4 ++- .../index/mapper/DynamicFieldsBuilder.java | 3 ++- .../elasticsearch/index/mapper/Mapping.java | 2 +- .../index/mapper/NestedObjectMapper.java | 7 +++-- .../index/mapper/ObjectMapper.java | 26 ++++++++----------- .../index/mapper/RootObjectMapper.java | 11 ++++---- .../index/MappingUpdatedActionTests.java | 4 ++- .../FieldAliasMapperValidationTests.java | 2 +- .../index/mapper/MappingLookupTests.java | 2 +- .../index/mapper/ObjectMapperMergeTests.java | 14 +++++----- .../query/SearchExecutionContextTests.java | 3 ++- .../metadata/DataStreamTestHelper.java | 6 +++-- 12 files changed, 44 insertions(+), 40 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java index 46e51d92a399b..8125dcdee5ea6 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java @@ -8,6 +8,7 @@ package org.elasticsearch.index.mapper; +import org.elasticsearch.common.Explicit; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.IndexSettings; @@ -25,7 +26,8 @@ public class DocumentMapper { * @return the newly created document mapper */ public static DocumentMapper createEmpty(MapperService mapperService) { - RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME).build(MapperBuilderContext.ROOT); + RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, ObjectMapper.Defaults.SUBOBJECTS) + .build(MapperBuilderContext.ROOT); MetadataFieldMapper[] metadata = mapperService.getMetadataMappers().values().toArray(new MetadataFieldMapper[0]); Mapping mapping = new Mapping(root, metadata, null); return new DocumentMapper(mapperService.documentParser(), mapping, mapping.toCompressedXContent()); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java index 6d56b230b6a53..cbaa28acb117b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java @@ -159,7 +159,8 @@ void createDynamicFieldFromValue(final DocumentParserContext context, XContentPa */ static Mapper createDynamicObjectMapper(DocumentParserContext context, String name) { Mapper mapper = createObjectMapperFromTemplate(context, name); - return mapper != null ? mapper : new ObjectMapper.Builder(name).enabled(true).build(MapperBuilderContext.forPath(context.path())); + return mapper != null ? mapper : new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS) + .enabled(ObjectMapper.Defaults.ENABLED).build(MapperBuilderContext.forPath(context.path())); } /** diff --git a/server/src/main/java/org/elasticsearch/index/mapper/Mapping.java b/server/src/main/java/org/elasticsearch/index/mapper/Mapping.java index 40bb37d364254..d06e8e0ef35c1 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/Mapping.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/Mapping.java @@ -32,7 +32,7 @@ public final class Mapping implements ToXContentFragment { public static final Mapping EMPTY = new Mapping( - new RootObjectMapper.Builder("_doc").build(MapperBuilderContext.ROOT), + new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS).build(MapperBuilderContext.ROOT), new MetadataFieldMapper[0], null ); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java index 9061235658735..fb89f21ba8ffb 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java @@ -33,7 +33,7 @@ public static class Builder extends ObjectMapper.Builder { private final Version indexCreatedVersion; public Builder(String name, Version indexCreatedVersion) { - super(name); + super(name, Explicit.IMPLICIT_TRUE); this.indexCreatedVersion = indexCreatedVersion; } @@ -57,11 +57,10 @@ public static class TypeParser extends ObjectMapper.TypeParser { @Override public Mapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { - NestedObjectMapper.Builder builder = new NestedObjectMapper.Builder(name, parserContext.indexVersionCreated()); - parseSubobjects(node, builder); - if (builder.subobjects.explicit()) { + if (parseSubobjects(node).explicit()) { throw new MapperParsingException("Nested type [" + name + "] does not support [subobjects] parameter"); } + NestedObjectMapper.Builder builder = new NestedObjectMapper.Builder(name, parserContext.indexVersionCreated()); parseNested(name, node, builder); for (Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java index 524ed98e43d96..0916e1f9f7e7b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -37,6 +37,7 @@ public class ObjectMapper extends Mapper implements Cloneable { public static class Defaults { public static final boolean ENABLED = true; + public static final Explicit SUBOBJECTS = Explicit.IMPLICIT_TRUE; } public enum Dynamic { @@ -61,14 +62,14 @@ DynamicFieldsBuilder getDynamicFieldsBuilder() { } public static class Builder extends Mapper.Builder { - + protected final Explicit subobjects; protected Explicit enabled = Explicit.IMPLICIT_TRUE; - protected Explicit subobjects = Explicit.IMPLICIT_TRUE; protected Dynamic dynamic; protected final List mappersBuilders = new ArrayList<>(); - public Builder(String name) { + public Builder(String name, Explicit subobjects) { super(name); + this.subobjects = subobjects; } public Builder enabled(boolean enabled) { @@ -76,11 +77,6 @@ public Builder enabled(boolean enabled) { return this; } - public Builder subobjects(boolean subobjects) { - this.subobjects = Explicit.explicitBoolean(subobjects); - return this; - } - public Builder dynamic(Dynamic dynamic) { this.dynamic = dynamic; return this; @@ -186,8 +182,8 @@ public boolean supportsVersion(Version indexCreatedVersion) { @Override public Mapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { - ObjectMapper.Builder builder = new Builder(name); - parseSubobjects(node, builder); + Explicit subobjects = parseSubobjects(node); + ObjectMapper.Builder builder = new Builder(name, subobjects); for (Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); String fieldName = entry.getKey(); @@ -240,11 +236,12 @@ protected static boolean parseObjectOrDocumentTypeProperties( return false; } - protected static void parseSubobjects(Map node, ObjectMapper.Builder builder) { + protected static Explicit parseSubobjects(Map node) { Object subobjectsNode = node.remove("subobjects"); if (subobjectsNode != null) { - builder.subobjects(XContentMapValues.nodeBooleanValue(subobjectsNode, "subobjects.subobjects")); + return Explicit.explicitBoolean(XContentMapValues.nodeBooleanValue(subobjectsNode, "subobjects.subobjects")); } + return Explicit.IMPLICIT_TRUE; } protected static void parseProperties( @@ -303,7 +300,7 @@ protected static void parseProperties( String realFieldName = fieldNameParts[fieldNameParts.length - 1]; fieldBuilder = typeParser.parse(realFieldName, propNode, parserContext); for (int i = fieldNameParts.length - 2; i >= 0; --i) { - ObjectMapper.Builder intermediate = new ObjectMapper.Builder(fieldNameParts[i]); + ObjectMapper.Builder intermediate = new ObjectMapper.Builder(fieldNameParts[i], Defaults.SUBOBJECTS); intermediate.add(fieldBuilder); fieldBuilder = intermediate; } @@ -372,9 +369,8 @@ protected ObjectMapper clone() { * @return a Builder that will produce an empty ObjectMapper with the same configuration as this one */ public ObjectMapper.Builder newBuilder(Version indexVersionCreated) { - ObjectMapper.Builder builder = new ObjectMapper.Builder(simpleName()); + ObjectMapper.Builder builder = new ObjectMapper.Builder(simpleName(), subobjects); builder.enabled = this.enabled; - builder.subobjects = this.subobjects; builder.dynamic = this.dynamic; return builder; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java index 939b347247aea..4991cdd0f47b0 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java @@ -70,8 +70,8 @@ public static class Builder extends ObjectMapper.Builder { protected Explicit dateDetection = Defaults.DATE_DETECTION; protected Explicit numericDetection = Defaults.NUMERIC_DETECTION; - public Builder(String name) { - super(name); + public Builder(String name, Explicit subobjects) { + super(name, subobjects); } public Builder dynamicDateTimeFormatter(Collection dateTimeFormatters) { @@ -152,8 +152,8 @@ static final class TypeParser extends ObjectMapper.TypeParser { @Override public RootObjectMapper.Builder parse(String name, Map node, MappingParserContext parserContext) throws MapperParsingException { - RootObjectMapper.Builder builder = new Builder(name); - parseSubobjects(node, builder); + Explicit subobjects = parseSubobjects(node); + RootObjectMapper.Builder builder = new Builder(name, subobjects); Iterator> iterator = node.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); @@ -279,9 +279,8 @@ protected ObjectMapper clone() { @Override public RootObjectMapper.Builder newBuilder(Version indexVersionCreated) { - RootObjectMapper.Builder builder = new RootObjectMapper.Builder(name()); + RootObjectMapper.Builder builder = new RootObjectMapper.Builder(name(), subobjects); builder.enabled = enabled; - builder.subobjects = subobjects; builder.dynamic = dynamic; return builder; } diff --git a/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java b/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java index 0ecbde836c47a..7e1aa653925bd 100644 --- a/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java @@ -26,6 +26,7 @@ import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.Mapping; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ObjectMapper; import org.elasticsearch.index.mapper.RootObjectMapper; import org.elasticsearch.test.ESTestCase; @@ -146,7 +147,8 @@ public void testSendUpdateMappingUsingAutoPutMappingAction() { ); mua.setClient(client); - RootObjectMapper rootObjectMapper = new RootObjectMapper.Builder("name").build(MapperBuilderContext.ROOT); + RootObjectMapper rootObjectMapper = new RootObjectMapper.Builder("name", ObjectMapper.Defaults.SUBOBJECTS) + .build(MapperBuilderContext.ROOT); Mapping update = new Mapping(rootObjectMapper, new MetadataFieldMapper[0], Map.of()); mua.sendUpdateMapping(new Index("name", "uuid"), update, ActionListener.noop()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java b/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java index 769c79e2495eb..62ffbd5e9f312 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java @@ -177,7 +177,7 @@ private static MappingLookup createMappingLookup( List fieldAliasMappers, List runtimeFields ) { - RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc"); + RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS); Map runtimeFieldTypes = runtimeFields.stream().collect(Collectors.toMap(RuntimeField::name, r -> r)); builder.addRuntimeFields(runtimeFieldTypes); Mapping mapping = new Mapping(builder.build(MapperBuilderContext.ROOT), new MetadataFieldMapper[0], Collections.emptyMap()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupTests.java index fb13a2dc8cff4..287663d2c3a12 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupTests.java @@ -39,7 +39,7 @@ private static MappingLookup createMappingLookup( List objectMappers, List runtimeFields ) { - RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc"); + RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS); Map runtimeFieldTypes = runtimeFields.stream().collect(Collectors.toMap(RuntimeField::name, r -> r)); builder.addRuntimeFields(runtimeFieldTypes); Mapping mapping = new Mapping(builder.build(MapperBuilderContext.ROOT), new MetadataFieldMapper[0], Collections.emptyMap()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java index b2d2e7bfdd392..2b13cf1010be4 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java @@ -71,7 +71,7 @@ public void testMergeDisabledField() { // GIVEN a mapping with "foo" field disabled Map mappers = new HashMap<>(); // the field is disabled, and we are not trying to re-enable it, hence merge should work - mappers.put("disabled", new ObjectMapper.Builder("disabled").build(MapperBuilderContext.ROOT)); + mappers.put("disabled", new ObjectMapper.Builder("disabled", ObjectMapper.Defaults.SUBOBJECTS).build(MapperBuilderContext.ROOT)); RootObjectMapper mergeWith = createRootObjectMapper("type1", true, Collections.unmodifiableMap(mappers)); RootObjectMapper merged = (RootObjectMapper) rootObjectMapper.merge(mergeWith); @@ -102,10 +102,10 @@ public void testMergeEnabledForRootMapper() { public void testMergeDisabledRootMapper() { String type = MapperService.SINGLE_MAPPING_NAME; - final RootObjectMapper rootObjectMapper = (RootObjectMapper) new RootObjectMapper.Builder(type).enabled(false) - .build(MapperBuilderContext.ROOT); + final RootObjectMapper rootObjectMapper = (RootObjectMapper) new RootObjectMapper.Builder(type, ObjectMapper.Defaults.SUBOBJECTS) + .enabled(false).build(MapperBuilderContext.ROOT); // the root is disabled, and we are not trying to re-enable it, but we do want to be able to add runtime fields - final RootObjectMapper mergeWith = new RootObjectMapper.Builder(type).addRuntimeFields( + final RootObjectMapper mergeWith = new RootObjectMapper.Builder(type, ObjectMapper.Defaults.SUBOBJECTS).addRuntimeFields( Collections.singletonMap("test", new TestRuntimeField("test", "long")) ).build(MapperBuilderContext.ROOT); @@ -133,11 +133,13 @@ public void testMergeNested() { } private static RootObjectMapper createRootObjectMapper(String name, boolean enabled, Map mappers) { - return (RootObjectMapper) new RootObjectMapper.Builder(name).enabled(enabled).addMappers(mappers).build(MapperBuilderContext.ROOT); + return (RootObjectMapper) new RootObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(enabled) + .addMappers(mappers).build(MapperBuilderContext.ROOT); } private static ObjectMapper createObjectMapper(String name, boolean enabled, Map mappers) { - return new ObjectMapper.Builder(name).enabled(enabled).addMappers(mappers).build(MapperBuilderContext.ROOT); + return new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(enabled) + .addMappers(mappers).build(MapperBuilderContext.ROOT); } private TextFieldMapper createTextFieldMapper(String name) { diff --git a/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java b/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java index b2bbbe3898f0e..4f87376311452 100644 --- a/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java @@ -53,6 +53,7 @@ import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.MockFieldMapper; import org.elasticsearch.index.mapper.NumberFieldMapper; +import org.elasticsearch.index.mapper.ObjectMapper; import org.elasticsearch.index.mapper.RootObjectMapper; import org.elasticsearch.index.mapper.RuntimeField; import org.elasticsearch.index.mapper.TestRuntimeField; @@ -300,7 +301,7 @@ public void testFielddataLookupOneFieldManyReferences() throws IOException { private static MappingLookup createMappingLookup(List concreteFields, List runtimeFields) { List mappers = concreteFields.stream().map(MockFieldMapper::new).toList(); - RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc"); + RootObjectMapper.Builder builder = new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS); Map runtimeFieldTypes = runtimeFields.stream().collect(Collectors.toMap(RuntimeField::name, r -> r)); builder.addRuntimeFields(runtimeFieldTypes); Mapping mapping = new Mapping(builder.build(MapperBuilderContext.ROOT), new MetadataFieldMapper[0], Collections.emptyMap()); diff --git a/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java b/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java index 5ee531ecdbd76..cf13258d636a7 100644 --- a/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java +++ b/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java @@ -35,6 +35,7 @@ import org.elasticsearch.index.mapper.MappingLookup; import org.elasticsearch.index.mapper.MappingParserContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ObjectMapper; import org.elasticsearch.index.mapper.RootObjectMapper; import org.elasticsearch.index.mapper.RoutingFieldMapper; import org.elasticsearch.index.shard.IndexEventListener; @@ -451,7 +452,7 @@ public static MetadataRolloverService getMetadataRolloverService( when(allocationService.reroute(any(ClusterState.class), any(String.class))).then(i -> i.getArguments()[0]); MappingLookup mappingLookup = null; if (dataStream != null) { - RootObjectMapper.Builder root = new RootObjectMapper.Builder("_doc"); + RootObjectMapper.Builder root = new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS); root.add( new DateFieldMapper.Builder( dataStream.getTimeStampField().getName(), @@ -514,7 +515,8 @@ public static IndicesService mockIndicesServices(MappingLookup mappingLookup) th when(indexService.index()).thenReturn(indexMetadata.getIndex()); MapperService mapperService = mock(MapperService.class); - RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME).build(MapperBuilderContext.ROOT); + RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, + ObjectMapper.Defaults.SUBOBJECTS).build(MapperBuilderContext.ROOT); Mapping mapping = new Mapping(root, new MetadataFieldMapper[0], null); DocumentMapper documentMapper = mock(DocumentMapper.class); when(documentMapper.mapping()).thenReturn(mapping); From 09a61b1a3597dfad12e32fc9148d7df0351da948 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 17:37:07 +0200 Subject: [PATCH 04/13] iter --- .../java/org/elasticsearch/index/mapper/ObjectMapper.java | 2 +- .../org/elasticsearch/index/mapper/ObjectMapperTests.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java index 0916e1f9f7e7b..4df3c73d11d66 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -515,7 +515,7 @@ void toXContent(XContentBuilder builder, Params params, ToXContent custom) throw if (isEnabled() != Defaults.ENABLED) { builder.field("enabled", enabled.value()); } - if (subobjects() == false) { + if (subobjects != Defaults.SUBOBJECTS) { builder.field("subobjects", subobjects.value()); } if (custom != null) { 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 61e1d9bc849ac..7871b10f25cf7 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java @@ -419,6 +419,11 @@ public void testSubobjectsFalseRoot() throws Exception { assertNotNull(mapperService.fieldType("metrics.service.time.max")); } + public void testExplicitDefaultSubobjects() throws Exception { + MapperService mapperService = createMapperService(topMapping(b -> b.field("subobjects", true))); + assertEquals("{\"_doc\":{\"subobjects\":true}}", Strings.toString(mapperService.mappingLookup().getMapping())); + } + public void testSubobjectsFalseRootWithInnerObject() { MapperParsingException exception = expectThrows(MapperParsingException.class, () -> createMapperService(topMapping(b -> { b.field("subobjects", false); From 9c3a46212b26049725cc73adfe207375c0e956dd Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 17:38:17 +0200 Subject: [PATCH 05/13] spotless --- .../org/elasticsearch/index/mapper/DocumentMapper.java | 6 +++--- .../elasticsearch/index/mapper/DynamicFieldsBuilder.java | 6 ++++-- .../cluster/action/index/MappingUpdatedActionTests.java | 5 +++-- .../index/mapper/ObjectMapperMergeTests.java | 9 ++++++--- .../cluster/metadata/DataStreamTestHelper.java | 5 +++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java index 8125dcdee5ea6..bfa6ea4a675df 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.mapper; -import org.elasticsearch.common.Explicit; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.index.IndexSettings; @@ -26,8 +25,9 @@ public class DocumentMapper { * @return the newly created document mapper */ public static DocumentMapper createEmpty(MapperService mapperService) { - RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, ObjectMapper.Defaults.SUBOBJECTS) - .build(MapperBuilderContext.ROOT); + RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, ObjectMapper.Defaults.SUBOBJECTS).build( + MapperBuilderContext.ROOT + ); MetadataFieldMapper[] metadata = mapperService.getMetadataMappers().values().toArray(new MetadataFieldMapper[0]); Mapping mapping = new Mapping(root, metadata, null); return new DocumentMapper(mapperService.documentParser(), mapping, mapping.toCompressedXContent()); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java index cbaa28acb117b..b2ce1cb371a51 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java @@ -159,8 +159,10 @@ void createDynamicFieldFromValue(final DocumentParserContext context, XContentPa */ static Mapper createDynamicObjectMapper(DocumentParserContext context, String name) { Mapper mapper = createObjectMapperFromTemplate(context, name); - return mapper != null ? mapper : new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS) - .enabled(ObjectMapper.Defaults.ENABLED).build(MapperBuilderContext.forPath(context.path())); + return mapper != null + ? mapper + : new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(ObjectMapper.Defaults.ENABLED) + .build(MapperBuilderContext.forPath(context.path())); } /** diff --git a/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java b/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java index 7e1aa653925bd..db34e85504f5a 100644 --- a/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/action/index/MappingUpdatedActionTests.java @@ -147,8 +147,9 @@ public void testSendUpdateMappingUsingAutoPutMappingAction() { ); mua.setClient(client); - RootObjectMapper rootObjectMapper = new RootObjectMapper.Builder("name", ObjectMapper.Defaults.SUBOBJECTS) - .build(MapperBuilderContext.ROOT); + RootObjectMapper rootObjectMapper = new RootObjectMapper.Builder("name", ObjectMapper.Defaults.SUBOBJECTS).build( + MapperBuilderContext.ROOT + ); Mapping update = new Mapping(rootObjectMapper, new MetadataFieldMapper[0], Map.of()); mua.sendUpdateMapping(new Index("name", "uuid"), update, ActionListener.noop()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java index 2b13cf1010be4..e3d4e5c5a642f 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java @@ -103,7 +103,8 @@ public void testMergeEnabledForRootMapper() { public void testMergeDisabledRootMapper() { String type = MapperService.SINGLE_MAPPING_NAME; final RootObjectMapper rootObjectMapper = (RootObjectMapper) new RootObjectMapper.Builder(type, ObjectMapper.Defaults.SUBOBJECTS) - .enabled(false).build(MapperBuilderContext.ROOT); + .enabled(false) + .build(MapperBuilderContext.ROOT); // the root is disabled, and we are not trying to re-enable it, but we do want to be able to add runtime fields final RootObjectMapper mergeWith = new RootObjectMapper.Builder(type, ObjectMapper.Defaults.SUBOBJECTS).addRuntimeFields( Collections.singletonMap("test", new TestRuntimeField("test", "long")) @@ -134,12 +135,14 @@ public void testMergeNested() { private static RootObjectMapper createRootObjectMapper(String name, boolean enabled, Map mappers) { return (RootObjectMapper) new RootObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(enabled) - .addMappers(mappers).build(MapperBuilderContext.ROOT); + .addMappers(mappers) + .build(MapperBuilderContext.ROOT); } private static ObjectMapper createObjectMapper(String name, boolean enabled, Map mappers) { return new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(enabled) - .addMappers(mappers).build(MapperBuilderContext.ROOT); + .addMappers(mappers) + .build(MapperBuilderContext.ROOT); } private TextFieldMapper createTextFieldMapper(String name) { diff --git a/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java b/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java index cf13258d636a7..1e8b47a6027a1 100644 --- a/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java +++ b/test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java @@ -515,8 +515,9 @@ public static IndicesService mockIndicesServices(MappingLookup mappingLookup) th when(indexService.index()).thenReturn(indexMetadata.getIndex()); MapperService mapperService = mock(MapperService.class); - RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, - ObjectMapper.Defaults.SUBOBJECTS).build(MapperBuilderContext.ROOT); + RootObjectMapper root = new RootObjectMapper.Builder(MapperService.SINGLE_MAPPING_NAME, ObjectMapper.Defaults.SUBOBJECTS).build( + MapperBuilderContext.ROOT + ); Mapping mapping = new Mapping(root, new MetadataFieldMapper[0], null); DocumentMapper documentMapper = mock(DocumentMapper.class); when(documentMapper.mapping()).thenReturn(mapping); From bf96b1c9f2f5b825cd3c5f799256cb82a8f5ac42 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 18 May 2022 23:44:39 +0200 Subject: [PATCH 06/13] add tests --- .../index/mapper/DynamicMappingIT.java | 28 +++++++++++++ .../index/mapper/DynamicMappingTests.java | 42 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java index e8c15bed70605..11d6fd88aa1f7 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java @@ -13,6 +13,7 @@ import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.cluster.ClusterState; @@ -494,4 +495,31 @@ public void testDynamicRuntimeObjectFields() { e.getMessage() ); } + + public void testSubobjectsFalse() { + assertAcked(client().admin().indices().prepareCreate("test").setMapping(""" + { + "_doc": { + "subobjects" : false, + "properties": { + "host.name": { + "type": "keyword" + } + } + } + }""").get()); + + IndexRequest request = new IndexRequest("test").source("host.name", "localhost", "host.id", 111, "time", 100, "time.max", 1000); + IndexResponse indexResponse = client().index(request).actionGet(); + assertEquals(RestStatus.CREATED, indexResponse.status()); + + Map mappings = client().admin().indices().prepareGetMappings("test").get().mappings().get("test").getSourceAsMap(); + @SuppressWarnings("unchecked") + Map properties = (Map) mappings.get("properties"); + assertEquals(4, properties.size()); + assertNotNull(properties.get("host.name")); + assertNotNull(properties.get("host.id")); + assertNotNull(properties.get("time")); + assertNotNull(properties.get("time.max")); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java index 4c37429d41dbd..bdd31b90096f1 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java @@ -902,4 +902,46 @@ public void testArraysOfObjectsDynamicFalse() throws IOException { } }"""), Strings.toString(doc.dynamicMappingsUpdate())); } + + public void testSubobjectsFalseRootDynamicUpdate() throws Exception { + MapperService mapperService = createMapperService(topMapping(b -> { + b.field("subobjects", false); + b.startObject("properties"); + b.startObject("host.name").field("type", "keyword").endObject(); + b.endObject(); + })); + ParsedDocument doc = mapperService.documentMapper().parse(source(""" + { + "time" : 10, + "time.max" : 500, + "time.min" : 1, + "host.name" : "localhost", + "host.id" : 111 + } + """)); + + Mapping mappingsUpdate = doc.dynamicMappingsUpdate(); + assertNotNull(mappingsUpdate); + assertNotNull(mappingsUpdate.getRoot().getMapper("time")); + assertNotNull(mappingsUpdate.getRoot().getMapper("time.max")); + assertNotNull(mappingsUpdate.getRoot().getMapper("time.min")); + assertNotNull(mappingsUpdate.getRoot().getMapper("host.id")); + assertNull(mappingsUpdate.getRoot().getMapper("host.name")); + + assertNotNull(doc.rootDoc().getFields("time")); + assertNotNull(doc.rootDoc().getFields("time.max")); + assertNotNull(doc.rootDoc().getFields("time.min")); + assertNotNull(doc.rootDoc().getFields("host.name")); + assertNotNull(doc.rootDoc().getFields("host.id")); + + merge(mapperService, dynamicMapping(mappingsUpdate)); + + assertNotNull(mapperService.fieldType("time")); + assertNotNull(mapperService.fieldType("time.max")); + assertNotNull(mapperService.fieldType("time.min")); + assertNotNull(mapperService.fieldType("host.id")); + assertNotNull(mapperService.fieldType("host.name")); + + assertEquals(0, mapperService.mappingLookup().objectMappers().size()); + } } From 59f8c4e307efe4ec21a4714590ccf3c25b76bcd2 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Thu, 19 May 2022 23:42:23 +0200 Subject: [PATCH 07/13] add tests --- .../index/mapper/DynamicMappingIT.java | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java index 11d6fd88aa1f7..f2396d8d151cf 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java @@ -496,7 +496,7 @@ public void testDynamicRuntimeObjectFields() { ); } - public void testSubobjectsFalse() { + public void testSubobjectsFalseAtRoot() { assertAcked(client().admin().indices().prepareCreate("test").setMapping(""" { "_doc": { @@ -522,4 +522,48 @@ public void testSubobjectsFalse() { assertNotNull(properties.get("time")); assertNotNull(properties.get("time.max")); } + + @SuppressWarnings("unchecked") + public void testSubobjectsFalse() { + assertAcked(client().admin().indices().prepareCreate("test").setMapping(""" + { + "_doc": { + "properties": { + "foo.metrics" : { + "subobjects" : false, + "properties" : { + "host.name": { + "type": "keyword" + } + } + } + } + } + }""").get()); + + IndexRequest request = new IndexRequest("test").source( + "foo.metrics.host.name", + "localhost", + "foo.metrics.host.id", + 111, + "foo.metrics.time", + 100, + "foo.metrics.time.max", + 1000 + ); + IndexResponse indexResponse = client().index(request).actionGet(); + assertEquals(RestStatus.CREATED, indexResponse.status()); + + Map mappings = client().admin().indices().prepareGetMappings("test").get().mappings().get("test").getSourceAsMap(); + Map properties = (Map) mappings.get("properties"); + Map foo = (Map) properties.get("foo"); + properties = (Map) foo.get("properties"); + Map metrics = (Map) properties.get("metrics"); + properties = (Map) metrics.get("properties"); + assertEquals(4, properties.size()); + assertNotNull(properties.get("host.name")); + assertNotNull(properties.get("host.id")); + assertNotNull(properties.get("time")); + assertNotNull(properties.get("time.max")); + } } From d72ac33d2cc60b364be24435f38fc36f18e4b66f Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 13:56:23 +0200 Subject: [PATCH 08/13] iter --- .../rest-api-spec/test/index/91_metrics_no_subobjects.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml index 7d7bfa240eb5a..508cab1fde512 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml @@ -49,6 +49,7 @@ --- "Root without subobjects": - skip: + features: allowed_warnings_regex version: " - 8.2.99" reason: added in 8.3.0 @@ -64,6 +65,8 @@ type: keyword - do: + allowed_warnings_regex: + - "index \\[test-1\\] matches multiple legacy templates \\[global, test\\], composable templates will only match a single template" index: index: test-1 id: 1 From 05fc1999804218a0fbf1f4c62513162cff503c10 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 14:10:06 +0200 Subject: [PATCH 09/13] fix compile --- .../datastreams/DataStreamGetWriteIndexTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamGetWriteIndexTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamGetWriteIndexTests.java index 953d6d8d809e0..2054ed378c35c 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamGetWriteIndexTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamGetWriteIndexTests.java @@ -40,6 +40,7 @@ import org.elasticsearch.index.mapper.Mapping; import org.elasticsearch.index.mapper.MappingLookup; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ObjectMapper; import org.elasticsearch.index.mapper.RootObjectMapper; import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; @@ -218,7 +219,7 @@ public void setup() throws Exception { false, Version.CURRENT ).build(MapperBuilderContext.ROOT); - RootObjectMapper.Builder root = new RootObjectMapper.Builder("_doc"); + RootObjectMapper.Builder root = new RootObjectMapper.Builder("_doc", ObjectMapper.Defaults.SUBOBJECTS); root.add( new DateFieldMapper.Builder( "@timestamp", From 5f088c28e224239a52588f23759cd830cfdf5091 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 14:12:49 +0200 Subject: [PATCH 10/13] spotless --- .../index/mapper/DynamicFieldsBuilder.java | 2 +- .../index/mapper/ObjectMapperMergeTests.java | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java index 3f83dc36567da..212b5ba8b307c 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java @@ -162,7 +162,7 @@ static Mapper createDynamicObjectMapper(DocumentParserContext context, String na return mapper != null ? mapper : new ObjectMapper.Builder(name, ObjectMapper.Defaults.SUBOBJECTS).enabled(ObjectMapper.Defaults.ENABLED) - .build(context.createMapperBuilderContext()); + .build(context.createMapperBuilderContext()); } /** diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java index fc7b205070747..8627cd4c16598 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java @@ -219,9 +219,9 @@ private static RootObjectMapper createRootSubobjectFalseLeafWithDots() { FieldMapper fieldMapper = new KeywordFieldMapper.Builder("host.name", Version.CURRENT).build(MapperBuilderContext.ROOT); assertEquals("host.name", fieldMapper.simpleName()); assertEquals("host.name", fieldMapper.name()); - return (RootObjectMapper) new RootObjectMapper.Builder("_doc", Explicit.EXPLICIT_FALSE) - .addMappers(Collections.singletonMap("host.name", fieldMapper)) - .build(MapperBuilderContext.ROOT); + return (RootObjectMapper) new RootObjectMapper.Builder("_doc", Explicit.EXPLICIT_FALSE).addMappers( + Collections.singletonMap("host.name", fieldMapper) + ).build(MapperBuilderContext.ROOT); } private static RootObjectMapper createRootObjectMapper(String name, boolean enabled, Map mappers) { @@ -242,11 +242,11 @@ private static ObjectMapper createObjectSubobjectsFalseLeafWithDots() { ); assertEquals("host.name", fieldMapper.simpleName()); assertEquals("foo.metrics.host.name", fieldMapper.name()); - ObjectMapper metrics = new ObjectMapper.Builder("metrics", Explicit.EXPLICIT_FALSE) - .addMappers(Collections.singletonMap("host.name", fieldMapper)) - .build(new MapperBuilderContext("foo")); - return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS) - .addMappers(Collections.singletonMap("metrics", metrics)).build(MapperBuilderContext.ROOT); + ObjectMapper metrics = new ObjectMapper.Builder("metrics", Explicit.EXPLICIT_FALSE).addMappers( + Collections.singletonMap("host.name", fieldMapper) + ).build(new MapperBuilderContext("foo")); + return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS).addMappers(Collections.singletonMap("metrics", metrics)) + .build(MapperBuilderContext.ROOT); } private ObjectMapper createObjectSubobjectsFalseLeafWithMultiField() { @@ -256,11 +256,11 @@ private ObjectMapper createObjectSubobjectsFalseLeafWithMultiField() { FieldMapper fieldMapper = textKeywordMultiField.multiFields.iterator().next(); assertEquals("keyword", fieldMapper.simpleName()); assertEquals("foo.metrics.host.name.keyword", fieldMapper.name()); - ObjectMapper metrics = new ObjectMapper.Builder("metrics", Explicit.EXPLICIT_FALSE) - .addMappers(Collections.singletonMap("host.name", textKeywordMultiField)) - .build(new MapperBuilderContext("foo")); - return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS) - .addMappers(Collections.singletonMap("metrics", metrics)).build(MapperBuilderContext.ROOT); + ObjectMapper metrics = new ObjectMapper.Builder("metrics", Explicit.EXPLICIT_FALSE).addMappers( + Collections.singletonMap("host.name", textKeywordMultiField) + ).build(new MapperBuilderContext("foo")); + return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS).addMappers(Collections.singletonMap("metrics", metrics)) + .build(MapperBuilderContext.ROOT); } private TextFieldMapper createTextFieldMapper(String name) { From 19d818d654183f8d3a52be9ea0a9635864e68261 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 15:57:13 +0200 Subject: [PATCH 11/13] test --- .../rest-api-spec/test/index/91_metrics_no_subobjects.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml index 508cab1fde512..4555adda67313 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/index/91_metrics_no_subobjects.yml @@ -80,8 +80,8 @@ fields: [host*, time*] - match: {fields.host\.name.keyword.searchable: true} - match: {fields.host\.name.keyword.aggregatable: true} - - match: {fields.host\.id.keyword.searchable: true} - - match: {fields.host\.id.keyword.aggregatable: true} + - match: {fields.host\.id.long.searchable: true} + - match: {fields.host\.id.long.aggregatable: true} - match: {fields.time.long.searchable: true} - match: {fields.time.long.aggregatable: true} - match: {fields.time\.max.long.searchable: true} From e2df3e4afc2132d4dc85ce519f86cebd42a366b5 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 16:53:58 +0200 Subject: [PATCH 12/13] fix test --- .../org/elasticsearch/index/mapper/DynamicMappingIT.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java index f2396d8d151cf..c00a32bc4dcbc 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java @@ -509,7 +509,8 @@ public void testSubobjectsFalseAtRoot() { } }""").get()); - IndexRequest request = new IndexRequest("test").source("host.name", "localhost", "host.id", 111, "time", 100, "time.max", 1000); + IndexRequest request = new IndexRequest("test").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) + .source("host.name", "localhost", "host.id", 111, "time", 100, "time.max", 1000); IndexResponse indexResponse = client().index(request).actionGet(); assertEquals(RestStatus.CREATED, indexResponse.status()); @@ -541,7 +542,7 @@ public void testSubobjectsFalse() { } }""").get()); - IndexRequest request = new IndexRequest("test").source( + IndexRequest request = new IndexRequest("test").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).source( "foo.metrics.host.name", "localhost", "foo.metrics.host.id", From dc673026fce0eb45f73257b41226ee92b670b58c Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 20 May 2022 17:13:05 +0200 Subject: [PATCH 13/13] spotless --- .../index/mapper/DynamicMappingIT.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java index c00a32bc4dcbc..b330f08f2e08e 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java @@ -542,16 +542,17 @@ public void testSubobjectsFalse() { } }""").get()); - IndexRequest request = new IndexRequest("test").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).source( - "foo.metrics.host.name", - "localhost", - "foo.metrics.host.id", - 111, - "foo.metrics.time", - 100, - "foo.metrics.time.max", - 1000 - ); + IndexRequest request = new IndexRequest("test").setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) + .source( + "foo.metrics.host.name", + "localhost", + "foo.metrics.host.id", + 111, + "foo.metrics.time", + 100, + "foo.metrics.time.max", + 1000 + ); IndexResponse indexResponse = client().index(request).actionGet(); assertEquals(RestStatus.CREATED, indexResponse.status());