From 43a0ec80fa1157c5b5449b1da6dd4c19e44c5383 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Tue, 13 Aug 2019 15:03:56 +1000 Subject: [PATCH] HBASE-22841 Add more factory functions to TimeRange These functions make it easier to possible to use `org.apache.hadoop.hbase.client.Table.CheckAndMutateBuilder#timeRange` with more interesting ranges, without being forced to use the deprecated constructors. Signed-off-by: huzheng --- .../org/apache/hadoop/hbase/io/TimeRange.java | 39 ++++++++++++++++--- .../hbase/client/TestFromClientSide.java | 36 +++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/TimeRange.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/TimeRange.java index c44ab699d31..fe229b69210 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/TimeRange.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/TimeRange.java @@ -26,12 +26,13 @@ import org.apache.yetus.audience.InterfaceAudience; * {@link #INITIAL_MIN_TIMESTAMP} and {@link #INITIAL_MAX_TIMESTAMP} only. Gets freaked out if * passed a timestamp that is < {@link #INITIAL_MIN_TIMESTAMP}, *

- * Evaluated according to minStamp <= timestamp < maxStamp - * or [minStamp,maxStamp) in interval notation. + * Evaluated according to minStamp <= timestamp < maxStamp or [minStamp,maxStamp) in interval + * notation. *

- * Can be returned and read by clients. Should not be directly created by clients. - * Thus, all constructors are purposely @InterfaceAudience.Private. - *

Immutable. Thread-safe. + * Can be returned and read by clients. Should not be directly created by clients. Thus, all + * constructors are purposely @InterfaceAudience.Private. + *

+ * Immutable. Thread-safe. */ @InterfaceAudience.Public public class TimeRange { @@ -51,6 +52,34 @@ public class TimeRange { return new TimeRange(ts, ts + 1); } + /** + * Represents the time interval [minStamp, Long.MAX_VALUE) + * @param minStamp the minimum timestamp value, inclusive + */ + public static TimeRange from(long minStamp) { + check(minStamp, INITIAL_MAX_TIMESTAMP); + return new TimeRange(minStamp, INITIAL_MAX_TIMESTAMP); + } + + /** + * Represents the time interval [0, maxStamp) + * @param maxStamp the minimum timestamp value, exclusive + */ + public static TimeRange until(long maxStamp) { + check(INITIAL_MIN_TIMESTAMP, maxStamp); + return new TimeRange(INITIAL_MIN_TIMESTAMP, maxStamp); + } + + /** + * Represents the time interval [minStamp, maxStamp) + * @param minStamp the minimum timestamp, inclusive + * @param maxStamp the maximum timestamp, exclusive + */ + public static TimeRange between(long minStamp, long maxStamp) { + check(minStamp, maxStamp); + return new TimeRange(minStamp, maxStamp); + } + private final long minStamp; private final long maxStamp; private final boolean allTime; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java index 36d31b402a2..ce07dee6f57 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java @@ -4866,12 +4866,48 @@ public class TestFromClientSide { .thenPut(put); assertFalse(ok); + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.from(ts + 10000)) + .ifEquals(VALUE) + .thenPut(put); + assertFalse(ok); + + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.between(ts + 10000, ts + 20000)) + .ifEquals(VALUE) + .thenPut(put); + assertFalse(ok); + + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.until(ts)) + .ifEquals(VALUE) + .thenPut(put); + assertFalse(ok); + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) .timeRange(TimeRange.at(ts)) .ifEquals(VALUE) .thenPut(put); assertTrue(ok); + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.from(ts)) + .ifEquals(VALUE) + .thenPut(put); + assertTrue(ok); + + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.between(ts, ts + 20000)) + .ifEquals(VALUE) + .thenPut(put); + assertTrue(ok); + + ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER) + .timeRange(TimeRange.until(ts + 10000)) + .ifEquals(VALUE) + .thenPut(put); + assertTrue(ok); + RowMutations rm = new RowMutations(ROW) .add((Mutation) put); ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)