|
15 | 15 | import org.opensearch.script.Script; |
16 | 16 |
|
17 | 17 | import java.io.IOException; |
| 18 | +import java.util.ArrayList; |
| 19 | +import java.util.Arrays; |
18 | 20 | import java.util.HashMap; |
19 | 21 | import java.util.HashSet; |
20 | 22 | import java.util.List; |
@@ -189,9 +191,10 @@ private void initDerivedFieldTypes(Map<String, Object> derivedFieldsObject, List |
189 | 191 |
|
190 | 192 | private Map<String, DerivedFieldType> getAllDerivedFieldTypeFromObject(Map<String, Object> derivedFieldObject) { |
191 | 193 | Map<String, DerivedFieldType> derivedFieldTypes = new HashMap<>(); |
| 194 | + // deep copy of derivedFieldObject is required as DocumentMapperParser modifies the map |
192 | 195 | DocumentMapper documentMapper = queryShardContext.getMapperService() |
193 | 196 | .documentMapperParser() |
194 | | - .parse(DerivedFieldMapper.CONTENT_TYPE, derivedFieldObject); |
| 197 | + .parse(DerivedFieldMapper.CONTENT_TYPE, (Map) deepCopy(derivedFieldObject)); |
195 | 198 | if (documentMapper != null && documentMapper.mappers() != null) { |
196 | 199 | for (Mapper mapper : documentMapper.mappers()) { |
197 | 200 | if (mapper instanceof DerivedFieldMapper) { |
@@ -226,4 +229,27 @@ private DerivedFieldType resolveUsingMappings(String name) { |
226 | 229 | } |
227 | 230 | return null; |
228 | 231 | } |
| 232 | + |
| 233 | + private static Object deepCopy(Object value) { |
| 234 | + if (value instanceof Map) { |
| 235 | + Map<?, ?> mapValue = (Map<?, ?>) value; |
| 236 | + Map<Object, Object> copy = new HashMap<>(mapValue.size()); |
| 237 | + for (Map.Entry<?, ?> entry : mapValue.entrySet()) { |
| 238 | + copy.put(entry.getKey(), deepCopy(entry.getValue())); |
| 239 | + } |
| 240 | + return copy; |
| 241 | + } else if (value instanceof List) { |
| 242 | + List<?> listValue = (List<?>) value; |
| 243 | + List<Object> copy = new ArrayList<>(listValue.size()); |
| 244 | + for (Object itemValue : listValue) { |
| 245 | + copy.add(deepCopy(itemValue)); |
| 246 | + } |
| 247 | + return copy; |
| 248 | + } else if (value instanceof byte[]) { |
| 249 | + byte[] bytes = (byte[]) value; |
| 250 | + return Arrays.copyOf(bytes, bytes.length); |
| 251 | + } else { |
| 252 | + return value; |
| 253 | + } |
| 254 | + } |
229 | 255 | } |
0 commit comments