Skip to content

Commit d433295

Browse files
committed
Invoke set_* functions when adding to an array at the _current_ level. (#704)
The current "element" designated by `$append`/`$prepend` is not considered "intermediate structure".
1 parent 550be33 commit d433295

File tree

2 files changed

+217
-3
lines changed

2 files changed

+217
-3
lines changed

metafix/src/main/java/org/metafacture/metafix/api/FixFunction.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,8 @@ default Stream<Value> flatten(final Stream<Value> stream) {
204204
* @return true if the given field's parent field exists in the record
205205
*/
206206
default boolean parentFieldExists(final Record record, final String field) {
207-
final FixPath path = new FixPath(field);
208-
final FixPath parentPath = path.getParentPath();
209-
return parentPath == null || !path.isAddingToArray() && record.containsPath(parentPath.toString());
207+
final FixPath parentPath = new FixPath(field).getParentPath();
208+
return parentPath == null || !parentPath.isAddingToArray() && record.containsPath(parentPath.toString());
210209
}
211210

212211
}

metafix/src/test/java/org/metafacture/metafix/MetafixRecordTest.java

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,6 +1981,29 @@ public void setHashReplaceExisting() {
19811981

19821982
@Test
19831983
public void addArrayAppend() {
1984+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1985+
"add_array('array[].$append')"
1986+
),
1987+
i -> {
1988+
i.startRecord("1");
1989+
i.startEntity("array[]");
1990+
i.literal("1", "foo");
1991+
i.endEntity();
1992+
i.endRecord();
1993+
},
1994+
(o, f) -> {
1995+
o.get().startRecord("1");
1996+
o.get().startEntity("array[]");
1997+
o.get().literal("1", "foo");
1998+
o.get().startEntity("2[]");
1999+
f.apply(2).endEntity();
2000+
o.get().endRecord();
2001+
}
2002+
);
2003+
}
2004+
2005+
@Test
2006+
public void addArrayAppendNested() {
19842007
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
19852008
"add_array('array[].$append.test[]')"
19862009
),
@@ -2005,6 +2028,29 @@ public void addArrayAppend() {
20052028

20062029
@Test
20072030
public void setArrayAppend() {
2031+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2032+
"set_array('array[].$append')"
2033+
),
2034+
i -> {
2035+
i.startRecord("1");
2036+
i.startEntity("array[]");
2037+
i.literal("1", "foo");
2038+
i.endEntity();
2039+
i.endRecord();
2040+
},
2041+
(o, f) -> {
2042+
o.get().startRecord("1");
2043+
o.get().startEntity("array[]");
2044+
o.get().literal("1", "foo");
2045+
o.get().startEntity("2[]");
2046+
f.apply(2).endEntity();
2047+
o.get().endRecord();
2048+
}
2049+
);
2050+
}
2051+
2052+
@Test
2053+
public void setArrayAppendNested() {
20082054
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
20092055
"set_array('array[].$append.test[]')"
20102056
),
@@ -2047,6 +2093,30 @@ public void setArrayLast() {
20472093
);
20482094
}
20492095

2096+
@Test
2097+
public void setArrayLastNested() {
2098+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2099+
"set_array('array[].$last.test[]')"
2100+
),
2101+
i -> {
2102+
i.startRecord("1");
2103+
i.startEntity("array[]");
2104+
i.startEntity("1");
2105+
i.endEntity();
2106+
i.endEntity();
2107+
i.endRecord();
2108+
},
2109+
(o, f) -> {
2110+
o.get().startRecord("1");
2111+
o.get().startEntity("array[]");
2112+
o.get().startEntity("1");
2113+
o.get().startEntity("test[]");
2114+
f.apply(3).endEntity();
2115+
o.get().endRecord();
2116+
}
2117+
);
2118+
}
2119+
20502120
@Test
20512121
public void addFieldAppend() {
20522122
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
@@ -2070,6 +2140,30 @@ public void addFieldAppend() {
20702140
);
20712141
}
20722142

2143+
@Test
2144+
public void addFieldAppendNested() {
2145+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2146+
"add_field('array[].$append.test', 'bar')"
2147+
),
2148+
i -> {
2149+
i.startRecord("1");
2150+
i.startEntity("array[]");
2151+
i.literal("1", "foo");
2152+
i.endEntity();
2153+
i.endRecord();
2154+
},
2155+
(o, f) -> {
2156+
o.get().startRecord("1");
2157+
o.get().startEntity("array[]");
2158+
o.get().literal("1", "foo");
2159+
o.get().startEntity("2");
2160+
o.get().literal("test", "bar");
2161+
f.apply(2).endEntity();
2162+
o.get().endRecord();
2163+
}
2164+
);
2165+
}
2166+
20732167
@Test
20742168
public void setFieldAppend() {
20752169
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
@@ -2082,6 +2176,29 @@ public void setFieldAppend() {
20822176
i.endEntity();
20832177
i.endRecord();
20842178
},
2179+
o -> {
2180+
o.get().startRecord("1");
2181+
o.get().startEntity("array[]");
2182+
o.get().literal("1", "foo");
2183+
o.get().literal("2", "test");
2184+
o.get().endEntity();
2185+
o.get().endRecord();
2186+
}
2187+
);
2188+
}
2189+
2190+
@Test
2191+
public void setFieldAppendNested() {
2192+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2193+
"set_field('array[].$append.test', 'bar')"
2194+
),
2195+
i -> {
2196+
i.startRecord("1");
2197+
i.startEntity("array[]");
2198+
i.literal("1", "foo");
2199+
i.endEntity();
2200+
i.endRecord();
2201+
},
20852202
o -> {
20862203
o.get().startRecord("1");
20872204
o.get().startEntity("array[]");
@@ -2114,8 +2231,57 @@ public void setFieldLast() {
21142231
);
21152232
}
21162233

2234+
@Test
2235+
public void setFieldLastNested() {
2236+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2237+
"set_field('array[].$last.test', 'baz')"
2238+
),
2239+
i -> {
2240+
i.startRecord("1");
2241+
i.startEntity("array[]");
2242+
i.startEntity("1");
2243+
i.literal("foo", "bar");
2244+
i.endEntity();
2245+
i.endEntity();
2246+
i.endRecord();
2247+
},
2248+
(o, f) -> {
2249+
o.get().startRecord("1");
2250+
o.get().startEntity("array[]");
2251+
o.get().startEntity("1");
2252+
o.get().literal("foo", "bar");
2253+
o.get().literal("test", "baz");
2254+
f.apply(2).endEntity();
2255+
o.get().endRecord();
2256+
}
2257+
);
2258+
}
2259+
21172260
@Test
21182261
public void addHashAppend() {
2262+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2263+
"add_hash('array[].$append')"
2264+
),
2265+
i -> {
2266+
i.startRecord("1");
2267+
i.startEntity("array[]");
2268+
i.literal("1", "foo");
2269+
i.endEntity();
2270+
i.endRecord();
2271+
},
2272+
(o, f) -> {
2273+
o.get().startRecord("1");
2274+
o.get().startEntity("array[]");
2275+
o.get().literal("1", "foo");
2276+
o.get().startEntity("2");
2277+
f.apply(2).endEntity();
2278+
o.get().endRecord();
2279+
}
2280+
);
2281+
}
2282+
2283+
@Test
2284+
public void addHashAppendNested() {
21192285
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
21202286
"add_hash('array[].$append.test')"
21212287
),
@@ -2140,6 +2306,29 @@ public void addHashAppend() {
21402306

21412307
@Test
21422308
public void setHashAppend() {
2309+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2310+
"set_hash('array[].$append')"
2311+
),
2312+
i -> {
2313+
i.startRecord("1");
2314+
i.startEntity("array[]");
2315+
i.literal("1", "foo");
2316+
i.endEntity();
2317+
i.endRecord();
2318+
},
2319+
(o, f) -> {
2320+
o.get().startRecord("1");
2321+
o.get().startEntity("array[]");
2322+
o.get().literal("1", "foo");
2323+
o.get().startEntity("2");
2324+
f.apply(2).endEntity();
2325+
o.get().endRecord();
2326+
}
2327+
);
2328+
}
2329+
2330+
@Test
2331+
public void setHashAppendNested() {
21432332
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
21442333
"set_hash('array[].$append.test')"
21452334
),
@@ -2182,6 +2371,32 @@ public void setHashLast() {
21822371
);
21832372
}
21842373

2374+
@Test
2375+
public void setHashLastNested() {
2376+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
2377+
"set_hash('array[].$last.test')"
2378+
),
2379+
i -> {
2380+
i.startRecord("1");
2381+
i.startEntity("array[]");
2382+
i.startEntity("1");
2383+
i.literal("foo", "bar");
2384+
i.endEntity();
2385+
i.endEntity();
2386+
i.endRecord();
2387+
},
2388+
(o, f) -> {
2389+
o.get().startRecord("1");
2390+
o.get().startEntity("array[]");
2391+
o.get().startEntity("1");
2392+
o.get().literal("foo", "bar");
2393+
o.get().startEntity("test");
2394+
f.apply(3).endEntity();
2395+
o.get().endRecord();
2396+
}
2397+
);
2398+
}
2399+
21852400
@Test
21862401
public void paste() {
21872402
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(

0 commit comments

Comments
 (0)