diff --git a/metafix/src/main/java/org/metafacture/metafix/FixPath.java b/metafix/src/main/java/org/metafacture/metafix/FixPath.java index 17c8c388..ebd92363 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixPath.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixPath.java @@ -68,6 +68,7 @@ private FixPath(final String[] path) { final Value result; if (path.length > 0) { final String currentSegment = path[0]; + final ReservedField reservedField = ReservedField.fromString(currentSegment); if (currentSegment.equals(ASTERISK)) { result = Value.newArray(resultArray -> array.forEach(v -> { final Value findInValue = findInValue(v, tail(path)); @@ -79,6 +80,19 @@ private FixPath(final String[] path) { } })); } + else if (reservedField != null) { + switch (reservedField) { + case $first: + result = findInValue(array.get(0), tail(path)); + break; + case $last: + result = findInValue(array.get(array.size() - 1), tail(path)); + break; + default: + result = null; + break; + } + } else if (Value.isNumber(currentSegment)) { final int index = Integer.parseInt(currentSegment) - 1; // TODO: 0-based Catmandu vs. 1-based Metafacture if (index >= 0 && index < array.size()) { @@ -165,7 +179,25 @@ void apply(final Hash hash, final String field, final Value value) { @Override void apply(final Array array, final String field, final Value value) { try { - array.set(Integer.valueOf(field) - 1, value); + final ReservedField reservedField = ReservedField.fromString(field); + if (reservedField != null) { + switch (reservedField) { + case $append: + array.add(value); + break; + case $first: + array.set(0, value); + break; + case $last: + array.set(array.size() - 1, value); + break; + default: + break; + } + } + else { + array.set(Integer.valueOf(field) - 1, value); + } } catch (final NumberFormatException e) { throw new IllegalStateException("Expected Hash, got Array", e); @@ -234,17 +266,11 @@ private void removeNestedFrom(final Value value) { if (path.length == 1) { if (field.equals(ASTERISK)) { for (int i = 0; i < array.size(); ++i) { - mode.apply(array, "" + (i + 1), newValue); + mode.apply(array, String.valueOf(i + 1), newValue); } } else { - // TODO unify ref usage from below - if ("$append".equals(field)) { - array.add(newValue); - } - else { - mode.apply(array, field, newValue); - } + mode.apply(array, field, newValue); } } else { diff --git a/metafix/src/test/java/org/metafacture/metafix/HashValueTest.java b/metafix/src/test/java/org/metafacture/metafix/HashValueTest.java index 579bfbe2..26cb26e4 100644 --- a/metafix/src/test/java/org/metafacture/metafix/HashValueTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/HashValueTest.java @@ -19,11 +19,9 @@ import nl.jqno.equalsverifier.EqualsVerifier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import java.util.Arrays; -@ExtendWith(MetafixToDo.Extension.class) public class HashValueTest { private static final String FIELD = "field"; @@ -394,7 +392,6 @@ public void shouldFindArrayIndex() { } @Test - @MetafixToDo("Expected String, got Array") public void shouldFindArrayWildcard() { shouldFindArray("$last"); } @@ -412,7 +409,6 @@ public void shouldFindArrayIndexSubfield() { } @Test - @MetafixToDo("Expected String, got Array") public void shouldFindArrayWildcardSubfield() { shouldFindArraySubfield("$last"); } diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java index af0b8933..eb781aca 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java @@ -2051,7 +2051,6 @@ public void shouldReplaceAllRegexesInArrayByIndex() { } @Test - @MetafixToDo("See https://github.com/metafacture/metafacture-fix/issues/135") public void shouldReplaceAllRegexesInArrayByArrayWildcard() { MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( "replace_all('names.$last', 'a', 'X')" @@ -2103,7 +2102,6 @@ public void shouldReplaceAllRegexesInArraySubFieldByIndex() { } @Test - @MetafixToDo("See https://github.com/metafacture/metafacture-fix/issues/135") public void shouldReplaceAllRegexesInArraySubFieldByArrayWildcard() { MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( "replace_all('names[].$last.name', 'a', 'X')" diff --git a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/prependArrayOfObjectsWithFirstArrayWildcard/todo.txt b/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/prependArrayOfObjectsWithFirstArrayWildcard/todo.txt deleted file mode 100644 index 12b99b76..00000000 --- a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/prependArrayOfObjectsWithFirstArrayWildcard/todo.txt +++ /dev/null @@ -1 +0,0 @@ -See issue #144 diff --git a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/replace_allInSubfieldOfArrayOfObjectsWithLastWildcard/todo.txt b/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/replace_allInSubfieldOfArrayOfObjectsWithLastWildcard/todo.txt deleted file mode 100644 index 12b99b76..00000000 --- a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/replace_allInSubfieldOfArrayOfObjectsWithLastWildcard/todo.txt +++ /dev/null @@ -1 +0,0 @@ -See issue #144