diff --git a/metafix/src/main/java/org/metafacture/metafix/FixConditional.java b/metafix/src/main/java/org/metafacture/metafix/FixConditional.java index b41165b84..176a91410 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixConditional.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixConditional.java @@ -182,6 +182,19 @@ public boolean test(final Metafix metafix, final Record record, final List params, final Map options) { return testConditional(params, MATCHES); } + }, + + greater_than { + @Override + public boolean test(final Metafix metafix, final Record record, final List params, final Map options) { + return testConditional(record, params, ALL, GREATER_THAN); + } + }, + less_than { + @Override + public boolean test(final Metafix metafix, final Record record, final List params, final Map options) { + return testConditional(record, params, ALL, LESS_THAN); + } } } diff --git a/metafix/src/main/java/org/metafacture/metafix/api/FixPredicate.java b/metafix/src/main/java/org/metafacture/metafix/api/FixPredicate.java index 201ee920f..dd0e61fc2 100644 --- a/metafix/src/main/java/org/metafacture/metafix/api/FixPredicate.java +++ b/metafix/src/main/java/org/metafacture/metafix/api/FixPredicate.java @@ -40,15 +40,10 @@ public interface FixPredicate { Predicate IS_TRUE = s -> "true".equals(s) || "1".equals(s); Predicate IS_FALSE = s -> "false".equals(s) || "0".equals(s); - Predicate IS_NUMBER = s -> { - try { - new BigDecimal(s); - return true; - } - catch (final NumberFormatException e) { - return false; - } - }; + Predicate IS_NUMBER = s -> testNumberConditional(s, x -> true); + + BiPredicate GREATER_THAN = (s, t) -> testNumberConditional(s, x -> testNumberConditional(t, y -> x.compareTo(y) > 0)); + BiPredicate LESS_THAN = (s, t) -> testNumberConditional(s, x -> testNumberConditional(t, y -> x.compareTo(y) < 0)); Predicate IS_EMPTY = v -> v.extractType((m, c) -> m .ifArray(a -> c.accept(a.isEmpty())) @@ -88,4 +83,14 @@ default boolean testStringConditional(final Record record, final List pa )); } + static boolean testNumberConditional(final String string, final Predicate conditional) { + try { + final BigDecimal number = new BigDecimal(string); + return number != null && conditional.test(number); + } + catch (final NumberFormatException e) { + return false; + } + } + } diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixIfTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixIfTest.java index 5b8000dcc..5423f8c3b 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixIfTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixIfTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.metafacture.metafix; +package org.metafacture.metafix; // checkstyle-disable-line JavaNCSS import org.metafacture.framework.StreamReceiver; @@ -2546,4 +2546,404 @@ public void shouldTestMacroVariable() { ); } + @Test // checkstyle-disable-line JavaNCSS + public void shouldBeGreaterThan() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if greater_than(foo, '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.literal("foo", "1"); + i.endRecord(); + i.startRecord("2"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("3"); + i.literal("foo", "-1"); + i.endRecord(); + i.startRecord("4"); + i.literal("foo", "1.1"); + i.endRecord(); + i.startRecord("5"); + i.literal("foo", "-1.1"); + i.endRecord(); + i.startRecord("6"); + i.literal("foo", "1.1x"); + i.endRecord(); + i.startRecord("7"); + i.startEntity("foo"); + i.literal("foo", "1"); + i.endEntity(); + i.endRecord(); + i.startRecord("8"); + i.literal("foo", "1"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("9"); + i.literal("foo", "1"); + i.literal("foo", "2"); + i.endRecord(); + i.startRecord("10"); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("foo", "1"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().literal("foo", "-1"); + o.get().endRecord(); + o.get().startRecord("4"); + o.get().literal("foo", "1.1"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("5"); + o.get().literal("foo", "-1.1"); + o.get().endRecord(); + o.get().startRecord("6"); + o.get().literal("foo", "1.1x"); + o.get().endRecord(); + o.get().startRecord("7"); + o.get().startEntity("foo"); + o.get().literal("foo", "1"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("8"); + o.get().literal("foo", "1"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("9"); + o.get().literal("foo", "1"); + o.get().literal("foo", "2"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("10"); + o.get().endRecord(); + } + ); + } + + @Test // checkstyle-disable-line JavaNCSS + public void shouldBeGreaterThanWildcard() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if greater_than('foo.*', '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.literal("foo", "1"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("2"); + i.literal("foo", "1"); + i.literal("foo", "2"); + i.endRecord(); + i.startRecord("3"); + i.startEntity("foo"); + i.literal("foo", "1"); + i.literal("foo", "0"); + i.endEntity(); + i.endRecord(); + i.startRecord("4"); + i.startEntity("foo"); + i.literal("foo", "1"); + i.literal("foo", "2"); + i.endEntity(); + i.endRecord(); + i.startRecord("5"); + i.startEntity("foo"); + i.literal("foo", "1"); + i.endEntity(); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("foo", "1"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().literal("foo", "1"); + o.get().literal("foo", "2"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().startEntity("foo"); + o.get().literal("foo", "1"); + o.get().literal("foo", "0"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("4"); + o.get().startEntity("foo"); + o.get().literal("foo", "1"); + o.get().literal("foo", "2"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("5"); + o.get().startEntity("foo"); + o.get().literal("foo", "1"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + } + ); + } + + @Test + public void shouldBeGreaterThanArray() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if greater_than('foo[].*', '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.startEntity("foo[]"); + i.literal("1", "1"); + i.literal("2", "0"); + i.endEntity(); + i.endRecord(); + i.startRecord("2"); + i.startEntity("foo[]"); + i.literal("1", "1"); + i.literal("2", "2"); + i.endEntity(); + i.endRecord(); + i.startRecord("3"); + i.startEntity("foo[]"); + i.literal("1", "1"); + i.endEntity(); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().startEntity("foo[]"); + o.get().literal("1", "1"); + o.get().literal("2", "0"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().startEntity("foo[]"); + o.get().literal("1", "1"); + o.get().literal("2", "2"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().startEntity("foo[]"); + o.get().literal("1", "1"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + } + ); + } + + @Test // checkstyle-disable-line JavaNCSS + public void shouldBeLessThan() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if less_than(foo, '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.literal("foo", "1"); + i.endRecord(); + i.startRecord("2"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("3"); + i.literal("foo", "-1"); + i.endRecord(); + i.startRecord("4"); + i.literal("foo", "1.1"); + i.endRecord(); + i.startRecord("5"); + i.literal("foo", "-1.1"); + i.endRecord(); + i.startRecord("6"); + i.literal("foo", "1.1x"); + i.endRecord(); + i.startRecord("7"); + i.startEntity("foo"); + i.literal("foo", "-1"); + i.endEntity(); + i.endRecord(); + i.startRecord("8"); + i.literal("foo", "-1"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("9"); + i.literal("foo", "-1"); + i.literal("foo", "-2"); + i.endRecord(); + i.startRecord("10"); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("foo", "1"); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().literal("foo", "-1"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("4"); + o.get().literal("foo", "1.1"); + o.get().endRecord(); + o.get().startRecord("5"); + o.get().literal("foo", "-1.1"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("6"); + o.get().literal("foo", "1.1x"); + o.get().endRecord(); + o.get().startRecord("7"); + o.get().startEntity("foo"); + o.get().literal("foo", "-1"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("8"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("9"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "-2"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("10"); + o.get().endRecord(); + } + ); + } + + @Test // checkstyle-disable-line JavaNCSS + public void shouldBeLessThanWildcard() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if less_than('foo.*', '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.literal("foo", "-1"); + i.literal("foo", "0"); + i.endRecord(); + i.startRecord("2"); + i.literal("foo", "-1"); + i.literal("foo", "-2"); + i.endRecord(); + i.startRecord("3"); + i.startEntity("foo"); + i.literal("foo", "-1"); + i.literal("foo", "0"); + i.endEntity(); + i.endRecord(); + i.startRecord("4"); + i.startEntity("foo"); + i.literal("foo", "-1"); + i.literal("foo", "-2"); + i.endEntity(); + i.endRecord(); + i.startRecord("5"); + i.startEntity("foo"); + i.literal("foo", "-1"); + i.endEntity(); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "0"); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "-2"); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().startEntity("foo"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "0"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("4"); + o.get().startEntity("foo"); + o.get().literal("foo", "-1"); + o.get().literal("foo", "-2"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("5"); + o.get().startEntity("foo"); + o.get().literal("foo", "-1"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + } + ); + } + + @Test + public void shouldBeLessThanArray() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "if less_than('foo[].*', '0')", + " add_field(test,ok)", + "end" + ), + i -> { + i.startRecord("1"); + i.startEntity("foo[]"); + i.literal("1", "-1"); + i.literal("2", "0"); + i.endEntity(); + i.endRecord(); + i.startRecord("2"); + i.startEntity("foo[]"); + i.literal("1", "-1"); + i.literal("2", "-2"); + i.endEntity(); + i.endRecord(); + i.startRecord("3"); + i.startEntity("foo[]"); + i.literal("1", "-1"); + i.endEntity(); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().startEntity("foo[]"); + o.get().literal("1", "-1"); + o.get().literal("2", "0"); + o.get().endEntity(); + o.get().endRecord(); + o.get().startRecord("2"); + o.get().startEntity("foo[]"); + o.get().literal("1", "-1"); + o.get().literal("2", "-2"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + o.get().startRecord("3"); + o.get().startEntity("foo[]"); + o.get().literal("1", "-1"); + o.get().endEntity(); + o.get().literal("test", "ok"); + o.get().endRecord(); + } + ); + } + }