Skip to content

Commit 4d1ff20

Browse files
authored
[8.18] Merge template mappings properly during validation (elastic#124784) (elastic#124998)
* Merge template mappings properly during validation (elastic#124784) * Merge template mappings properly during validation * Update docs/changelog/124784.yaml (cherry picked from commit b861f10) * Update MetadataIndexTemplateServiceTests.java
1 parent b148242 commit 4d1ff20

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

docs/changelog/124784.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 124784
2+
summary: Merge template mappings properly during validation
3+
area: Mapping
4+
type: bug
5+
issues:
6+
- 123372

server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1858,7 +1858,7 @@ private static void validateTemplate(Settings validateSettings, CompressedXConte
18581858
createdIndex = dummyIndexService.index();
18591859

18601860
if (mappings != null) {
1861-
dummyIndexService.mapperService().merge(MapperService.SINGLE_MAPPING_NAME, mappings, MergeReason.MAPPING_UPDATE);
1861+
dummyIndexService.mapperService().merge(MapperService.SINGLE_MAPPING_NAME, mappings, MergeReason.INDEX_TEMPLATE);
18621862
}
18631863

18641864
} finally {

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,6 +2593,59 @@ public void testComposableTemplateWithSubobjectsFalse() throws Exception {
25932593
);
25942594
}
25952595

2596+
public void testComposableTemplateWithSubobjectsFalseObjectAndSubfield() throws Exception {
2597+
MetadataIndexTemplateService service = getMetadataIndexTemplateService();
2598+
ClusterState state = ClusterState.EMPTY_STATE;
2599+
2600+
ComponentTemplate subobjects = new ComponentTemplate(new Template(null, new CompressedXContent("""
2601+
{
2602+
"properties": {
2603+
"foo": {
2604+
"type": "object",
2605+
"subobjects": false
2606+
},
2607+
"foo.bar": {
2608+
"type": "keyword"
2609+
}
2610+
}
2611+
}
2612+
"""), null), null, null);
2613+
2614+
state = service.addComponentTemplate(state, true, "subobjects", subobjects);
2615+
ComposableIndexTemplate it = ComposableIndexTemplate.builder()
2616+
.indexPatterns(List.of("test-*"))
2617+
.template(new Template(null, null, null))
2618+
.componentTemplates(List.of("subobjects", "field_mapping"))
2619+
.priority(0L)
2620+
.version(1L)
2621+
.build();
2622+
state = service.addIndexTemplateV2(state, true, "composable-template", it);
2623+
2624+
List<CompressedXContent> mappings = MetadataIndexTemplateService.collectMappings(state, "composable-template", "test-index");
2625+
2626+
assertNotNull(mappings);
2627+
assertThat(mappings.size(), equalTo(1));
2628+
List<Map<String, Object>> parsedMappings = mappings.stream().map(m -> {
2629+
try {
2630+
return MapperService.parseMapping(NamedXContentRegistry.EMPTY, m);
2631+
} catch (Exception e) {
2632+
logger.error(e);
2633+
fail("failed to parse mappings: " + m.string());
2634+
return null;
2635+
}
2636+
}).toList();
2637+
2638+
assertThat(
2639+
parsedMappings.get(0),
2640+
equalTo(
2641+
Map.of(
2642+
"_doc",
2643+
Map.of("properties", Map.of("foo.bar", Map.of("type", "keyword"), "foo", Map.of("type", "object", "subobjects", false)))
2644+
)
2645+
)
2646+
);
2647+
}
2648+
25962649
public void testAddIndexTemplateWithDeprecatedComponentTemplate() throws Exception {
25972650
ClusterState state = ClusterState.EMPTY_STATE;
25982651
final MetadataIndexTemplateService service = getMetadataIndexTemplateService();

0 commit comments

Comments
 (0)