You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@edgent.apache.org by cd...@apache.org on 2017/12/14 14:32:26 UTC

[09/50] [abbrv] incubator-edgent git commit: Edgent-393 add Ranges.outsideOf()

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 <dl...@us.ibm.com>
Authored: Mon Nov 6 16:04:04 2017 -0500
Committer: Dale LaBossiere <dl...@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&lt;T&gt;
      * <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&lt;Integer&gt;.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() {