Status
Current state: Under Discussion
Discussion thread: here [Change the link from the KIP proposal email archive to your own email thread]
JIRA:
Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).
Motivation
Provide an implementation of the Query interface, introduced in KIP-796: Interactive Query v2 , to support reverseRange and reverseAll
Proposed Changes
The ReverseRangeQuery
class will be used for both reverseRange and reverseAll queries. A reverseAll is performed when no lower and no upper bound is specified. A reverseRange query retrieves a set of keys, specified using an upper and/or lower bound, from the underlying KV store. A reverseAll, on the other hand, retrieves all keys contained in the KV store.
@Evolving public final class ReverseRangeQuery<K, V> implements Query<KeyValueIterator<K, V>> { private final Optional<K> lower; private final Optional<K> upper; private ReverseRangeQuery(final Optional<K> lower, final Optional<K> upper) { this.lower = lower; this.upper = upper; } /** * Interactive range query using a lower and upper bound to filter the keys returned. * @param lower The key that specifies the lower bound of the range * @param upper The key that specifies the upper bound of the range * @param <K> The key type * @param <V> The value type */ public static <K, V> ReverseRangeQuery<K, V> withRange(final K lower, final K upper) { return new ReverseRangeQuery<>(Optional.ofNullable(lower), Optional.ofNullable(upper)); } /** * Interactive range query using an upper bound to filter the keys returned. * If both <K,V> are null, RangQuery returns a full range scan. * @param upper The key that specifies the upper bound of the range * @param <K> The key type * @param <V> The value type */ public static <K, V> ReverseRangeQuery<K, V> withUpperBound(final K upper) { return new ReverseRangeQuery<>(Optional.empty(), Optional.of(upper)); } /** * Interactive range query using a lower bound to filter the keys returned. * @param lower The key that specifies the lower bound of the range * @param <K> The key type * @param <V> The value type */ public static <K, V> ReverseRangeQuery<K, V> withLowerBound(final K lower) { return new ReverseRangeQuery<>(Optional.of(lower), Optional.empty()); } /** * Interactive scan query that returns all records in the store. * @param <K> The key type * @param <V> The value type */ public static <K, V> ReverseRangeQuery<K, V> withNoBounds() { return new ReverseRangeQuery<>(Optional.empty(), Optional.empty()); } /** * The lower bound of the query, if specified. */ public Optional<K> getLowerBound() { return lower; } /** * The upper bound of the query, if specified */ public Optional<K> getUpperBound() { return upper; } }
Compatibility, Deprecation, and Migration Plan
- Because we have already have RangeQuery, so we can achieve the ReverseRangeQuery following RangeQuery.
- Since nothing is deprecated in this KIP, users have no need to migrate unless they want to.
Rejected Alternatives
Initially, we want to reuse the code in RangeQuery
, but in the end, we find reuse the code will lead some problem, so we rewrite some methods to achieve ReverseRangeQuery
.