Hi Hanyu,

Thanks a lot for the KIP! I agree with Bruno's comments about fluent
API / keeping the query classes immutable. Apart from that, on the
technical side this is looking good already!

Two comments on the KIP itself (not the technical part):
 - The motivation section could be extended by a short paragraph why
we want to have `reverseRange` / `reverseAll` in the first place.
 - Consider using something like languagetool.org to avoid spelling /
grammar mistakes, which helps readability.

Cheers,
Lucas

On Wed, Oct 4, 2023 at 10:24 AM Bruno Cadonna <cado...@apache.org> wrote:
>
> Hi Hanyu,
>
> I agree with what others said about having a `withDescendingOrder()`
> method and about to document how the results are ordered.
>
> I would not add a reverse flag and adding a parameter to each method in
> RangeQuery. This makes the API less fluent and harder to maintain since
> the flag would change all methods. There is no constraint to only add
> static factory methods to RangeQuery. In fact, if you look into the
> existing class KeyQuery, more precisely at skipCache() and into the
> proposals for queries of versioned state stores, i.e., KIP-969, KIP-968,
> and KIP-960, we already have examples where we set a flag with a
> instance method, for example, asOf(). Such methods make the API more
> fluent and limit the blast radius of the flag to only one public method
> (plus the getter).
>
> So, making a query that reads the state store in reversed order would
> then result in:
>
> final RangeQuery<Integer, Integer> query = RangeQuery.withRange(1,
> 1000).withDescendingKeys();
>
> I think this is more readable than:
>
> final RangeQuery<Integer, Integer> query = RangeQuery.withRange(1, 1000,
> true);
>
> Additionally, I think the KIP would benefit from a usage example of the
> newly introduced methods like in KIP-969 etc.
>
> In my opinion, the test plan should also mention that you plan to
> write/adapt unit tests.
>
> Best,
> Bruno
>
> On 10/4/23 5:16 AM, Hanyu (Peter) Zheng wrote:
> > If we use  WithDescendingKeys() to generate a RangeQuery to do the
> > reveseQuery, how do we achieve the methods like withRange, withUpperBound,
> > and withLowerBound only in this method?
> >
> > On Tue, Oct 3, 2023 at 8:01 PM Hanyu (Peter) Zheng <pzh...@confluent.io>
> > wrote:
> >
> >> I believe there's no need to introduce a method like WithDescendingKeys().
> >> Instead, we can simply add a reverse flag to RangeQuery. Each method within
> >> RangeQuery would then accept an additional parameter. If the reverse is set
> >> to true, it would indicate the results should be reversed.
> >>
> >> Initially, I introduced a reverse variable. When set to false, the
> >> RangeQuery class behaves normally. However, when reverse is set to true,
> >> the RangeQuery essentially takes on the functionality of ReverseRangeQuery.
> >> Further details can be found in the "Rejected Alternatives" section.
> >>
> >> In my perspective, RangeQuery is a class responsible for creating a series
> >> of RangeQuery objects. It offers methods such as withRange, withUpperBound,
> >> and withLowerBound, allowing us to generate objects representing different
> >> queries. I'm unsure how adding a withDescendingOrder() method would be
> >> compatible with the other methods, especially considering that, based on
> >> KIP 969, WithDescendingKeys() doesn't appear to take any input variables.
> >> And if withDescendingOrder() doesn't accept any input, how does it return a
> >> RangeQuery?
> >>
> >> On Tue, Oct 3, 2023 at 4:37 PM Hanyu (Peter) Zheng <pzh...@confluent.io>
> >> wrote:
> >>
> >>> Hi, Colt,
> >>> The underlying structure of inMemoryKeyValueStore is treeMap.
> >>> Sincerely,
> >>> Hanyu
> >>>
> >>> On Tue, Oct 3, 2023 at 4:34 PM Hanyu (Peter) Zheng <pzh...@confluent.io>
> >>> wrote:
> >>>
> >>>> Hi Bill,
> >>>> 1. I will update the KIP in accordance with the PR and synchronize their
> >>>> future updates.
> >>>> 2. I will use that name.
> >>>> 3. you mean add something about ordering at the motivation section?
> >>>>
> >>>> Sincerely,
> >>>> Hanyu
> >>>>
> >>>>
> >>>> On Tue, Oct 3, 2023 at 4:29 PM Hanyu (Peter) Zheng <pzh...@confluent.io>
> >>>> wrote:
> >>>>
> >>>>> Hi, Walker,
> >>>>>
> >>>>> 1. I will update the KIP in accordance with the PR and synchronize
> >>>>> their future updates.
> >>>>> 2. I will use that name.
> >>>>> 3. I'll provide additional details in that section.
> >>>>> 4. I intend to utilize rangeQuery to achieve what we're referring to as
> >>>>> reverseQuery. In essence, reverseQuery is merely a term. To clear up any
> >>>>> ambiguity, I'll make necessary adjustments to the KIP.
> >>>>>
> >>>>> Sincerely,
> >>>>> Hanyu
> >>>>>
> >>>>>
> >>>>>
> >>>>> On Tue, Oct 3, 2023 at 4:09 PM Hanyu (Peter) Zheng <pzh...@confluent.io>
> >>>>> wrote:
> >>>>>
> >>>>>> Ok, I will change it back to following the code, and update them
> >>>>>> together.
> >>>>>>
> >>>>>> On Tue, Oct 3, 2023 at 2:27 PM Walker Carlson
> >>>>>> <wcarl...@confluent.io.invalid> wrote:
> >>>>>>
> >>>>>>> Hello Hanyu,
> >>>>>>>
> >>>>>>> Looking over your kip things mostly make sense but I have a couple of
> >>>>>>> comments.
> >>>>>>>
> >>>>>>>
> >>>>>>>     1. You have "withDescandingOrder()". I think you mean "descending"
> >>>>>>> :)
> >>>>>>>     Also there are still a few places in the do where its called
> >>>>>>> "setReverse"
> >>>>>>>     2. Also I like "WithDescendingKeys()" better
> >>>>>>>     3. I'm not sure of what ordering guarantees we are offering.
> >>>>>>> Perhaps we
> >>>>>>>     can add a section to the motivation clearly spelling out the
> >>>>>>> current
> >>>>>>>     ordering and the new offering?
> >>>>>>>     4. When you say "use unbounded reverseQuery to achieve reverseAll"
> >>>>>>> do
> >>>>>>>     you mean "use unbounded RangeQuery to achieve reverseAll"? as far
> >>>>>>> as I can
> >>>>>>>     tell we don't have a reverseQuery as a named object?
> >>>>>>>
> >>>>>>>
> >>>>>>> Looking good so far
> >>>>>>>
> >>>>>>> best,
> >>>>>>> Walker
> >>>>>>>
> >>>>>>> On Tue, Oct 3, 2023 at 2:13 PM Colt McNealy <c...@littlehorse.io>
> >>>>>>> wrote:
> >>>>>>>
> >>>>>>>> Hello Hanyu,
> >>>>>>>>
> >>>>>>>> Thank you for the KIP. I agree with Matthias' proposal to keep the
> >>>>>>> naming
> >>>>>>>> convention consistent with KIP-969. I favor the
> >>>>>>> `.withDescendingKeys()`
> >>>>>>>> name.
> >>>>>>>>
> >>>>>>>> I am curious about one thing. RocksDB guarantees that records
> >>>>>>> returned
> >>>>>>>> during a range scan are lexicographically ordered by the bytes of
> >>>>>>> the keys
> >>>>>>>> (either ascending or descending order, as specified in the query).
> >>>>>>> This
> >>>>>>>> means that results within a single partition are indeed ordered.**
> >>>>>>> My
> >>>>>>>> reading of KIP-805 suggests to me that you don't need to specify the
> >>>>>>>> partition number you are querying in IQv2, which means that you can
> >>>>>>> have a
> >>>>>>>> valid reversed RangeQuery over a store with "multiple partitions"
> >>>>>>> in it.
> >>>>>>>>
> >>>>>>>> Currently, IQv1 does not guarantee order of keys in this scenario.
> >>>>>>> Does
> >>>>>>>> IQv2 support ordering across partitions? Such an implementation
> >>>>>>> would
> >>>>>>>> require opening a rocksdb range scan** on multiple rocksdb
> >>>>>>> instances (one
> >>>>>>>> per partition), and polling the first key of each. Whether or not
> >>>>>>> this is
> >>>>>>>> ordered, could we please add that to the documentation?
> >>>>>>>>
> >>>>>>>> **(How is this implemented/guaranteed in an
> >>>>>>> `inMemoryKeyValueStore`? I
> >>>>>>>> don't know about that implementation).
> >>>>>>>>
> >>>>>>>> Colt McNealy
> >>>>>>>>
> >>>>>>>> *Founder, LittleHorse.dev*
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> On Tue, Oct 3, 2023 at 1:35 PM Hanyu (Peter) Zheng
> >>>>>>>> <pzh...@confluent.io.invalid> wrote:
> >>>>>>>>
> >>>>>>>>> ok, I will update it. Thank you  Matthias
> >>>>>>>>>
> >>>>>>>>> Sincerely,
> >>>>>>>>> Hanyu
> >>>>>>>>>
> >>>>>>>>> On Tue, Oct 3, 2023 at 11:23 AM Matthias J. Sax <mj...@apache.org
> >>>>>>>>
> >>>>>>>> wrote:
> >>>>>>>>>
> >>>>>>>>>> Thanks for the KIP Hanyu!
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> I took a quick look and it think the proposal makes sense
> >>>>>>> overall.
> >>>>>>>>>>
> >>>>>>>>>> A few comments about how to structure the KIP.
> >>>>>>>>>>
> >>>>>>>>>> As you propose to not add `ReverseRangQuery` class, the code
> >>>>>>> example
> >>>>>>>>>> should go into "Rejected Alternatives" section, not in the
> >>>>>>> "Proposed
> >>>>>>>>>> Changes" section.
> >>>>>>>>>>
> >>>>>>>>>> For the `RangeQuery` code example, please omit all existing
> >>>>>>> methods
> >>>>>>>> etc,
> >>>>>>>>>> and only include what will be added/changed. This make it
> >>>>>>> simpler to
> >>>>>>>>>> read the KIP.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> nit: typo
> >>>>>>>>>>
> >>>>>>>>>>>   the fault value is false
> >>>>>>>>>>
> >>>>>>>>>> Should be "the default value is false".
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> Not sure if `setReverse()` is the best name. Maybe
> >>>>>>>> `withDescandingOrder`
> >>>>>>>>>> (or similar, I guess `withReverseOrder` would also work) might
> >>>>>>> be
> >>>>>>>>>> better? Would be good to align to KIP-969 proposal that suggest
> >>>>>>> do use
> >>>>>>>>>> `withDescendingKeys` methods for "reverse key-range"; if we go
> >>>>>>> with
> >>>>>>>>>> `withReverseOrder` we should change KIP-969 accordingly.
> >>>>>>>>>>
> >>>>>>>>>> Curious to hear what others think about naming this
> >>>>>>> consistently across
> >>>>>>>>>> both KIPs.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> -Matthias
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> On 10/3/23 9:17 AM, Hanyu (Peter) Zheng wrote:
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-985%3A+Add+reverseRange+and+reverseAll+query+over+kv-store+in+IQv2
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> --
> >>>>>>>>>
> >>>>>>>>> [image: Confluent] <https://www.confluent.io>
> >>>>>>>>> Hanyu (Peter) Zheng he/him/his
> >>>>>>>>> Software Engineer Intern
> >>>>>>>>> +1 (213) 431-7193 <+1+(213)+431-7193>
> >>>>>>>>> Follow us: [image: Blog]
> >>>>>>>>> <
> >>>>>>>>>
> >>>>>>>>
> >>>>>>> https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog
> >>>>>>>>>> [image:
> >>>>>>>>> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >>>>>>>>> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >>>>>>>>> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >>>>>>>>> <https://youtube.com/confluent>
> >>>>>>>>>
> >>>>>>>>> [image: Try Confluent Cloud for Free]
> >>>>>>>>> <
> >>>>>>>>>
> >>>>>>>>
> >>>>>>> https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>>
> >>>>>> [image: Confluent] <https://www.confluent.io>
> >>>>>> Hanyu (Peter) Zheng he/him/his
> >>>>>> Software Engineer Intern
> >>>>>> +1 (213) 431-7193 <+1+(213)+431-7193>
> >>>>>> Follow us: [image: Blog]
> >>>>>> <https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog>[image:
> >>>>>> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >>>>>> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >>>>>> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >>>>>> <https://youtube.com/confluent>
> >>>>>>
> >>>>>> [image: Try Confluent Cloud for Free]
> >>>>>> <https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic>
> >>>>>>
> >>>>>
> >>>>>
> >>>>> --
> >>>>>
> >>>>> [image: Confluent] <https://www.confluent.io>
> >>>>> Hanyu (Peter) Zheng he/him/his
> >>>>> Software Engineer Intern
> >>>>> +1 (213) 431-7193 <+1+(213)+431-7193>
> >>>>> Follow us: [image: Blog]
> >>>>> <https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog>[image:
> >>>>> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >>>>> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >>>>> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >>>>> <https://youtube.com/confluent>
> >>>>>
> >>>>> [image: Try Confluent Cloud for Free]
> >>>>> <https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic>
> >>>>>
> >>>>
> >>>>
> >>>> --
> >>>>
> >>>> [image: Confluent] <https://www.confluent.io>
> >>>> Hanyu (Peter) Zheng he/him/his
> >>>> Software Engineer Intern
> >>>> +1 (213) 431-7193 <+1+(213)+431-7193>
> >>>> Follow us: [image: Blog]
> >>>> <https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog>[image:
> >>>> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >>>> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >>>> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >>>> <https://youtube.com/confluent>
> >>>>
> >>>> [image: Try Confluent Cloud for Free]
> >>>> <https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic>
> >>>>
> >>>
> >>>
> >>> --
> >>>
> >>> [image: Confluent] <https://www.confluent.io>
> >>> Hanyu (Peter) Zheng he/him/his
> >>> Software Engineer Intern
> >>> +1 (213) 431-7193 <+1+(213)+431-7193>
> >>> Follow us: [image: Blog]
> >>> <https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog>[image:
> >>> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >>> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >>> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >>> <https://youtube.com/confluent>
> >>>
> >>> [image: Try Confluent Cloud for Free]
> >>> <https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic>
> >>>
> >>
> >>
> >> --
> >>
> >> [image: Confluent] <https://www.confluent.io>
> >> Hanyu (Peter) Zheng he/him/his
> >> Software Engineer Intern
> >> +1 (213) 431-7193 <+1+(213)+431-7193>
> >> Follow us: [image: Blog]
> >> <https://www.confluent.io/blog?utm_source=footer&utm_medium=email&utm_campaign=ch.email-signature_type.community_content.blog>[image:
> >> Twitter] <https://twitter.com/ConfluentInc>[image: LinkedIn]
> >> <https://www.linkedin.com/in/hanyu-peter-zheng/>[image: Slack]
> >> <https://slackpass.io/confluentcommunity>[image: YouTube]
> >> <https://youtube.com/confluent>
> >>
> >> [image: Try Confluent Cloud for Free]
> >> <https://www.confluent.io/get-started?utm_campaign=tm.fm-apac_cd.inbound&utm_source=gmail&utm_medium=organic>
> >>
> >
> >

Reply via email to