Edgent-393 add Ranges.outsideOf() Project: http://git-wip-us.apache.org/repos/asf/incubator-edgent/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-edgent/commit/356b6381 Tree: http://git-wip-us.apache.org/repos/asf/incubator-edgent/tree/356b6381 Diff: http://git-wip-us.apache.org/repos/asf/incubator-edgent/diff/356b6381
Branch: refs/heads/master Commit: 356b63817d85522bc1f8517bf3b857fdc0335702 Parents: d2e4710 Author: Dale LaBossiere <dlab...@us.ibm.com> Authored: Mon Nov 6 16:04:04 2017 -0500 Committer: Dale LaBossiere <dlab...@us.ibm.com> Committed: Mon Nov 6 16:04:04 2017 -0500 ---------------------------------------------------------------------- RELEASE_NOTES | 1 + .../apache/edgent/analytics/sensors/Range.java | 8 ++++++++ .../apache/edgent/analytics/sensors/Ranges.java | 18 ++++++++++++++++++ .../edgent/test/analytics/sensors/RangeTest.java | 19 +++++++++++++++++-- 4 files changed, 44 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/356b6381/RELEASE_NOTES ---------------------------------------------------------------------- diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 0021af8..ece3878 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -53,6 +53,7 @@ The DEVELOPMENT.md file has been updated accordingly. New Features -------------------- +EDGENT-393 Add Ranges.outsideOf() EDGENT-273 Add scripts, etc to enable building samples Incompatible API changes http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/356b6381/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java ---------------------------------------------------------------------- diff --git a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java index 8f7c647..7ba2b56 100644 --- a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java +++ b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java @@ -164,6 +164,11 @@ public final class Range<T extends Comparable<?>> implements Predicate<T>, Seria * Create a new Range<T> * <p> * See {@link Ranges} for a collection of convenience constructors. + * <p> + * While not enforced, for a Range to be useful/sensible, + * the following must be true: {@code lowerEndpoint <= upperEndpoint}. + * Otherwise the Range will be returned but test() and contains() + * can never return true. * * @param <T> a Comparable type * @param lowerEndpoint null for an infinite value (and lbt must be OPEN) @@ -174,6 +179,9 @@ public final class Range<T extends Comparable<?>> implements Predicate<T>, Seria */ public static <T extends Comparable<?>> Range<T> range(T lowerEndpoint, BoundType lbt, T upperEndpoint, BoundType ubt) { // matchs Guava Range.range param order + // Note: the lowerEndpoint <= upperEndpoint "requirement" is the same as Guava + // don't know if Guava Range.range() enforces that. + // Since we didn't originally enforce that, leave it that way. return new Range<T>(lowerEndpoint, lbt, upperEndpoint, ubt); } http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/356b6381/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java ---------------------------------------------------------------------- diff --git a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java index c4f485f..e272e4b 100644 --- a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java +++ b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java @@ -22,6 +22,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import org.apache.edgent.analytics.sensors.Range.BoundType; +import org.apache.edgent.function.Predicate; /** * Convenience functions and utility operations on {@link Range}. @@ -136,6 +137,23 @@ public final class Ranges { } /** + * Create a Predicate whose {@code test(v)} behaves like {@code ! range.test(v)} + * <p> + * This can be useful in a situation such as filtering to include only values + * that are outside of a range. + * <pre>{@code + * TStream<?> outsideRange = readings.filter(Ranges.outsideOf(Ranges.open(10,20))); + * }</pre> + * + * @param <T> Endpoint type + * @param range the Range + * @return the Predicate + */ + public static <T extends Comparable<?>> Predicate<T> outsideOf(Range<T> range) { + return t -> ! range.test(t); + } + + /** * Create a Range from a Range<Integer>.toString() value. * @param str the String * @return the Range http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/356b6381/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java ---------------------------------------------------------------------- diff --git a/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java b/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java index 23dbb02..92298d1 100644 --- a/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java +++ b/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java @@ -32,6 +32,7 @@ import java.util.Comparator; import org.apache.edgent.analytics.sensors.Range; import org.apache.edgent.analytics.sensors.Ranges; import org.apache.edgent.function.Function; +import org.apache.edgent.function.Predicate; import org.junit.Test; import com.google.gson.Gson; @@ -41,13 +42,18 @@ import com.google.gson.reflect.TypeToken; * Test Range and Ranges */ public class RangeTest { + + private <T extends Comparable<?>> void testOutsideOf(Range<T> range, T v) { + Predicate<T> notPredicate = Ranges.outsideOf(range); + assertEquals("outsideOf-"+range+".test("+v+")", !range.test(v), notPredicate.test(v)); + } private <T extends Comparable<?>> void testContains(Range<T> range, T v, Boolean expected) { - assertEquals("range"+range+".contains(range"+v+")", expected, range.contains(v)); + assertEquals("range"+range+".contains("+v+")", expected, range.contains(v)); } private <T extends Comparable<?>> void testPredicate(Range<T> range, T v, Boolean expected) { - assertEquals("range"+range+".test(range"+v+")", expected, range.test(v)); + assertEquals("range"+range+".test("+v+")", expected, range.test(v)); } private <T extends Comparable<?>> void testToString(Range<T> range, String expected) { @@ -163,6 +169,15 @@ public class RangeTest { testPredicate(Ranges.closed(2,4), 4, true); testPredicate(Ranges.closed(2,4), 5, false); } + + @Test + public void testOutsideOf() { + testOutsideOf(Ranges.closed(2,4), 1); + testOutsideOf(Ranges.closed(2,4), 2); + testOutsideOf(Ranges.closed(2,4), 3); + testOutsideOf(Ranges.closed(2,4), 4); + testOutsideOf(Ranges.closed(2,4), 5); + } @Test public void testEquals() {