|
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