Skip to content

Commit fffb6d9

Browse files
committed
Support $prepend for inserting & array creation (#92, #93, #127)
1 parent d0cc26e commit fffb6d9

File tree

9 files changed

+88
-8
lines changed

9 files changed

+88
-8
lines changed

metafix/src/main/java/org/metafacture/metafix/FixPath.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ void apply(final Array array, final String field, final Value value) {
170170
final ReservedField reservedField = ReservedField.fromString(field);
171171
if (reservedField != null) {
172172
switch (reservedField) {
173+
case $prepend:
174+
array.add(0, value);
175+
break;
173176
case $append:
174177
array.add(value);
175178
break;
@@ -276,7 +279,7 @@ else if (isReference(field)) {
276279
}
277280
else {
278281
if (!hash.containsField(field)) {
279-
if (ReservedField.$append.name().equals(tail(path)[0])) {
282+
if (ReservedField.$prepend.name().equals(tail(path)[0]) || ReservedField.$append.name().equals(tail(path)[0])) {
280283
hash.put(field, Value.newArray().withPathSet(newValue.getPath()));
281284
}
282285
else {
@@ -312,7 +315,7 @@ private String[] tail(final String[] fields) {
312315
}
313316

314317
private enum ReservedField {
315-
$append, $first, $last;
318+
$prepend, $append, $first, $last;
316319

317320
private static final Map<String, ReservedField> STRING_TO_ENUM = new HashMap<>();
318321
static {
@@ -352,6 +355,10 @@ private Value getReferencedValue(final Array array, final String field, final St
352355
referencedValue = Value.newHash().withPathSet(p); // TODO: append non-hash?
353356
array.add(referencedValue);
354357
break;
358+
case $prepend:
359+
referencedValue = Value.newHash().withPathSet(p);
360+
array.add(0, referencedValue);
361+
break;
355362
default:
356363
break;
357364
}

metafix/src/main/java/org/metafacture/metafix/Value.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,12 @@ public void add(final Value value) {
438438
}
439439
}
440440

441+
/* package-private */ void add(final int index, final Value value) {
442+
if (!isNull(value)) {
443+
list.add(index, value);
444+
}
445+
}
446+
441447
public boolean isEmpty() {
442448
return list.isEmpty();
443449
}

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,51 @@ public void addWithAppendInImplicitArray() {
348348
);
349349
}
350350

351+
@Test
352+
public void addWithPrependInImplicitArray() {
353+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
354+
"add_field('my.name.$prepend','patrick')",
355+
"add_field('my.name.$prepend','nicolas')"
356+
),
357+
i -> {
358+
i.startRecord("1");
359+
i.endRecord();
360+
361+
i.startRecord("2");
362+
i.startEntity("my");
363+
i.literal("name", "max");
364+
i.endEntity();
365+
i.endRecord();
366+
367+
i.startRecord("3");
368+
i.endRecord();
369+
},
370+
o -> {
371+
o.get().startRecord("1");
372+
o.get().startEntity("my");
373+
o.get().literal("name", "nicolas");
374+
o.get().literal("name", "patrick");
375+
o.get().endEntity();
376+
o.get().endRecord();
377+
378+
o.get().startRecord("2");
379+
o.get().startEntity("my");
380+
o.get().literal("name", "nicolas");
381+
o.get().literal("name", "patrick");
382+
o.get().literal("name", "max");
383+
o.get().endEntity();
384+
o.get().endRecord();
385+
386+
o.get().startRecord("3");
387+
o.get().startEntity("my");
388+
o.get().literal("name", "nicolas");
389+
o.get().literal("name", "patrick");
390+
o.get().endEntity();
391+
o.get().endRecord();
392+
}
393+
);
394+
}
395+
351396
@Test
352397
public void addWithAppendInArray() {
353398
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
@@ -1488,6 +1533,33 @@ public void copyIntoArrayOfHashesImplicitAppend() {
14881533
});
14891534
}
14901535

1536+
@Test
1537+
public void copyIntoArrayOfHashesImplicitPrepend() {
1538+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1539+
"copy_field('your.name','author[].$prepend.name')",
1540+
"remove_field('your')"),
1541+
i -> {
1542+
i.startRecord("1");
1543+
i.startEntity("your");
1544+
i.literal("name", "max");
1545+
i.endEntity();
1546+
i.startEntity("your");
1547+
i.literal("name", "mo");
1548+
i.endEntity();
1549+
i.endRecord();
1550+
}, (o, f) -> {
1551+
o.get().startRecord("1");
1552+
o.get().startEntity("author[]");
1553+
o.get().startEntity("1");
1554+
o.get().literal("name", "mo");
1555+
o.get().endEntity();
1556+
o.get().startEntity("2");
1557+
o.get().literal("name", "max");
1558+
f.apply(2).endEntity();
1559+
o.get().endRecord();
1560+
});
1561+
}
1562+
14911563
@Test
14921564
public void copyIntoArrayOfHashesExplicitAppend() {
14931565
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(

metafix/src/test/resources/org/metafacture/metafix/integration/record/fromJson/toJson/add_fieldPrependAndCreateArray/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

metafix/src/test/resources/org/metafacture/metafix/integration/record/fromJson/toJson/copy_fieldPrependAndCreateArray/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

metafix/src/test/resources/org/metafacture/metafix/integration/record/fromJson/toJson/copy_fieldPrependObjectToArrayOfObjects/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

metafix/src/test/resources/org/metafacture/metafix/integration/record/fromJson/toJson/move_fieldPrependAndCreateArray/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
copy_field("test_2", "test[].$prepend")
1+
move_field("test_2", "test[].$prepend")

metafix/src/test/resources/org/metafacture/metafix/integration/record/fromJson/toJson/move_fieldPrependObjectToArrayOfObjects/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)