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 c44ab699d310..882551f064f2 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 @@ -28,9 +28,6 @@ *
* 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. */ @InterfaceAudience.Public @@ -51,6 +48,34 @@ public static TimeRange at(long ts) { 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 36d31b402a21..ce07dee6f57a 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 void testCheckAndMutateWithTimeRange() throws IOException { .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)