Thanks Navinder! I've also updated the motivation.

Thanks,
-John

On Wed, Jan 22, 2020, at 11:12, Navinder Brar wrote:
> I went through the grammar wiki page and since it is already agreed in 
> principle I will change from constructor to below method and add the 
> getters back.
> public static <T> StoreQueryParams<T> fromNameAndType(
>   final String storeName,
>   final QueryableStoreType<T>  queryableStoreType
> )
> 
> 
> Thanks,
> Navinder
> 
>     On Wednesday, 22 January, 2020, 09:32:07 pm IST, John Roesler 
> <vvcep...@apache.org> wrote:  
>  
>  22) I'm specifically proposing to establish a new convention.
> The existing convention is fundamentally broken and has
> been costly both for users and maintainers. That is the purpose
> of the grammar I proposed. The plan is to implement  new APIs
> following the grammar and gradually to port old APIs to it.
> 
> The grammar wiki page has plenty of justification, so I won't 
> recapitulate it here.
> 
> Thanks,
> -John
> 
> On Wed, Jan 22, 2020, at 09:39, Navinder Brar wrote:
> > 10) Sure John, please go ahead.
> > 
> > 21) I have no strong opinion on constructor vs static factory. If 
> > everyone's okay with it, I can make the change.
> > 
> > 22) I looked at classes suggested by Matthias and I see there are no 
> > getters there. We are ok with breaking the convention?
> > 
> > Thanks,Navinder Pal Singh Brar
> > 
> >  
> > 
> >    On Wednesday, 22 January, 2020, 08:40:27 pm IST, John Roesler 
> > <vvcep...@apache.org> wrote:  
> >  
> >  Hi all,
> > 
> > 10) For the motivation, I have some thoughts for why this KIP is
> > absolutely essential as designed. If it's ok with you, Navinder,
> > I'd just edit the motivation section of the wiki? If you're unhappy
> > with my wording, you're of course welcome to revert or revise it; 
> > it just seems more efficient than discussing it over email.
> > 
> > 20) The getters were my fault :) 
> > I proposed to design this KIP following the grammar proposal:
> > https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+DSL+Grammar
> > At the risk of delaying the vote on this KIP, I'd humbly suggest we 
> > keep the getters,
> > for all the reasons laid out on that grammar.
> > 
> > I realize this introduces an inconsistency, but my hope is that we 
> > would close that
> > gap soon. I can even create tickets for migrating each API, if that 
> > helps make 
> > this idea more palatable. IMO, this proposed API is likely to be a bit 
> > "out of
> > the way", in that it's not likely to be heavily used by a broad 
> > audience in 2.5, 
> > so the API inconsistency wouldn't be too apparent. Plus, it will save 
> > us from 
> > implementing a config object in the current style, along with an 
> > "internal" 
> > counterpart, which we would immediately have plans to deprecate.
> > 
> > Just to clarify (I know this has been a bit thrashy):
> > 21. there should be no public constructor, instead (since there are 
> > required arguments),
> > there should be just one factory method:
> > public static <T> StoreQueryParams<T> fromNameAndType(
> >   final String storeName, 
> >   final QueryableStoreType<T>  queryableStoreType
> > )
> > 
> > 22. there should be getters corresponding to each argument (required 
> > and optional):
> > Integer getPartition()
> > boolean getIncludeStaleStores()
> > 
> > Instead of adding the extra getAllPartitions() pseudo-getter, let's 
> > follow Ted's advice and
> > just document that getPartition() would return `null`, and that it 
> > means that a
> > specific partition hasn't been requested, so the store would wrap all 
> > local partitions.
> > 
> > With those two changes, this proposal would be 100% in line with the 
> > grammar,
> > and IMO ready to go.
> > 
> > Thanks,
> > -John
> > 
> > Thanks,
> > -John
> > 
> > On Wed, Jan 22, 2020, at 03:56, Navinder Brar wrote:
> > > Thanks Matthias for the feedback.
> > > 
> > > 10) As Guozhang suggested above, we thought of adding storeName and 
> > > queryableStoreType as well in the StoreQueryParams, which is another 
> > > motivation for this KIP as it overloads KafkaStreams#store(). I have 
> > > updated the motivation in the KIP as well.
> > > 
> > > 20) I agree we can probably remove getPartition() and 
> > > getIncludeStaleStores() but we would definitely need getStoreName and 
> > > getQueryableStoreType() as they would be used in internal classes 
> > > QueryableStoreProvider.java and StreamThreadStateStoreProvider.java.
> > > 
> > >  30) I have edited the KIP to include only the changed 
> > >KafkaStreams#store().
> > > 
> > > 40) Removed the internal classes from the KIP.
> > > 
> > > I have incorporated feedback from Guozhang as well in the KIP. If 
> > > nothing else is pending, vote is ongoing.
> > > 
> > > ~Navinder    On Wednesday, 22 January, 2020, 12:49:51 pm IST, Matthias 
> > > J. Sax <matth...@confluent.io> wrote:  
> > >  
> > >  Thanks for the KIP. Overall it makes sense.
> > > 
> > > Couple of minor comments/questions:
> > > 
> > > 10) To me, it was initially quite unclear why we need this KIP. The
> > > motivation section does only talk about some performance issues (that
> > > are motivated by single key look-ups) -- however, all issues mentioned
> > > in the KIP could be fixed without any public API change. The important
> > > cases, why the public API changes (and thus this KIP) is useful are
> > > actually missing in the motivation section. I would be helpful to add
> > > more details.
> > > 
> > > 20) `StoreQueryParams` has a lot of getter methods that we usually don't
> > > have for config objects (compare `Consumed`, `Produced`, `Materialized`,
> > > etc). Is there any reason why we need to add those getters to the public
> > > API?
> > > 
> > > 30) The change to remove `KafkaStreams#store(...)` as introduced in
> > > KIP-535 should be listed in sections Public API changes. Also, existing
> > > methods should not be listed -- only changes. Hence, in
> > > `KafkaStreams.java` only one new method and the `store()` method as
> > > added via KIP-535 should be listed.
> > > 
> > > 40) `QueryableStoreProvider` and `StreamThreadStateStoreProvider` are
> > > internal classes and thus we can remove all changes to it from the KIP.
> > > 
> > > 
> > > Thanks!
> > > 
> > > 
> > > -Matthias
> > > 
> > > 
> > > 
> > > On 1/21/20 11:46 AM, Vinoth Chandar wrote:
> > > > Chiming in a bit late here..
> > > > 
> > > > +1 This is a very valid improvement. Avoiding doing gets on irrelevant
> > > > partitions will improve performance and efficiency for IQs.
> > > > 
> > > > As an incremental improvement to the current APIs,  adding an option to
> > > > filter out based on partitions makes sense
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > On Mon, Jan 20, 2020 at 3:13 AM Navinder Brar
> > > > <navinder_b...@yahoo.com.invalid> wrote:
> > > > 
> > > >> Thanks John. If there are no other comments to be addressed, I will 
> > > >> start
> > > >> a vote today so that we are on track for this release.~Navinder
> > > >>
> > > >>
> > > >> On Monday, January 20, 2020, 8:32 AM, John Roesler 
> > > >> <vvcep...@apache.org>
> > > >> wrote:
> > > >>
> > > >> Thanks, Navinder,
> > > >>
> > > >> The Param object looks a bit different than I would have done, but it
> > > >> certainly is explicit. We might have to deprecate those particular 
> > > >> factory
> > > >> methods and move to a builder pattern if we need to add any more 
> > > >> options in
> > > >> the future, but I’m fine with that possibility.
> > > >>
> > > >> The KIP also discusses some implementation details that aren’t 
> > > >> necessary
> > > >> here. We really only need to see the public interfaces. We can discuss 
> > > >> the
> > > >> implementation in the PR.
> > > >>
> > > >> That said, the public API part of the current proposal looks good to 
> > > >> me! I
> > > >> would be a +1 if you called for a vote.
> > > >>
> > > >> Thanks,
> > > >> John
> > > >>
> > > >> On Sun, Jan 19, 2020, at 20:50, Navinder Brar wrote:
> > > >>> I have made some edits in the KIP, please take another look. It would
> > > >>> be great if we can push it in 2.5.0.
> > > >>> ~Navinder
> > > >>>
> > > >>>
> > > >>> On Sunday, January 19, 2020, 12:59 AM, Navinder Brar
> > > >>> <navinder_b...@yahoo.com.INVALID> wrote:
> > > >>>
> > > >>> Sure John, I will update the StoreQueryParams with static factory
> > > >>> methods.
> > > >>> @Ted, we would need to create taskId only in case a user provides one
> > > >>> single partition. In case user wants to query all partitions of an
> > > >>> instance the current code is good enough where we iterate over all
> > > >>> stream threads and go over all taskIds to match the store. But in case
> > > >>> a user requests for a single partition-based store, we need to create 
> > > >>> a
> > > >>> taskId out of that partition and store name(using
> > > >>> internalTopologyBuilder class) and match with the taskIds belonging to
> > > >>> that instance. I will add the code in the KIP.
> > > >>>
> > > >>>    On Sunday, 19 January, 2020, 12:47:08 am IST, Ted Yu
> > > >>> <yuzhih...@gmail.com> wrote:
> > > >>>
> > > >>>  Looking at the current KIP-562:
> > > >>>
> > > >>> bq. Create a taskId from the combination of store name and partition
> > > >>> provided by the user
> > > >>>
> > > >>> I wonder if a single taskId would be used for the “all partitions” 
> > > >>> case.
> > > >>> If so, we need to choose a numerical value for the partition portion 
> > > >>> of
> > > >> the
> > > >>> taskId.
> > > >>>
> > > >>> On Sat, Jan 18, 2020 at 10:27 AM John Roesler <vvcep...@apache.org>
> > > >> wrote:
> > > >>>
> > > >>>> Thanks, Ted!
> > > >>>>
> > > >>>> This makes sense, but it seems like we should lean towards explicit
> > > >>>> semantics in the public API. ‘-1’ meaning “all partitions” is
> > > >> reasonable,
> > > >>>> but not explicit. That’s why I suggested the Boolean for “all
> > > >> partitions”.
> > > >>>> I guess this also means getPartition() should either throw an
> > > >> exception or
> > > >>>> return null if the partition is unspecified.
> > > >>>>
> > > >>>> Thanks,
> > > >>>> John
> > > >>>>
> > > >>>> On Sat, Jan 18, 2020, at 08:43, Ted Yu wrote:
> > > >>>>> I wonder if the following two methods can be combined:
> > > >>>>>
> > > >>>>> Integer getPartition() // would be null if unset or if "all
> > > >> partitions"
> > > >>>>> boolean getAllLocalPartitions() // true/false if "all partitions"
> > > >>>> requested
> > > >>>>>
> > > >>>>> into:
> > > >>>>>
> > > >>>>> Integer getPartition() // would be null if unset or -1 if "all
> > > >>>> partitions"
> > > >>>>>
> > > >>>>> Cheers
> > > >>>>>
> > > >>>>> On Fri, Jan 17, 2020 at 9:56 PM John Roesler <vvcep...@apache.org>
> > > >>>> wrote:
> > > >>>>>
> > > >>>>>> Thanks, Navinder!
> > > >>>>>>
> > > >>>>>> I took a look at the KIP.
> > > >>>>>>
> > > >>>>>> We tend to use static factory methods instead of public
> > > >> constructors,
> > > >>>> and
> > > >>>>>> also builders for optional parameters.
> > > >>>>>>
> > > >>>>>> Given that, I think it would be more typical to have a factory
> > > >> method:
> > > >>>>>> storeQueryParams()
> > > >>>>>>
> > > >>>>>> and also builders for setting the optional parameters, like:
> > > >>>>>> withPartitions(List<Integer> partitions)
> > > >>>>>> withStaleStoresEnabled()
> > > >>>>>> withStaleStoresDisabled()
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> I was also thinking this over today, and it really seems like
> > > >> there are
> > > >>>>>> two main cases for specifying partitions,
> > > >>>>>> 1. you know exactly what partition you want. In this case, you'll
> > > >> only
> > > >>>>>> pass in a single number.
> > > >>>>>> 2. you want to get a handle on all the stores for this instance
> > > >> (the
> > > >>>>>> current behavior). In this case, it's not clear how to use
> > > >>>> withPartitions
> > > >>>>>> to achieve the goal, unless you want to apply a-priori knowledge
> > > >> of the
> > > >>>>>> number of partitions in the store. We could consider an empty
> > > >> list, or
> > > >>>> a
> > > >>>>>> null, to indicate "all", but that seems a little complicated.
> > > >>>>>>
> > > >>>>>> Thus, maybe it would actually be better to eschew withPartitions
> > > >> for
> > > >>>> now
> > > >>>>>> and instead just offer:
> > > >>>>>> withPartition(int partition)
> > > >>>>>> withAllLocalPartitions()
> > > >>>>>>
> > > >>>>>> and the getters:
> > > >>>>>> Integer getPartition() // would be null if unset or if "all
> > > >> partitions"
> > > >>>>>> boolean getAllLocalPartitions() // true/false if "all partitions"
> > > >>>> requested
> > > >>>>>>
> > > >>>>>> Sorry, I know I'm stirring the pot, but what do you think about
> > > >> this?
> > > >>>>>>
> > > >>>>>> Oh, also, the KIP is missing the method signature for the new
> > > >>>>>> KafkaStreams#store overload.
> > > >>>>>>
> > > >>>>>> Thanks!
> > > >>>>>> -John
> > > >>>>>>
> > > >>>>>> On Fri, Jan 17, 2020, at 08:07, Navinder Brar wrote:
> > > >>>>>>> Hi all,
> > > >>>>>>> I have created a new
> > > >>>>>>> KIP:
> > > >>>>>>
> > > >>>>
> > > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-562%3A+Allow+fetching+a+key+from+a+single+partition+rather+than+iterating+over+all+the+stores+on+an+instance
> > > >>>>>>> Please take a look if you get a chance.
> > > >>>>>>> ~Navinder
> > > >>>>>>
> > > >>>>>
> > > >>>>
> > > >>>
> > > >>>
> > > >>>
> > > >>
> > > >>
> > > >>
> > > > 
> > >

Reply via email to