Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Update an implementation of the Query interface, introduced in KIP-796: Interactive Query v2 , to support reverseRange and reverseAll.

Use bounded query to achieve reverseRange and use unbounded query to achieve reverseAll.


Proposed Changes

To achieve reverseRange and reverseAll, we can generate a new class like below, we can also reuse lots of code from RangeQuery, to simplify the code we choose reuse the RangeQuery code.

...

the second method is setReverse() , if we want the query do reverseQuery, we can use this method to set the reverse  to true, so this time, rangeQuery Stand for reverseQuery.

Use bounded reverseQuery to achieve reverseRange and use unbounded reverseQuery to achieve reverseAll.

Code Block
languagejava
titleRangeQuery
/**
 * Interactive query for issuing range queries and scans over KeyValue stores.
 * <p>
 *  A range query retrieves a set of records, specified using an upper and/or lower bound on the keys.
 * <p>
 * A scan query retrieves all records contained in the store.
 * <p>
 * If the reverse is false, do RangeQueryrangeQuery. If the reverse is true do ReverseRangeQueryreverseQuery
 */
@Evolving
public final class RangeQuery<K, V> implements Query<KeyValueIterator<K, V>> {


    private final Optional<K> lower;
    private final Optional<K> upper;

    private boolean reverse;

    private RangeQuery(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> RangeQuery<K, V> withRange(final K lower, final K upper) {
        return new RangeQuery<>(Optional.ofNullable(lower), Optional.ofNullable(upper));
    }

    /**
     * Check whether the Query is ReverseRangeQueryreverseQuery.
     */
    public boolean isReverse() {
        return reverse;
    }

    /**
     * Set the Query to ReverseRangeQueryreverseQuery.
     */
    public void setReverse() {
        this.reverse = true;
    }

    /**
     * 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> RangeQuery<K, V> withUpperBound(final K upper) {
        return new RangeQuery<>(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> RangeQuery<K, V> withLowerBound(final K lower) {
        return new RangeQuery<>(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> RangeQuery<K, V> withNoBounds() {
        return new RangeQuery<>(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;
    }
}

...