Skip to content

Commit 4d612cb

Browse files
committed
fix: blueId calculation, reversing
1 parent fc35e29 commit 4d612cb

8 files changed

Lines changed: 166 additions & 24 deletions

File tree

src/main/java/blue/language/utils/BlueIdCalculator.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,25 @@ public String calculate(Object object) {
4242
}
4343

4444
private String calculateMap(Map<String, Object> map) {
45-
if (map.containsKey(OBJECT_BLUE_ID))
45+
if (map.containsKey(OBJECT_BLUE_ID)) {
4646
return (String) map.get(OBJECT_BLUE_ID);
47+
}
4748

48-
Map<String, Object> hashes = map.entrySet().stream()
49-
.collect(Collectors.toMap(
50-
Map.Entry::getKey,
51-
entry -> {
52-
String key = entry.getKey();
53-
if (OBJECT_NAME.equals(key) || OBJECT_VALUE.equals(key) || OBJECT_DESCRIPTION.equals(key))
54-
return entry.getValue();
55-
return calculate(entry.getValue());
56-
}
57-
));
49+
Map<String, Object> hashes = new LinkedHashMap<>();
50+
for (Map.Entry<String, Object> entry : map.entrySet()) {
51+
String key = entry.getKey();
52+
Object value = entry.getValue();
53+
54+
if (OBJECT_NAME.equals(key) || OBJECT_VALUE.equals(key) || OBJECT_DESCRIPTION.equals(key)) {
55+
hashes.put(key, value);
56+
} else if (value instanceof Map) {
57+
hashes.put(key, calculateMap((Map<String, Object>) value));
58+
} else if (value instanceof List) {
59+
hashes.put(key, calculateList((List<Object>) value));
60+
} else {
61+
hashes.put(key, calculate(value));
62+
}
63+
}
5864
return hashProvider.apply(hashes);
5965
}
6066

src/main/java/blue/language/utils/MergeReverser.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class MergeReverser {
1313

1414
public Node reverse(Node mergedNode) {
1515
Node minimalNode = new Node();
16-
reverseNode(minimalNode, mergedNode, null);
16+
reverseNode(minimalNode, mergedNode, mergedNode.getType());
1717
return minimalNode;
1818
}
1919

@@ -65,12 +65,16 @@ private void reverseNode(Node minimal, Node merged, Node fromType) {
6565
if (merged.getProperties() != null) {
6666
Map<String, Node> minimalProperties = new HashMap<>();
6767
for (Map.Entry<String, Node> entry : merged.getProperties().entrySet()) {
68+
String key = entry.getKey();
69+
Node mergedProperty = entry.getValue();
70+
Node fromTypeProperty = null;
71+
if (fromType != null && fromType.getProperties() != null) {
72+
fromTypeProperty = fromType.getProperties().get(key);
73+
}
6874
Node minimalProperty = new Node();
69-
Node typeProperty = (merged.getType() != null && merged.getType().getProperties() != null) ?
70-
merged.getType().getProperties().get(entry.getKey()) : null;
71-
reverseNode(minimalProperty, entry.getValue(), typeProperty);
75+
reverseNode(minimalProperty, mergedProperty, fromTypeProperty);
7276
if (!Nodes.isEmptyNode(minimalProperty)) {
73-
minimalProperties.put(entry.getKey(), minimalProperty);
77+
minimalProperties.put(key, minimalProperty);
7478
}
7579
}
7680
if (!minimalProperties.isEmpty()) {
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
name: Infer Basic Types For Untyped Values
22
type:
33
blueId: Ct1SGRGw1i47qjzm1ruiUdSZofeV6WevPTGuieVvbRS4
4-
description: |
5-
This transformation infers type details for Text, Integer, Number and Boolean.
4+
description: This transformation infers type details for Text, Integer, Number and Boolean.
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
name: Replace Inline Types with BlueIds
22
type:
33
blueId: Ct1SGRGw1i47qjzm1ruiUdSZofeV6WevPTGuieVvbRS4
4-
description: |
5-
This transformation replaces
4+
description: This transformation replaces

src/test/java/blue/language/MergeReverserTest.java

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package blue.language;
22

3-
import blue.language.utils.MergeReverser;
43
import blue.language.model.Node;
54
import blue.language.provider.BasicNodeProvider;
5+
import blue.language.utils.BlueIdCalculator;
6+
import blue.language.utils.MergeReverser;
67
import blue.language.utils.Properties;
78
import org.junit.jupiter.api.Test;
89

10+
import java.util.Arrays;
11+
912
import static org.junit.jupiter.api.Assertions.*;
1013

1114
public class MergeReverserTest {
@@ -51,4 +54,132 @@ public void testBasic1() throws Exception {
5154
assertEquals(Properties.TEXT_TYPE_BLUE_ID, reversed.getAsText("/z/itemType/blueId"));
5255
}
5356

57+
@Test
58+
public void testNestedTypes() throws Exception {
59+
BasicNodeProvider nodeProvider = new BasicNodeProvider();
60+
61+
String a = "name: A\n" +
62+
"x: 5\n" +
63+
"y: 10";
64+
nodeProvider.addSingleDocs(a);
65+
66+
String b = "name: B\n" +
67+
"type:\n" +
68+
" blueId: " + nodeProvider.getBlueIdByName("A") + "\n" +
69+
"z: 15";
70+
nodeProvider.addSingleDocs(b);
71+
72+
String c = "name: C\n" +
73+
"type:\n" +
74+
" blueId: " + nodeProvider.getBlueIdByName("B") + "\n" +
75+
"w: 20";
76+
nodeProvider.addSingleDocs(c);
77+
78+
Node cNode = nodeProvider.getNodeByName("C");
79+
Blue blue = new Blue(nodeProvider);
80+
Node resolved = blue.resolve(cNode);
81+
82+
MergeReverser reverser = new MergeReverser();
83+
Node reversed = reverser.reverse(resolved);
84+
85+
assertEquals("C", reversed.getName());
86+
assertEquals(nodeProvider.getBlueIdByName("B"), reversed.getType().getBlueId());
87+
assertEquals(20, reversed.getAsInteger("/w/value"));
88+
assertFalse(reversed.getProperties().containsKey("x"));
89+
assertFalse(reversed.getProperties().containsKey("y"));
90+
assertFalse(reversed.getProperties().containsKey("z"));
91+
92+
assertEquals(BlueIdCalculator.calculateBlueId(cNode), BlueIdCalculator.calculateBlueId(reversed));
93+
}
94+
95+
@Test
96+
public void testComplexNestedProperties() throws Exception {
97+
BasicNodeProvider nodeProvider = new BasicNodeProvider();
98+
99+
String m = "name: M\n" +
100+
"a:\n" +
101+
" b:\n" +
102+
" c:\n" +
103+
" d1: 1";
104+
nodeProvider.addSingleDocs(m);
105+
106+
String n = "name: N\n" +
107+
"c:\n" +
108+
" d2: 1";
109+
nodeProvider.addSingleDocs(n);
110+
111+
String p = "name: P\n" +
112+
"type:\n" +
113+
" blueId: " + nodeProvider.getBlueIdByName("M") + "\n" +
114+
"a:\n" +
115+
" b:\n" +
116+
" type:\n" +
117+
" blueId: " + nodeProvider.getBlueIdByName("N") + "\n" +
118+
" c:\n" +
119+
" d3: 3";
120+
nodeProvider.addSingleDocs(p);
121+
122+
Node pNode = nodeProvider.getNodeByName("P");
123+
Blue blue = new Blue(nodeProvider);
124+
Node resolved = blue.resolve(pNode);
125+
assertEquals(1, resolved.getAsInteger("/a/b/c/d1/value"));
126+
assertEquals(1, resolved.getAsInteger("/a/b/c/d2/value"));
127+
assertEquals(3, resolved.getAsInteger("/a/b/c/d3/value"));
128+
129+
MergeReverser reverser = new MergeReverser();
130+
Node reversed = reverser.reverse(resolved);
131+
132+
assertEquals("P", reversed.getName());
133+
assertEquals(nodeProvider.getBlueIdByName("M"), reversed.getType().getBlueId());
134+
assertEquals(nodeProvider.getBlueIdByName("N"), reversed.getAsNode("/a/b/type").getBlueId());
135+
assertEquals(3, reversed.getAsInteger("/a/b/c/d3/value"));
136+
assertFalse(reversed.getProperties().containsKey("d1"));
137+
assertFalse(reversed.getAsNode("/a/b").getProperties().containsKey("d2"));
138+
}
139+
140+
@Test
141+
public void testInheritedListAndMap() throws Exception {
142+
BasicNodeProvider nodeProvider = new BasicNodeProvider();
143+
144+
String base = "name: Base\n" +
145+
"list:\n" +
146+
" - A\n" +
147+
" - B\n" +
148+
"map:\n" +
149+
" key1: value1\n" +
150+
" key2: value2";
151+
nodeProvider.addSingleDocs(base);
152+
153+
String derived = "name: Derived\n" +
154+
"type:\n" +
155+
" blueId: " + nodeProvider.getBlueIdByName("Base") + "\n" +
156+
"list:\n" +
157+
" - A\n" +
158+
" - B\n" +
159+
" - C\n" +
160+
"map:\n" +
161+
" key3: value3";
162+
nodeProvider.addSingleDocs(derived);
163+
164+
Node derivedNode = nodeProvider.getNodeByName("Derived");
165+
Blue blue = new Blue(nodeProvider);
166+
Node resolved = blue.resolve(derivedNode);
167+
168+
MergeReverser reverser = new MergeReverser();
169+
Node reversed = reverser.reverse(resolved);
170+
171+
assertEquals("Derived", reversed.getName());
172+
assertEquals(nodeProvider.getBlueIdByName("Base"), reversed.getType().getBlueId());
173+
assertEquals(2, reversed.getAsNode("/list").getItems().size());
174+
assertEquals(BlueIdCalculator.calculateBlueId(
175+
Arrays.asList(
176+
blue.yamlToNode("value: A\ntype: Text"),
177+
blue.yamlToNode("value: B\ntype: Text")
178+
)
179+
), reversed.getAsNode("/list").getItems().get(0).getBlueId());
180+
assertEquals("C", reversed.getAsNode("/list").getItems().get(1).getValue());
181+
assertEquals(1, reversed.getAsNode("/map").getProperties().size());
182+
assertEquals("value3", reversed.getAsText("/map/key3/value"));
183+
}
184+
54185
}

src/test/java/blue/language/PreprocessorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import blue.language.preprocess.TransformationProcessor;
66
import blue.language.preprocess.TransformationProcessorProvider;
77
import blue.language.provider.BootstrapProvider;
8+
import blue.language.utils.BlueIdCalculator;
89
import blue.language.utils.NodeTransformer;
910
import blue.language.utils.Properties;
1011
import org.junit.jupiter.api.Test;

src/test/java/blue/language/samples/ipfs/PrintAllBlueIdsAndCanonicalJsons.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package blue.language.samples.ipfs;
22

33
import blue.language.model.Node;
4+
import blue.language.utils.BlueIdCalculator;
45
import org.erdtman.jcs.JsonCanonicalizer;
56

67
import java.io.IOException;
8+
import java.util.Collections;
79
import java.util.HashMap;
810
import java.util.Map;
911
import java.util.stream.Collectors;
@@ -22,7 +24,7 @@ public static void print(Map<String, Object> map) throws IOException {
2224
if (value instanceof Map) {
2325
print((Map) value);
2426
Node node = JSON_MAPPER.convertValue(value, Node.class);
25-
flat.put(key, calculateBlueId(node));
27+
flat.put(key, Collections.singletonMap("blueId", calculateBlueId(node)));
2628
} else {
2729
flat.put(key, value);
2830
}

src/test/java/blue/language/utils/BlueIdCalculatorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ public void testObject() {
4646
Map<String, Object> map3 = YAML_MAPPER.readValue(yaml3, Map.class);
4747
String result3 = new BlueIdCalculator(fakeHashValueProvider()).calculate(map3);
4848

49-
String yaml4 = "blueId: hash({pqr=hash({value=1}), abc=hash({def=hash({value=1}), ghi=hash({jkl=hash({value=2}), mno=hash({value=x})})})})";
49+
String yaml4 = "blueId: hash({abc=hash({def=hash({value=1}), ghi=hash({jkl=hash({value=2}), mno=hash({value=x})})}), pqr=hash({value=1})})";
5050
Map<String, Object> map4 = YAML_MAPPER.readValue(yaml4, Map.class);
5151
String result4 = new BlueIdCalculator(fakeHashValueProvider()).calculate(map4);
5252

53-
String expectedResult = "hash({pqr=hash({value=1}), abc=hash({def=hash({value=1}), ghi=hash({jkl=hash({value=2}), mno=hash({value=x})})})})";
53+
String expectedResult = "hash({abc=hash({def=hash({value=1}), ghi=hash({jkl=hash({value=2}), mno=hash({value=x})})}), pqr=hash({value=1})})";
5454
assertEquals(expectedResult, result1);
5555
assertEquals(expectedResult, result2);
5656
assertEquals(expectedResult, result3);

0 commit comments

Comments
 (0)