From 031340795ceb3457bee14954fff008ccd0b62f2f Mon Sep 17 00:00:00 2001 From: Mike Barry Date: Sat, 28 Sep 2024 16:41:30 -0400 Subject: [PATCH] fix merge order --- planetiler-core/pom.xml | 5 +++++ .../com/onthegomap/planetiler/util/YAML.java | 16 ++++++++++------ .../com/onthegomap/planetiler/util/YamlTest.java | 9 +++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/planetiler-core/pom.xml b/planetiler-core/pom.xml index eef160c5d5..0ff8b2ce2a 100644 --- a/planetiler-core/pom.xml +++ b/planetiler-core/pom.xml @@ -129,6 +129,11 @@ org.snakeyaml snakeyaml-engine + + org.yaml + snakeyaml + 2.3 + io.prometheus simpleclient diff --git a/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java b/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java index b051dc5138..0a504a0ef2 100644 --- a/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java +++ b/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java @@ -51,11 +51,11 @@ private static void handleMergeOperator(Object parsed) { if (parsed instanceof Map map) { Object toMerge = map.remove("<<"); if (toMerge != null) { - Map orig = new LinkedHashMap<>(map); + var orig = new LinkedHashMap<>(map); // to preserve the map key order we insert the merged operator objects first, then the original ones map.clear(); - mergeInto(map, toMerge); - mergeInto(map, orig); + mergeInto(map, toMerge, false); + mergeInto(map, orig, true); } for (var value : map.values()) { handleMergeOperator(value); @@ -68,12 +68,16 @@ private static void handleMergeOperator(Object parsed) { } @SuppressWarnings("rawtypes") - private static void mergeInto(Map dest, Object source) { + private static void mergeInto(Map dest, Object source, boolean replace) { if (source instanceof Map map) { - dest.putAll(map); + if (replace) { + dest.putAll(map); + } else { + map.forEach(dest::putIfAbsent); + } } else if (source instanceof List nesteds) { for (var nested : nesteds) { - mergeInto(dest, nested); + mergeInto(dest, nested, replace); } } } diff --git a/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java b/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java index 67561f262b..f28eb20b00 100644 --- a/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java +++ b/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java @@ -123,7 +123,7 @@ void testMergeOperatorMultiple() { a: 2 b: 3 dest: - a: 2 + a: 1 # from label1 since it came first b: 4 c: 5 z: 1 @@ -182,10 +182,11 @@ void testMergeOperatorFromDraft1() { - &BIG { r: 10 } - &SMALL { r: 1 } - # Merge one map - << : *CENTER - r: 10 - label: center/big + << : *CENTER + r: 10 + label: center/big """); + } @Test void testMergeOperatorFromDraft2() {