From 5cc686d81e8bc398d35dd4bd07364e089a1e6271 Mon Sep 17 00:00:00 2001 From: Jens Wille Date: Wed, 8 Nov 2023 11:03:49 +0100 Subject: [PATCH] Add support for nested `$first`/`$last` in `retain()` Fix function. (#329) --- .../java/org/metafacture/metafix/Value.java | 13 ++++- .../metafix/MetafixRecordTest.java | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/metafix/src/main/java/org/metafacture/metafix/Value.java b/metafix/src/main/java/org/metafacture/metafix/Value.java index b6175e34..8aeae637 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Value.java +++ b/metafix/src/main/java/org/metafacture/metafix/Value.java @@ -484,7 +484,18 @@ private Set findFields(final String pattern) { indexes().forEach(fieldSet::add); } else { - final int index = Integer.parseInt(pattern) - 1; // TODO: 0-based Catmandu vs. 1-based Metafacture + final int index; + + switch (pattern) { + case "$first": + index = 0; + break; + case "$last": + index = size() - 1; + break; + default: + index = Integer.parseInt(pattern) - 1; // TODO: 0-based Catmandu vs. 1-based Metafacture + } if (index >= 0 && index < size()) { fieldSet.add(index); diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixRecordTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixRecordTest.java index 88c5bab1..67e6ea77 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixRecordTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixRecordTest.java @@ -2418,6 +2418,58 @@ public void retainNested() { ); } + @Test + public void retainNestedReservedFields() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "retain('b[].$first.b','c[].$last')" + ), + i -> { + i.startRecord("1"); + i.startEntity("b[]"); + i.startEntity("1"); + i.literal("a", "1"); + i.literal("b", "2"); + i.endEntity(); + i.startEntity("2"); + i.literal("a", "1"); + i.literal("b", "2"); + i.literal("c", "3"); + i.endEntity(); + i.startEntity("3"); + i.literal("c", "4"); + i.endEntity(); + i.endEntity(); + i.startEntity("c[]"); + i.startEntity("1"); + i.literal("a", "1"); + i.literal("b", "2"); + i.endEntity(); + i.startEntity("2"); + i.literal("a", "1"); + i.literal("b", "2"); + i.literal("c", "3"); + i.endEntity(); + i.startEntity("3"); + i.literal("c", "4"); + i.endEntity(); + i.endEntity(); + i.endRecord(); + }, + (o, f) -> { + o.get().startRecord("1"); + o.get().startEntity("b[]"); + o.get().startEntity("1"); + o.get().literal("b", "2"); + f.apply(2).endEntity(); + o.get().startEntity("c[]"); + o.get().startEntity("1"); + o.get().literal("c", "4"); + f.apply(2).endEntity(); + o.get().endRecord(); + } + ); + } + @Test public void shouldDeleteEmptyArrays() { MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(