diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java index 6ada09391..bd310cd2c 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java @@ -516,6 +516,15 @@ private TimestampFilter() {} public TimestampRangeFilter range() { return new TimestampRangeFilter(); } + + /** + * Matches cells with exact given timestamp. + * + * @return a {@link TimestampRangeFilter} with start/end closed timestamp. + */ + public TimestampRangeFilter exact(Long exactTimestamp) { + return new TimestampRangeFilter().startClosed(exactTimestamp).endClosed(exactTimestamp); + } } /** Matches only cells with microsecond timestamps within the given range. */ diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/FiltersTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/FiltersTest.java index 509c99da7..ad7902525 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/FiltersTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/FiltersTest.java @@ -350,6 +350,21 @@ public void timestampRange() { assertThat(actualFilter).isEqualTo(expectedFilter); } + @Test + public void timestampAtExactTime() { + RowFilter actualFilter = FILTERS.timestamp().exact(20_000L).toProto(); + + RowFilter expectedFilter = + RowFilter.newBuilder() + .setTimestampRangeFilter( + TimestampRange.newBuilder() + .setStartTimestampMicros(20_000L) + .setEndTimestampMicros(20_000L + 1)) + .build(); + + assertThat(actualFilter).isEqualTo(expectedFilter); + } + @Test public void timestampOpenClosedFakeRange() { RowFilter actualFilter =