@@ -148,29 +148,58 @@ public PassThroughObjectMapper.Builder newBuilder(IndexVersion indexVersionCreat
148148
149149 @ Override
150150 public PassThroughObjectMapper merge (Mapper mergeWith , MapperMergeContext parentBuilderContext ) {
151- if (mergeWith instanceof PassThroughObjectMapper == false ) {
151+ if (mergeWith instanceof ObjectMapper == false ) {
152152 MapperErrors .throwObjectMappingConflictError (mergeWith .fullPath ());
153153 }
154+ ObjectMapper mergeWithObjectMapper = (ObjectMapper ) mergeWith ;
155+ if (mergeWithObjectMapper instanceof PassThroughObjectMapper mergeWithPassThrough ) {
156+ final var mergeResult = MergeResult .build (this , mergeWithPassThrough , parentBuilderContext );
157+ final Explicit <Boolean > containsDimensions = (mergeWithPassThrough .timeSeriesDimensionSubFields .explicit ())
158+ ? mergeWithPassThrough .timeSeriesDimensionSubFields
159+ : this .timeSeriesDimensionSubFields ;
154160
155- PassThroughObjectMapper mergeWithObject = (PassThroughObjectMapper ) mergeWith ;
156- final var mergeResult = MergeResult .build (this , mergeWithObject , parentBuilderContext );
157-
158- final Explicit <Boolean > containsDimensions = (mergeWithObject .timeSeriesDimensionSubFields .explicit ())
159- ? mergeWithObject .timeSeriesDimensionSubFields
160- : this .timeSeriesDimensionSubFields ;
161-
161+ return new PassThroughObjectMapper (
162+ leafName (),
163+ fullPath (),
164+ mergeResult .enabled (),
165+ mergeResult .sourceKeepMode (),
166+ mergeResult .dynamic (),
167+ mergeResult .mappers (),
168+ containsDimensions ,
169+ Math .max (priority , mergeWithPassThrough .priority )
170+ );
171+ }
172+ if (mergeWithObjectMapper instanceof NestedObjectMapper nestedObjectMapper ) {
173+ MapperErrors .throwNestedMappingConflictError (fullPath ());
174+ }
175+ if (isEligibleForMerge (mergeWithObjectMapper ) == false ) {
176+ MapperErrors .throPassThroughMappingConflictError (fullPath ());
177+ }
178+ MergeResult mergeResult = MergeResult .build (this , mergeWithObjectMapper , parentBuilderContext );
162179 return new PassThroughObjectMapper (
163180 leafName (),
164181 fullPath (),
165182 mergeResult .enabled (),
166183 mergeResult .sourceKeepMode (),
167184 mergeResult .dynamic (),
168185 mergeResult .mappers (),
169- containsDimensions ,
170- Math . max ( priority , mergeWithObject . priority )
186+ timeSeriesDimensionSubFields ,
187+ priority
171188 );
172189 }
173190
191+ /**
192+ * An object mapper is compatible to be merged with a passthrough mapper if
193+ * - It is not a root mapper
194+ * - If it does not have subobjects true
195+ */
196+ private boolean isEligibleForMerge (ObjectMapper objectMapper ) {
197+ return objectMapper .isRoot () == false
198+ && (objectMapper .subobjects == null
199+ || objectMapper .subobjects .explicit () == false
200+ || objectMapper .subobjects .value ().equals (Subobjects .DISABLED ));
201+ }
202+
174203 @ Override
175204 public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
176205 builder .startObject (leafName ());
0 commit comments