sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 01/02: Change `GeneralEnvelope.setTimeRange(…)` contract regarding null values in a way more convenient for creating "is before" and "is after" filters. Add some documentation.
Date Wed, 22 Apr 2020 17:16:16 GMT
This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 65deba1d23660cbdf0b6808d8a4c615db16ff2f5
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Wed Apr 22 17:49:01 2020 +0200

    Change `GeneralEnvelope.setTimeRange(…)` contract regarding null values in a way more
convenient for creating "is before" and "is after" filters.
    Add some documentation.
---
 .../org/apache/sis/geometry/GeneralEnvelope.java   | 23 +++++++++++++++-------
 .../sis/util/collection/FrequencySortedSet.java    |  3 +++
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
index 6d7d026..fed4233 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
@@ -469,19 +469,28 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable,
Seriali
      * floating point values using {@link org.apache.sis.referencing.crs.DefaultTemporalCRS},
      * then delegates to {@link #setRange(int, double, double)}.
      *
-     * Beware that any unspecified time will be convered to {@link Double#NaN} value, therefore
invalidating the time
-     * range.
-     *
-     * @param  startTime  the lower temporal value, or {@code null} if unspecified.
-     * @param  endTime    the upper temporal value, or {@code null} if unspecified.
-     * @return whether the temporal component has been set.
+     * <p>Null value means no time limit. More specifically
+     * null {@code startTime} is mapped to {@linkplain Double#NEGATIVE_INFINITY −∞} and
+     * null {@code endTime}   is mapped to {@linkplain Double#POSITIVE_INFINITY +∞}.
+     * This rule makes easy to create <cite>is before</cite> or <cite>is
after</cite> temporal filters,
+     * which can be combined with other envelopes using {@linkplain #intersect(Envelope)
intersection}
+     * for logical AND, or {@linkplain #add(Envelope) union} for logical OR operations.</p>
+     *
+     * @param  startTime  the lower temporal value, or {@code null} if unbounded.
+     * @param  endTime    the upper temporal value, or {@code null} if unbounded.
+     * @return whether the temporal component has been set, or {@code false}
+     *         if no temporal dimension has been found in this envelope.
      *
      * @since 1.0
      */
     public boolean setTimeRange(final Instant startTime, final Instant endTime) {
         final TemporalAccessor t = TemporalAccessor.of(crs, 0);
         if (t != null) {
-            setRange(t.dimension, t.timeCRS.toValue(startTime), t.timeCRS.toValue(endTime));
+            double lower = t.timeCRS.toValue(startTime);
+            double upper = t.timeCRS.toValue(endTime);
+            if (Double.isNaN(lower)) lower = Double.NEGATIVE_INFINITY;
+            if (Double.isNaN(upper)) upper = Double.POSITIVE_INFINITY;
+            setRange(t.dimension, lower, upper);
             return true;
         } else {
             return false;
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/FrequencySortedSet.java
b/core/sis-utility/src/main/java/org/apache/sis/util/collection/FrequencySortedSet.java
index 3396c34..b75137e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/FrequencySortedSet.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/FrequencySortedSet.java
@@ -60,6 +60,8 @@ public class FrequencySortedSet<E> extends AbstractSet<E> implements
SortedSet<E
     /**
      * The frequency of occurrence for each element. We must use a linked hash map instead
of an ordinary
      * hash map because we want to preserve insertion order for elements that occur at the
same frequency.
+     * Values are positives if this set sorts by increasing frequencies, or negatives if
this set sorts by
+     * decreasing frequencies.
      */
     private final Map<E,Integer> count;
 
@@ -153,6 +155,7 @@ public class FrequencySortedSet<E> extends AbstractSet<E>
implements SortedSet<E
             sorted = null;
             occurrence ^= order;
             return count.merge(element, occurrence, (old, n) -> Math.addExact(old, n)
- order) == occurrence;
+            // Note: the subtraction by `order` can not overflow.
         }
         return false;
     }


Mime
View raw message