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 0bc19461719ec..922beb25d8a2f 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -533,15 +533,19 @@ private static Map buildMergedMappers( MergeReason reason, MapperMergeContext objectMergeContext ) { - Map mergedMappers = null; - for (Mapper mergeWithMapper : mergeWith) { - Mapper mergeIntoMapper = (mergedMappers == null ? existing.mappers : mergedMappers).get(mergeWithMapper.simpleName()); + Iterator iterator = mergeWith.iterator(); + if (iterator.hasNext() == false) { + return Map.copyOf(existing.mappers); + } + Map mergedMappers = new HashMap<>(existing.mappers); + while (iterator.hasNext()) { + Mapper mergeWithMapper = iterator.next(); + Mapper mergeIntoMapper = mergedMappers.get(mergeWithMapper.simpleName()); - Mapper merged; if (mergeIntoMapper == null) { - merged = mergeWithMapper; + mergedMappers.put(mergeWithMapper.simpleName(), mergeWithMapper); } else if (mergeIntoMapper instanceof ObjectMapper objectMapper) { - merged = objectMapper.merge(mergeWithMapper, reason, objectMergeContext); + mergedMappers.put(objectMapper.simpleName(), objectMapper.merge(mergeWithMapper, reason, objectMergeContext)); } else { assert mergeIntoMapper instanceof FieldMapper || mergeIntoMapper instanceof FieldAliasMapper; if (mergeWithMapper instanceof NestedObjectMapper) { @@ -553,22 +557,13 @@ private static Map buildMergedMappers( // If we're merging template mappings when creating an index, then a field definition always // replaces an existing one. if (reason == MergeReason.INDEX_TEMPLATE) { - merged = mergeWithMapper; + mergedMappers.put(mergeWithMapper.simpleName(), mergeWithMapper); } else { - merged = mergeIntoMapper.merge(mergeWithMapper, objectMergeContext); + mergedMappers.put(mergeWithMapper.simpleName(), mergeIntoMapper.merge(mergeWithMapper, objectMergeContext)); } } - if (mergedMappers == null) { - mergedMappers = new HashMap<>(existing.mappers); - } - mergedMappers.put(merged.simpleName(), merged); - } - if (mergedMappers != null) { - mergedMappers = Map.copyOf(mergedMappers); - } else { - mergedMappers = Map.copyOf(existing.mappers); } - return mergedMappers; + return Map.copyOf(mergedMappers); } }