All Downloads are FREE. Search and download functionalities are using the official Maven repository.

apoc.map.MapsExtended Maven / Gradle / Ivy

package apoc.map;

import apoc.Extended;
import apoc.util.Util;
import org.neo4j.procedure.Description;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.UserFunction;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Extended
public class MapsExtended {

    @UserFunction("apoc.map.renameKey")
    @Description("Rename the given key(s) in the `MAP`.")
    public Map renameKeyRecursively(@Name("map") Map map,
                                                    @Name("keyFrom") String keyFrom,
                                                    @Name("keyTo") String keyTo,
                                                    @Name(value = "config", defaultValue = "{}") Map config) {
        boolean recursive = Util.toBoolean(config.getOrDefault("recursive", true));
        if (recursive) {
            return (Map) renameKeyRecursively(map, keyFrom, keyTo);
        }
        if (map.containsKey(keyFrom)) {
            Object value = map.remove(keyFrom);
            map.put(keyTo, value);
        }
        return map;
    }

    private Object renameKeyRecursively(Object object, String keyFrom, String keyTo) {
        if (object instanceof Map) {
            return ((Map) object).entrySet()
                    .stream()
                    .collect(Collectors.toMap(
                            e -> {
                                String key = e.getKey();
                                return key.equals(keyFrom) ? keyTo : key;
                            },
                            e -> renameKeyRecursively(e.getValue(), keyFrom, keyTo))
                    );
        }
        if (object instanceof List subList) {
            return subList.stream()
                    .map(v -> renameKeyRecursively(v, keyFrom, keyTo))
                    .toList();
        }
        return object;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy