bq. provides a hybrd solution Typo in hybrid.
bq. accessing read-only keys within XXXValues operators It would be nice if you can name some Value operator as examples. <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer, final Aggregator<? super K, ? super V, VR> adder, The adder doesn't need to be RichAggregator ? public RecordContext recordContext() { return this.recordContext(); Can you explain a bit about the above implementation ? void commit () { throw new UnsupportedOperationException("commit() is not supported in this context"); Is the exception going to be replaced with real code in the PR ? Cheers On Fri, Sep 22, 2017 at 9:28 AM, Jeyhun Karimov <je.kari...@gmail.com> wrote: > Dear community, > > I updated the related KIP [1]. Please feel free to comment. > > Cheers, > Jeyhun > > [1] > https://cwiki.apache.org/confluence/display/KAFKA/KIP- > 159%3A+Introducing+Rich+functions+to+Streams > > > > > On Fri, Sep 22, 2017 at 12:20 AM Jeyhun Karimov <je.kari...@gmail.com> > wrote: > > > Hi Damian, > > > > Thanks for the update. I working on it and will provide an update soon. > > > > Cheers, > > Jeyhun > > > > On Thu, Sep 21, 2017 at 4:50 PM Damian Guy <damian....@gmail.com> wrote: > > > >> Hi Jeyhun, > >> > >> All KIP-182 API PRs have now been merged. So you can consider it as > >> stable. > >> Thanks, > >> Damian > >> > >> On Thu, 21 Sep 2017 at 15:23 Jeyhun Karimov <je.kari...@gmail.com> > wrote: > >> > >> > Hi all, > >> > > >> > Thanks a lot for your comments. For the single interface (RichXXX and > >> > XXXWithKey) solution, I have already submitted a PR but probably it is > >> > outdated (when the KIP first proposed), I need to revisit that one. > >> > > >> > @Guozhang, from our (offline) discussion, I understood that we may not > >> make > >> > it merge this KIP into the upcoming release, as KIP-159 is not voted > yet > >> > (because we want both KIP-149 and KIP-159 to be as an "atomic" merge). > >> So > >> > I decided to wait until KIP-182 gets stable (there are some minor > >> updates > >> > AFAIK) and update the KIP accordingly. Please correct me if I am wrong > >> or I > >> > misunderstood. > >> > > >> > Cheers, > >> > Jeyhun > >> > > >> > > >> > On Thu, Sep 21, 2017 at 4:11 PM Damian Guy <damian....@gmail.com> > >> wrote: > >> > > >> > > +1 > >> > > > >> > > On Thu, 21 Sep 2017 at 13:46 Guozhang Wang <wangg...@gmail.com> > >> wrote: > >> > > > >> > > > +1 for me as well for collapsing. > >> > > > > >> > > > Jeyhun, could you update the wiki accordingly to show what's the > >> final > >> > > > updates post KIP-182 that needs to be done in KIP-159 including > >> > KIP-149? > >> > > > The child page I made is just a suggestion, but you would still > >> need to > >> > > > update your proposal for people to comment and vote on. > >> > > > > >> > > > > >> > > > Guozhang > >> > > > > >> > > > > >> > > > On Thu, Sep 14, 2017 at 10:37 PM, Ted Yu <yuzhih...@gmail.com> > >> wrote: > >> > > > > >> > > > > +1 > >> > > > > > >> > > > > One interface is cleaner. > >> > > > > > >> > > > > On Thu, Sep 14, 2017 at 7:26 AM, Bill Bejeck <bbej...@gmail.com > > > >> > > wrote: > >> > > > > > >> > > > > > +1 for me on collapsing the RichXXXX and ValueXXXXWithKey > >> > interfaces > >> > > > > into 1 > >> > > > > > interface. > >> > > > > > > >> > > > > > Thanks, > >> > > > > > Bill > >> > > > > > > >> > > > > > On Wed, Sep 13, 2017 at 11:31 AM, Jeyhun Karimov < > >> > > je.kari...@gmail.com > >> > > > > > >> > > > > > wrote: > >> > > > > > > >> > > > > > > Hi Damian, > >> > > > > > > > >> > > > > > > Thanks for your feedback. Actually, this (what you propose) > >> was > >> > the > >> > > > > first > >> > > > > > > idea of KIP-149. Then we decided to divide it into two > KIPs. I > >> > also > >> > > > > > > expressed my opinion that keeping the two interfaces (Rich > and > >> > > > withKey) > >> > > > > > > separate would add more overloads. So, email discussion > >> resulted > >> > > that > >> > > > > > this > >> > > > > > > would not be a problem. > >> > > > > > > > >> > > > > > > Our initial idea was similar to : > >> > > > > > > > >> > > > > > > public abstract class RichValueMapper<K, V, VR> implements > >> > > > > > > ValueMapperWithKey<K, V, VR>, RichFunction { > >> > > > > > > ...... > >> > > > > > > } > >> > > > > > > > >> > > > > > > > >> > > > > > > So, we check the type of object, whether it is RichXXX or > >> > > XXXWithKey > >> > > > > > inside > >> > > > > > > the called method and continue accordingly. > >> > > > > > > > >> > > > > > > If this is ok with the community, I would like to revert the > >> > > current > >> > > > > > design > >> > > > > > > to this again. > >> > > > > > > > >> > > > > > > Cheers, > >> > > > > > > Jeyhun > >> > > > > > > > >> > > > > > > On Wed, Sep 13, 2017 at 3:02 PM Damian Guy < > >> damian....@gmail.com > >> > > > >> > > > > wrote: > >> > > > > > > > >> > > > > > > > Hi Jeyhun, > >> > > > > > > > > >> > > > > > > > Thanks for sending out the update. I guess i was thinking > >> more > >> > > > along > >> > > > > > the > >> > > > > > > > lines of option 2 where we collapse the RichXXXX and > >> > > > ValueXXXXWithKey > >> > > > > > etc > >> > > > > > > > interfaces into 1 interface that has all of the > arguments. I > >> > > think > >> > > > we > >> > > > > > > then > >> > > > > > > > only need to add one additional overload for each > operator? > >> > > > > > > > > >> > > > > > > > Thanks, > >> > > > > > > > Damian > >> > > > > > > > > >> > > > > > > > On Wed, 13 Sep 2017 at 10:59 Jeyhun Karimov < > >> > > je.kari...@gmail.com> > >> > > > > > > wrote: > >> > > > > > > > > >> > > > > > > > > Dear all, > >> > > > > > > > > > >> > > > > > > > > I would like to resume the discussion on KIP-159. I (and > >> > > > Guozhang) > >> > > > > > > think > >> > > > > > > > > that releasing KIP-149 and KIP-159 in the same release > >> would > >> > > make > >> > > > > > sense > >> > > > > > > > to > >> > > > > > > > > avoid a release with "partial" public APIs. There is a > KIP > >> > [1] > >> > > > > > proposed > >> > > > > > > > by > >> > > > > > > > > Guozhang (and approved by me) to unify both KIPs. > >> > > > > > > > > Please feel free to comment on this. > >> > > > > > > > > > >> > > > > > > > > [1] > >> > > > > > > > > > >> > > > > > > > https://cwiki.apache.org/confluence/pages/viewpage. > >> > > > > > > action?pageId=73637757 > >> > > > > > > > > > >> > > > > > > > > Cheers, > >> > > > > > > > > Jeyhun > >> > > > > > > > > > >> > > > > > > > > On Fri, Jul 21, 2017 at 2:00 AM Jeyhun Karimov < > >> > > > > je.kari...@gmail.com > >> > > > > > > > >> > > > > > > > > wrote: > >> > > > > > > > > > >> > > > > > > > > > Hi Matthias, Damian, all, > >> > > > > > > > > > > >> > > > > > > > > > Thanks for your comments and sorry for super-late > >> update. > >> > > > > > > > > > > >> > > > > > > > > > Sure, the DSL refactoring is not blocking for this > KIP. > >> > > > > > > > > > I made some changes to KIP document based on my > >> prototype. > >> > > > > > > > > > > >> > > > > > > > > > Please feel free to comment. > >> > > > > > > > > > > >> > > > > > > > > > Cheers, > >> > > > > > > > > > Jeyhun > >> > > > > > > > > > > >> > > > > > > > > > On Fri, Jul 7, 2017 at 9:35 PM Matthias J. Sax < > >> > > > > > > matth...@confluent.io> > >> > > > > > > > > > wrote: > >> > > > > > > > > > > >> > > > > > > > > >> I would not block this KIP with regard to DSL > >> refactoring. > >> > > > IMHO, > >> > > > > > we > >> > > > > > > > can > >> > > > > > > > > >> just finish this one and the DSL refactoring will > help > >> > later > >> > > > on > >> > > > > to > >> > > > > > > > > >> reduce the number of overloads. > >> > > > > > > > > >> > >> > > > > > > > > >> -Matthias > >> > > > > > > > > >> > >> > > > > > > > > >> On 7/7/17 5:28 AM, Jeyhun Karimov wrote: > >> > > > > > > > > >> > I am following the related thread in the mailing > list > >> > and > >> > > > > > looking > >> > > > > > > > > >> forward > >> > > > > > > > > >> > for one-shot solution for overloads issue. > >> > > > > > > > > >> > > >> > > > > > > > > >> > Cheers, > >> > > > > > > > > >> > Jeyhun > >> > > > > > > > > >> > > >> > > > > > > > > >> > On Fri, Jul 7, 2017 at 10:32 AM Damian Guy < > >> > > > > > damian....@gmail.com> > >> > > > > > > > > >> wrote: > >> > > > > > > > > >> > > >> > > > > > > > > >> >> Hi Jeyhun, > >> > > > > > > > > >> >> > >> > > > > > > > > >> >> About overrides, what other alternatives do we > have? > >> > For > >> > > > > > > > > >> >>> backwards-compatibility we have to add extra > >> methods > >> > to > >> > > > the > >> > > > > > > > existing > >> > > > > > > > > >> >> ones. > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >> It wasn't clear to me in the KIP if these are new > >> > methods > >> > > > or > >> > > > > > > > > replacing > >> > > > > > > > > >> >> existing ones. > >> > > > > > > > > >> >> Also, we are currently discussing options for > >> replacing > >> > > the > >> > > > > > > > > overrides. > >> > > > > > > > > >> >> > >> > > > > > > > > >> >> Thanks, > >> > > > > > > > > >> >> Damian > >> > > > > > > > > >> >> > >> > > > > > > > > >> >> > >> > > > > > > > > >> >>> About ProcessorContext vs RecordContext, you are > >> > right. > >> > > I > >> > > > > > think > >> > > > > > > I > >> > > > > > > > > >> need to > >> > > > > > > > > >> >>> implement a prototype to understand the full > >> picture > >> > as > >> > > > some > >> > > > > > > parts > >> > > > > > > > > of > >> > > > > > > > > >> the > >> > > > > > > > > >> >>> KIP might not be as straightforward as I thought. > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>> Cheers, > >> > > > > > > > > >> >>> Jeyhun > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>> On Wed, Jul 5, 2017 at 10:40 AM Damian Guy < > >> > > > > > > damian....@gmail.com> > >> > > > > > > > > >> wrote: > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>>> HI Jeyhun, > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>> Is the intention that these methods are new > >> overloads > >> > > on > >> > > > > the > >> > > > > > > > > KStream, > >> > > > > > > > > >> >>>> KTable, etc? > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>> It is worth noting that a ProcessorContext is > not > >> a > >> > > > > > > > RecordContext. > >> > > > > > > > > A > >> > > > > > > > > >> >>>> RecordContext, as it stands, only exists during > >> the > >> > > > > > processing > >> > > > > > > > of a > >> > > > > > > > > >> >>> single > >> > > > > > > > > >> >>>> record. Whereas the ProcessorContext exists for > >> the > >> > > > > lifetime > >> > > > > > of > >> > > > > > > > the > >> > > > > > > > > >> >>>> Processor. Sot it doesn't make sense to cast a > >> > > > > > ProcessorContext > >> > > > > > > > to > >> > > > > > > > > a > >> > > > > > > > > >> >>>> RecordContext. > >> > > > > > > > > >> >>>> You mentioned above passing the > >> > > InternalProcessorContext > >> > > > to > >> > > > > > the > >> > > > > > > > > >> init() > >> > > > > > > > > >> >>>> calls. It is internal for a reason and i think > it > >> > > should > >> > > > > > remain > >> > > > > > > > > that > >> > > > > > > > > >> >> way. > >> > > > > > > > > >> >>>> It might be better to move the recordContext() > >> method > >> > > > from > >> > > > > > > > > >> >>>> InternalProcessorContext to ProcessorContext. > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>> In the KIP you have an example showing: > >> > > > > > > > > >> >>>> richMapper.init((RecordContext) > processorContext); > >> > > > > > > > > >> >>>> But the interface is: > >> > > > > > > > > >> >>>> public interface RichValueMapper<V, VR> { > >> > > > > > > > > >> >>>> VR apply(final V value, final RecordContext > >> > > > > > recordContext); > >> > > > > > > > > >> >>>> } > >> > > > > > > > > >> >>>> i.e., there is no init(...), besides as above > this > >> > > > wouldn't > >> > > > > > > make > >> > > > > > > > > >> sense. > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>> Thanks, > >> > > > > > > > > >> >>>> Damian > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>> On Tue, 4 Jul 2017 at 23:30 Jeyhun Karimov < > >> > > > > > > je.kari...@gmail.com > >> > > > > > > > > > >> > > > > > > > > >> >> wrote: > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>>>> Hi Matthias, > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>> Actually my intend was to provide to > >> RichInitializer > >> > > and > >> > > > > > later > >> > > > > > > > on > >> > > > > > > > > we > >> > > > > > > > > >> >>>> could > >> > > > > > > > > >> >>>>> provide the context of the record as you also > >> > > mentioned. > >> > > > > > > > > >> >>>>> I remove that not to confuse the users. > >> > > > > > > > > >> >>>>> Regarding the RecordContext and > ProcessorContext > >> > > > > > interfaces, I > >> > > > > > > > > just > >> > > > > > > > > >> >>>>> realized the InternalProcessorContext class. > >> Can't > >> > we > >> > > > pass > >> > > > > > > this > >> > > > > > > > > as a > >> > > > > > > > > >> >>>>> parameter to init() method of processors? Then > we > >> > > would > >> > > > be > >> > > > > > > able > >> > > > > > > > to > >> > > > > > > > > >> >> get > >> > > > > > > > > >> >>>>> RecordContext easily with just a method call. > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>> Cheers, > >> > > > > > > > > >> >>>>> Jeyhun > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>> On Thu, Jun 29, 2017 at 10:14 PM Matthias J. > Sax > >> < > >> > > > > > > > > >> >>> matth...@confluent.io> > >> > > > > > > > > >> >>>>> wrote: > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>>> One more thing: > >> > > > > > > > > >> >>>>>> > >> > > > > > > > > >> >>>>>> I don't think `RichInitializer` does make > >> sense. As > >> > > we > >> > > > > > don't > >> > > > > > > > have > >> > > > > > > > > >> >> any > >> > > > > > > > > >> >>>>>> input record, there is also no context. We > >> could of > >> > > > > course > >> > > > > > > > > provide > >> > > > > > > > > >> >>> the > >> > > > > > > > > >> >>>>>> context of the record that triggers the init > >> call, > >> > > but > >> > > > > this > >> > > > > > > > seems > >> > > > > > > > > >> >> to > >> > > > > > > > > >> >>> be > >> > > > > > > > > >> >>>>>> semantically questionable. Also, the context > for > >> > this > >> > > > > first > >> > > > > > > > > record > >> > > > > > > > > >> >>> will > >> > > > > > > > > >> >>>>>> be provided by the consecutive call to > aggregate > >> > > > anyways. > >> > > > > > > > > >> >>>>>> > >> > > > > > > > > >> >>>>>> > >> > > > > > > > > >> >>>>>> -Matthias > >> > > > > > > > > >> >>>>>> > >> > > > > > > > > >> >>>>>> On 6/29/17 1:11 PM, Matthias J. Sax wrote: > >> > > > > > > > > >> >>>>>>> Thanks for updating the KIP. > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> I have one concern with regard to backward > >> > > > > compatibility. > >> > > > > > > You > >> > > > > > > > > >> >>> suggest > >> > > > > > > > > >> >>>>> to > >> > > > > > > > > >> >>>>>>> use RecrodContext as base interface for > >> > > > > ProcessorContext. > >> > > > > > > This > >> > > > > > > > > >> >> will > >> > > > > > > > > >> >>>>>>> break compatibility. > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> I think, we should just have two independent > >> > > > interfaces. > >> > > > > > Our > >> > > > > > > > own > >> > > > > > > > > >> >>>>>>> ProcessorContextImpl class would implement > >> both. > >> > > This > >> > > > > > allows > >> > > > > > > > us > >> > > > > > > > > >> >> to > >> > > > > > > > > >> >>>> cast > >> > > > > > > > > >> >>>>>>> it to `RecordContext` and thus limit the > >> visible > >> > > > scope. > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> -Matthias > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>>> On 6/27/17 1:35 PM, Jeyhun Karimov wrote: > >> > > > > > > > > >> >>>>>>>> Hi all, > >> > > > > > > > > >> >>>>>>>> > >> > > > > > > > > >> >>>>>>>> I updated the KIP w.r.t. discussion and > >> comments. > >> > > > > > > > > >> >>>>>>>> Basically I eliminated overloads for > >> particular > >> > > > method > >> > > > > if > >> > > > > > > > they > >> > > > > > > > > >> >> are > >> > > > > > > > > >> >>>>> more > >> > > > > > > > > >> >>>>>>>> than 3. > >> > > > > > > > > >> >>>>>>>> As we can see there are a lot of overloads > >> (and > >> > > more > >> > > > > will > >> > > > > > > > come > >> > > > > > > > > >> >>> with > >> > > > > > > > > >> >>>>>> KIP-149 > >> > > > > > > > > >> >>>>>>>> :) ) > >> > > > > > > > > >> >>>>>>>> So, is it wise to > >> > > > > > > > > >> >>>>>>>> wait the result of constructive DSL thread > or > >> > > > > > > > > >> >>>>>>>> extend KIP to address this issue as well or > >> > > > > > > > > >> >>>>>>>> continue as it is? > >> > > > > > > > > >> >>>>>>>> > >> > > > > > > > > >> >>>>>>>> Cheers, > >> > > > > > > > > >> >>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>> > >> > > > > > > > > >> >>>>>>>> On Wed, Jun 14, 2017 at 11:29 PM Guozhang > >> Wang < > >> > > > > > > > > >> >>> wangg...@gmail.com> > >> > > > > > > > > >> >>>>>> wrote: > >> > > > > > > > > >> >>>>>>>> > >> > > > > > > > > >> >>>>>>>>> LGTM. Thanks! > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> Guozhang > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> On Tue, Jun 13, 2017 at 2:20 PM, Jeyhun > >> Karimov > >> > < > >> > > > > > > > > >> >>>>> je.kari...@gmail.com> > >> > > > > > > > > >> >>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> Thanks for the comment Matthias. After all > >> the > >> > > > > > discussion > >> > > > > > > > > >> >>> (thanks > >> > > > > > > > > >> >>>> to > >> > > > > > > > > >> >>>>>> all > >> > > > > > > > > >> >>>>>>>>>> participants), I think this (single method > >> that > >> > > > > passes > >> > > > > > > in a > >> > > > > > > > > >> >>>>>> RecordContext > >> > > > > > > > > >> >>>>>>>>>> object) is the best alternative. > >> > > > > > > > > >> >>>>>>>>>> Just a side note: I think KAFKA-3907 [1] > can > >> > also > >> > > > be > >> > > > > > > > > >> >> integrated > >> > > > > > > > > >> >>>> into > >> > > > > > > > > >> >>>>>> the > >> > > > > > > > > >> >>>>>>>>>> KIP by adding related method inside > >> > RecordContext > >> > > > > > > > interface. > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> [1] > >> > > > https://issues.apache.org/jira/browse/KAFKA-3907 > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> Cheers, > >> > > > > > > > > >> >>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> On Tue, Jun 13, 2017 at 7:50 PM Matthias > J. > >> > Sax < > >> > > > > > > > > >> >>>>>> matth...@confluent.io> > >> > > > > > > > > >> >>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> Hi, > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> I would like to push this discussion > >> further. > >> > It > >> > > > > seems > >> > > > > > > we > >> > > > > > > > > got > >> > > > > > > > > >> >>>> nice > >> > > > > > > > > >> >>>>>>>>>>> alternatives (thanks for the summary > >> Jeyhun!). > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> With respect to RichFunctions and > allowing > >> > them > >> > > to > >> > > > > be > >> > > > > > > > > >> >>> stateful, I > >> > > > > > > > > >> >>>>>> have > >> > > > > > > > > >> >>>>>>>>>>> my doubt as expressed already. From my > >> > > > > understanding, > >> > > > > > > the > >> > > > > > > > > >> >> idea > >> > > > > > > > > >> >>>> was > >> > > > > > > > > >> >>>>> to > >> > > > > > > > > >> >>>>>>>>>>> give access to record metadata > information > >> > only. > >> > > > If > >> > > > > > you > >> > > > > > > > want > >> > > > > > > > > >> >> to > >> > > > > > > > > >> >>>> do > >> > > > > > > > > >> >>>>> a > >> > > > > > > > > >> >>>>>>>>>>> stateful computation you should rather > use > >> > > > > > #transform(). > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> Furthermore, as pointed out, we would > need > >> to > >> > > > switch > >> > > > > > to > >> > > > > > > a > >> > > > > > > > > >> >>>>>>>>>>> supplier-pattern introducing many more > >> > > overloads. > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> For those reason, I advocate for a simple > >> > > > interface > >> > > > > > > with a > >> > > > > > > > > >> >>> single > >> > > > > > > > > >> >>>>>>>>> method > >> > > > > > > > > >> >>>>>>>>>>> that passes in a RecordContext object. > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> -Matthias > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> On 6/6/17 5:15 PM, Guozhang Wang wrote: > >> > > > > > > > > >> >>>>>>>>>>>> Thanks for the comprehensive summary! > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> Personally I'd prefer the option of > >> passing > >> > > > > > > RecordContext > >> > > > > > > > > as > >> > > > > > > > > >> >>> an > >> > > > > > > > > >> >>>>>>>>>>> additional > >> > > > > > > > > >> >>>>>>>>>>>> parameter into he overloaded function. > But > >> > I'm > >> > > > also > >> > > > > > > open > >> > > > > > > > to > >> > > > > > > > > >> >>>> other > >> > > > > > > > > >> >>>>>>>>>>> arguments > >> > > > > > > > > >> >>>>>>>>>>>> if there are sth. that I have > overlooked. > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> Guozhang > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> On Mon, Jun 5, 2017 at 3:19 PM, Jeyhun > >> > Karimov > >> > > < > >> > > > > > > > > >> >>>>>> je.kari...@gmail.com > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> Hi, > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> Thanks for your comments Matthias and > >> > > Guozhang. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> Below I mention the quick summary of > the > >> > main > >> > > > > > > > alternatives > >> > > > > > > > > >> >> we > >> > > > > > > > > >> >>>>>> looked > >> > > > > > > > > >> >>>>>>>>>> at > >> > > > > > > > > >> >>>>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>>>> introduce the Rich functions (I will > >> refer > >> > to > >> > > it > >> > > > > as > >> > > > > > > Rich > >> > > > > > > > > >> >>>>> functions > >> > > > > > > > > >> >>>>>>>>>>> until we > >> > > > > > > > > >> >>>>>>>>>>>>> find better/another name). Initially > the > >> > > > proposed > >> > > > > > > > > >> >>> alternatives > >> > > > > > > > > >> >>>>> was > >> > > > > > > > > >> >>>>>>>>> not > >> > > > > > > > > >> >>>>>>>>>>>>> backwards-compatible, so I will not > >> mention > >> > > > them. > >> > > > > > > > > >> >>>>>>>>>>>>> The related discussions are spread in > >> > KIP-149 > >> > > > and > >> > > > > in > >> > > > > > > > this > >> > > > > > > > > >> >> KIP > >> > > > > > > > > >> >>>>>>>>>> (KIP-159) > >> > > > > > > > > >> >>>>>>>>>>>>> discussion threads. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> 1. The idea of rich functions came into > >> the > >> > > > stage > >> > > > > > with > >> > > > > > > > > >> >>> KIP-149, > >> > > > > > > > > >> >>>>> in > >> > > > > > > > > >> >>>>>>>>>>>>> discussion thread. As a result we > >> extended > >> > > > KIP-149 > >> > > > > > to > >> > > > > > > > > >> >> support > >> > > > > > > > > >> >>>>> Rich > >> > > > > > > > > >> >>>>>>>>>>>>> functions as well. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> 2. To as part of the Rich functions, > we > >> > > > provided > >> > > > > > init > >> > > > > > > > > >> >>>>>>>>>>> (ProcessorContext) > >> > > > > > > > > >> >>>>>>>>>>>>> method. Afterwards, Dammian suggested > >> that > >> > we > >> > > > > should > >> > > > > > > not > >> > > > > > > > > >> >>>> provide > >> > > > > > > > > >> >>>>>>>>>>>>> ProcessorContext to users. As a result, > >> we > >> > > > > separated > >> > > > > > > the > >> > > > > > > > > >> >> two > >> > > > > > > > > >> >>>>>>>>> problems > >> > > > > > > > > >> >>>>>>>>>>> into > >> > > > > > > > > >> >>>>>>>>>>>>> two separate KIPs, as it seems they can > >> be > >> > > > solved > >> > > > > in > >> > > > > > > > > >> >>> parallel. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> - One approach we considered was : > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> public interface ValueMapperWithKey<K, > V, > >> > VR> > >> > > { > >> > > > > > > > > >> >>>>>>>>>>>>> VR apply(final K key, final V > value); > >> > > > > > > > > >> >>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> public interface RichValueMapper<K, V, > >> VR> > >> > > > extends > >> > > > > > > > > >> >>>> RichFunction{ > >> > > > > > > > > >> >>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> public interface RichFunction { > >> > > > > > > > > >> >>>>>>>>>>>>> void init(RecordContext > >> recordContext); > >> > > > > > > > > >> >>>>>>>>>>>>> void close(); > >> > > > > > > > > >> >>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> public interface RecordContext { > >> > > > > > > > > >> >>>>>>>>>>>>> String applicationId(); > >> > > > > > > > > >> >>>>>>>>>>>>> TaskId taskId(); > >> > > > > > > > > >> >>>>>>>>>>>>> StreamsMetrics metrics(); > >> > > > > > > > > >> >>>>>>>>>>>>> String topic(); > >> > > > > > > > > >> >>>>>>>>>>>>> int partition(); > >> > > > > > > > > >> >>>>>>>>>>>>> long offset(); > >> > > > > > > > > >> >>>>>>>>>>>>> long timestamp(); > >> > > > > > > > > >> >>>>>>>>>>>>> Map<String, Object> appConfigs(); > >> > > > > > > > > >> >>>>>>>>>>>>> Map<String, Object> > >> > > > > appConfigsWithPrefix(String > >> > > > > > > > > >> >> prefix); > >> > > > > > > > > >> >>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> public interface ProcessorContext > extends > >> > > > > > > RecordContext > >> > > > > > > > { > >> > > > > > > > > >> >>>>>>>>>>>>> // all methods but the ones in > >> > > RecordContext > >> > > > > > > > > >> >>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> As a result: > >> > > > > > > > > >> >>>>>>>>>>>>> * . All "withKey" and "withoutKey" > >> > interfaces > >> > > > can > >> > > > > be > >> > > > > > > > > >> >>> converted > >> > > > > > > > > >> >>>> to > >> > > > > > > > > >> >>>>>>>>>> their > >> > > > > > > > > >> >>>>>>>>>>>>> Rich counterparts (with empty init() > and > >> > > close() > >> > > > > > > > methods) > >> > > > > > > > > >> >>>>>>>>>>>>> *. All related Processors will accept > >> Rich > >> > > > > > interfaces > >> > > > > > > in > >> > > > > > > > > >> >>> their > >> > > > > > > > > >> >>>>>>>>>>>>> constructors. > >> > > > > > > > > >> >>>>>>>>>>>>> *. So, we convert the related "withKey" > >> or > >> > > > > > > "withoutKey" > >> > > > > > > > > >> >>>>> interfaces > >> > > > > > > > > >> >>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>> Rich > >> > > > > > > > > >> >>>>>>>>>>>>> interface while building the topology > and > >> > > > > initialize > >> > > > > > > the > >> > > > > > > > > >> >>>> related > >> > > > > > > > > >> >>>>>>>>>>> processors > >> > > > > > > > > >> >>>>>>>>>>>>> with Rich interfaces only. > >> > > > > > > > > >> >>>>>>>>>>>>> *. We will not need to overloaded > methods > >> > for > >> > > > rich > >> > > > > > > > > >> >> functions > >> > > > > > > > > >> >>> as > >> > > > > > > > > >> >>>>>> Rich > >> > > > > > > > > >> >>>>>>>>>>>>> interfaces extend withKey interfaces. > We > >> > will > >> > > > just > >> > > > > > > check > >> > > > > > > > > >> >> the > >> > > > > > > > > >> >>>>> object > >> > > > > > > > > >> >>>>>>>>>> type > >> > > > > > > > > >> >>>>>>>>>>>>> and act accordingly. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> 3. There was some thoughts that the > above > >> > > > approach > >> > > > > > > does > >> > > > > > > > > not > >> > > > > > > > > >> >>>>> support > >> > > > > > > > > >> >>>>>>>>>>> lambdas > >> > > > > > > > > >> >>>>>>>>>>>>> so we should support only one method, > >> only > >> > > > > > > > > >> >>> init(RecordContext), > >> > > > > > > > > >> >>>>> as > >> > > > > > > > > >> >>>>>>>>>> part > >> > > > > > > > > >> >>>>>>>>>>> of > >> > > > > > > > > >> >>>>>>>>>>>>> Rich interfaces. > >> > > > > > > > > >> >>>>>>>>>>>>> This is still in discussion. > Personally I > >> > > think > >> > > > > Rich > >> > > > > > > > > >> >>> interfaces > >> > > > > > > > > >> >>>>> are > >> > > > > > > > > >> >>>>>>>>> by > >> > > > > > > > > >> >>>>>>>>>>>>> definition lambda-free and we should > not > >> > care > >> > > > much > >> > > > > > > about > >> > > > > > > > > >> >> it. > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> 4. Thanks to Matthias's discussion, an > >> > > > alternative > >> > > > > > we > >> > > > > > > > > >> >>>> considered > >> > > > > > > > > >> >>>>>> was > >> > > > > > > > > >> >>>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>>>> pass in the RecordContext as method > >> > parameter. > >> > > > > This > >> > > > > > > > might > >> > > > > > > > > >> >>> even > >> > > > > > > > > >> >>>>>>>>> allow > >> > > > > > > > > >> >>>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>>>> use Lambdas and we could keep the name > >> > > > > RichFunction > >> > > > > > as > >> > > > > > > > we > >> > > > > > > > > >> >>>>> preserve > >> > > > > > > > > >> >>>>>>>>> the > >> > > > > > > > > >> >>>>>>>>>>>>> nature of being a function. > >> > > > > > > > > >> >>>>>>>>>>>>> "If you go with `init()` and `close()` > we > >> > > > > basically > >> > > > > > > > > >> >>>>>>>>>>>>> allow users to have an in-memory state > >> for a > >> > > > > > function. > >> > > > > > > > > >> >> Thus, > >> > > > > > > > > >> >>> we > >> > > > > > > > > >> >>>>>>>>> cannot > >> > > > > > > > > >> >>>>>>>>>>>>> share a single instance of > >> RichValueMapper > >> > > (etc) > >> > > > > > over > >> > > > > > > > > >> >>> multiple > >> > > > > > > > > >> >>>>>> tasks > >> > > > > > > > > >> >>>>>>>>>> and > >> > > > > > > > > >> >>>>>>>>>>>>> we would need a supplier pattern > similar > >> to > >> > > > > > > > #transform(). > >> > > > > > > > > >> >> And > >> > > > > > > > > >> >>>>> this > >> > > > > > > > > >> >>>>>>>>>> would > >> > > > > > > > > >> >>>>>>>>>>>>> "break the flow" of the API, as > >> > > > > > > > (Rich)ValueMapperSupplier > >> > > > > > > > > >> >>> would > >> > > > > > > > > >> >>>>> not > >> > > > > > > > > >> >>>>>>>>>>>>> inherit from ValueMapper and thus we > >> would > >> > > need > >> > > > > many > >> > > > > > > new > >> > > > > > > > > >> >>>> overload > >> > > > > > > > > >> >>>>>>>>> for > >> > > > > > > > > >> >>>>>>>>>>>>> KStream/KTable classes". (Copy paste > from > >> > > > > Matthias's > >> > > > > > > > > email) > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> Cheers, > >> > > > > > > > > >> >>>>>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> On Mon, Jun 5, 2017 at 5:18 AM Matthias > >> J. > >> > > Sax < > >> > > > > > > > > >> >>>>>>>>> matth...@confluent.io > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> Yes, we did consider this, and there > is > >> no > >> > > > > > consensus > >> > > > > > > > yet > >> > > > > > > > > >> >>> what > >> > > > > > > > > >> >>>>> the > >> > > > > > > > > >> >>>>>>>>>> best > >> > > > > > > > > >> >>>>>>>>>>>>>> alternative is. > >> > > > > > > > > >> >>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> @Jeyhun: the email thread got pretty > >> long. > >> > > > Maybe > >> > > > > > you > >> > > > > > > > can > >> > > > > > > > > >> >>> give > >> > > > > > > > > >> >>>> a > >> > > > > > > > > >> >>>>>>>>> quick > >> > > > > > > > > >> >>>>>>>>>>>>>> summary of the current state of the > >> > > discussion? > >> > > > > > > > > >> >>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> -Matthias > >> > > > > > > > > >> >>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> On 6/4/17 6:04 PM, Guozhang Wang > wrote: > >> > > > > > > > > >> >>>>>>>>>>>>>>> Thanks for the explanation Jeyhun and > >> > > > Matthias. > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> I have just read through both KIP-149 > >> and > >> > > > > KIP-159 > >> > > > > > > and > >> > > > > > > > am > >> > > > > > > > > >> >>>>>> wondering > >> > > > > > > > > >> >>>>>>>>>> if > >> > > > > > > > > >> >>>>>>>>>>>>> you > >> > > > > > > > > >> >>>>>>>>>>>>>>> guys have considered a slight > different > >> > > > approach > >> > > > > > for > >> > > > > > > > > rich > >> > > > > > > > > >> >>>>>>>>> function, > >> > > > > > > > > >> >>>>>>>>>>>>> that > >> > > > > > > > > >> >>>>>>>>>>>>>> is > >> > > > > > > > > >> >>>>>>>>>>>>>>> to add the `RecordContext` into the > >> apply > >> > > > > > functions > >> > > > > > > as > >> > > > > > > > > an > >> > > > > > > > > >> >>>>>>>>> additional > >> > > > > > > > > >> >>>>>>>>>>>>>>> parameter. For example: > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> --------------------------- > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> interface RichValueMapper<V, VR> { > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> VR apply(final V value, final > >> > RecordContext > >> > > > > > > context); > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> } > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> ... > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> // then in KStreams > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> <VR> KStream<K, VR> > >> > mapValues(ValueMapper<? > >> > > > > super > >> > > > > > > V, ? > >> > > > > > > > > >> >>>> extends > >> > > > > > > > > >> >>>>>> VR> > >> > > > > > > > > >> >>>>>>>>>>>>>> mapper); > >> > > > > > > > > >> >>>>>>>>>>>>>>> <VR> KStream<K, VR> > >> > > > > > > > mapValueswithContext(RichValueMapper > >> > > > > > > > > >> >> <? > >> > > > > > > > > >> >>>>> super > >> > > > > > > > > >> >>>>>>>>>> V, ? > >> > > > > > > > > >> >>>>>>>>>>>>>>> extends VR> mapper); > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> ------------------------------- > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> The caveat is that it will introduces > >> more > >> > > > > > > overloads; > >> > > > > > > > > >> >> but I > >> > > > > > > > > >> >>>>> think > >> > > > > > > > > >> >>>>>>>>>> the > >> > > > > > > > > >> >>>>>>>>>>>>>>> #.overloads are mainly introduced by > 1) > >> > > serde > >> > > > > > > > overrides > >> > > > > > > > > >> >> and > >> > > > > > > > > >> >>>> 2) > >> > > > > > > > > >> >>>>>>>>>>>>>>> state-store-supplier overides, both > of > >> > which > >> > > > can > >> > > > > > be > >> > > > > > > > > >> >> reduced > >> > > > > > > > > >> >>>> in > >> > > > > > > > > >> >>>>>> the > >> > > > > > > > > >> >>>>>>>>>>> near > >> > > > > > > > > >> >>>>>>>>>>>>>>> future, and I felt this overloading > is > >> > still > >> > > > > > > > worthwhile, > >> > > > > > > > > >> >> as > >> > > > > > > > > >> >>>> it > >> > > > > > > > > >> >>>>>> has > >> > > > > > > > > >> >>>>>>>>>> the > >> > > > > > > > > >> >>>>>>>>>>>>>>> following benefits: > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> 1) still allow lambda expressions. > >> > > > > > > > > >> >>>>>>>>>>>>>>> 2) clearer code path (do not need to > >> > > "convert" > >> > > > > > from > >> > > > > > > > > >> >>> non-rich > >> > > > > > > > > >> >>>>>>>>>> functions > >> > > > > > > > > >> >>>>>>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>>>>>> rich functions) > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> Maybe this approach has already been > >> > > discussed > >> > > > > > and I > >> > > > > > > > may > >> > > > > > > > > >> >>> have > >> > > > > > > > > >> >>>>>>>>>>>>> overlooked > >> > > > > > > > > >> >>>>>>>>>>>>>> in > >> > > > > > > > > >> >>>>>>>>>>>>>>> the email thread; anyways, lmk. > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> Guozhang > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> On Thu, Jun 1, 2017 at 10:18 PM, > >> Matthias > >> > J. > >> > > > > Sax < > >> > > > > > > > > >> >>>>>>>>>>>>> matth...@confluent.io> > >> > > > > > > > > >> >>>>>>>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> I agree with Jeyhun. As already > >> mention, > >> > > the > >> > > > > > > overall > >> > > > > > > > > API > >> > > > > > > > > >> >>>>>>>>>> improvement > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ideas are overlapping and/or > >> > contradicting > >> > > > each > >> > > > > > > > other. > >> > > > > > > > > >> >> For > >> > > > > > > > > >> >>>>> this > >> > > > > > > > > >> >>>>>>>>>>>>> reason, > >> > > > > > > > > >> >>>>>>>>>>>>>>>> not all ideas can be accomplished > and > >> > some > >> > > > Jira > >> > > > > > > might > >> > > > > > > > > >> >> just > >> > > > > > > > > >> >>>> be > >> > > > > > > > > >> >>>>>>>>>> closed > >> > > > > > > > > >> >>>>>>>>>>>>> as > >> > > > > > > > > >> >>>>>>>>>>>>>>>> "won't fix". > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> For this reason, we try to do those > >> KIP > >> > > > > > discussion > >> > > > > > > > with > >> > > > > > > > > >> >>> are > >> > > > > > > > > >> >>>>>> large > >> > > > > > > > > >> >>>>>>>>>>>>> scope > >> > > > > > > > > >> >>>>>>>>>>>>>>>> to get an overall picture to > converge > >> to > >> > an > >> > > > > > overall > >> > > > > > > > > >> >>>> consisted > >> > > > > > > > > >> >>>>>>>>> API. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> @Jeyhun: about the overloads. Yes, > we > >> > might > >> > > > get > >> > > > > > > more > >> > > > > > > > > >> >>>> overload. > >> > > > > > > > > >> >>>>>> It > >> > > > > > > > > >> >>>>>>>>>>>>> might > >> > > > > > > > > >> >>>>>>>>>>>>>>>> be sufficient though, to do a single > >> > > > > > > xxxWithContext() > >> > > > > > > > > >> >>>> overload > >> > > > > > > > > >> >>>>>>>>> that > >> > > > > > > > > >> >>>>>>>>>>>>> will > >> > > > > > > > > >> >>>>>>>>>>>>>>>> provide key+value+context. > Otherwise, > >> if > >> > > > might > >> > > > > > get > >> > > > > > > > too > >> > > > > > > > > >> >>> messy > >> > > > > > > > > >> >>>>>>>>> having > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ValueMapper, ValueMapperWithKey, > >> > > > > > > > > ValueMapperWithContext, > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ValueMapperWithKeyWithContext. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On the other hand, we also have the > >> > > "builder > >> > > > > > > pattern" > >> > > > > > > > > >> >> idea > >> > > > > > > > > >> >>>> as > >> > > > > > > > > >> >>>>> an > >> > > > > > > > > >> >>>>>>>>>> API > >> > > > > > > > > >> >>>>>>>>>>>>>>>> change and this might mitigate the > >> > overload > >> > > > > > > problem. > >> > > > > > > > > Not > >> > > > > > > > > >> >>> for > >> > > > > > > > > >> >>>>>>>>> simple > >> > > > > > > > > >> >>>>>>>>>>>>>>>> function like map/flatMap etc but > for > >> > joins > >> > > > and > >> > > > > > > > > >> >>>> aggregations. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On the other hand, as I mentioned in > >> an > >> > > older > >> > > > > > > email, > >> > > > > > > > I > >> > > > > > > > > >> >> am > >> > > > > > > > > >> >>>>>>>>>> personally > >> > > > > > > > > >> >>>>>>>>>>>>>>>> fine to break the pure functional > >> > > interface, > >> > > > > and > >> > > > > > > add > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> - interface WithRecordContext with > >> > method > >> > > > > > > > > >> >>>>>> `open(RecordContext)` > >> > > > > > > > > >> >>>>>>>>>> (or > >> > > > > > > > > >> >>>>>>>>>>>>>>>> `init(...)`, or any better name) -- > >> but > >> > not > >> > > > > > > > `close()`) > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> - interface > >> > ValueMapperWithRecordContext > >> > > > > > extends > >> > > > > > > > > >> >>>>> ValueMapper, > >> > > > > > > > > >> >>>>>>>>>>>>>>>> WithRecordContext > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> This would allow us to avoid any > >> > overload. > >> > > Of > >> > > > > > > course, > >> > > > > > > > > we > >> > > > > > > > > >> >>>> don't > >> > > > > > > > > >> >>>>>>>>> get > >> > > > > > > > > >> >>>>>>>>>> a > >> > > > > > > > > >> >>>>>>>>>>>>>>>> "pure function" interface and also > >> > > sacrifices > >> > > > > > > > Lambdas. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> I am personally a little bit > undecided > >> > what > >> > > > the > >> > > > > > > > better > >> > > > > > > > > >> >>>> option > >> > > > > > > > > >> >>>>>>>>> might > >> > > > > > > > > >> >>>>>>>>>>>>> be. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> Curious to hear what other think > about > >> > this > >> > > > > trade > >> > > > > > > > off. > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> -Matthias > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On 6/1/17 6:13 PM, Jeyhun Karimov > >> wrote: > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> Hi Guozhang, > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> It subsumes partially. Initially > the > >> > idea > >> > > > was > >> > > > > to > >> > > > > > > > > >> >> support > >> > > > > > > > > >> >>>>>>>>>>>>> RichFunctions > >> > > > > > > > > >> >>>>>>>>>>>>>>>> as a > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> separate interface. Throughout the > >> > > > discussion, > >> > > > > > > > > however, > >> > > > > > > > > >> >>> we > >> > > > > > > > > >> >>>>>>>>>>> considered > >> > > > > > > > > >> >>>>>>>>>>>>>>>> maybe > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> overloading the related methods > (with > >> > > > > > RecodContext > >> > > > > > > > > >> >> param) > >> > > > > > > > > >> >>>> is > >> > > > > > > > > >> >>>>>>>>>> better > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> approach than providing a separate > >> > > > > RichFunction > >> > > > > > > > > >> >>> interface. > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> Cheers, > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> On Fri, Jun 2, 2017 at 2:27 AM > >> Guozhang > >> > > > Wang < > >> > > > > > > > > >> >>>>>>>>> wangg...@gmail.com> > >> > > > > > > > > >> >>>>>>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> Does this KIP subsume this ticket > as > >> > > well? > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> https://issues.apache.org/ > >> > > > > > jira/browse/KAFKA-4125 > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> On Sat, May 20, 2017 at 9:05 AM, > >> Jeyhun > >> > > > > > Karimov < > >> > > > > > > > > >> >>>>>>>>>>>>> je.kari...@gmail.com > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> wrote: > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Dear community, > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> As we discussed in KIP-149 > >> [DISCUSS] > >> > > > thread > >> > > > > > > [1], I > >> > > > > > > > > >> >>> would > >> > > > > > > > > >> >>>>> like > >> > > > > > > > > >> >>>>>>>>> to > >> > > > > > > > > >> >>>>>>>>>>>>>>>> initiate > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> KIP for rich functions > (interfaces) > >> > [2]. > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> I would like to get your > comments. > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> [1] > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>> > >> > > > http://search-hadoop.com/m/Kafka/uyzND1PMjdk2CslH12?subj= > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > Re+DISCUSS+KIP+149+Enabling+key+access+in+ > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ValueTransformer+ValueMapper+ > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> and+ValueJoiner > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> [2] > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >> > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP- > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> 159%3A+Introducing+Rich+ > >> > > > > functions+to+Streams > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Cheers, > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> -- > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> -Cheers > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> -- > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> -- Guozhang > >> > > > > > > > > >> >>>>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>>> -- > >> > > > > > > > > >> >>>>>>>>>>>>> -Cheers > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>>> -- > >> > > > > > > > > >> >>>>>>>>>> -Cheers > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>>> Jeyhun > >> > > > > > > > > >> >>>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>>>> -- > >> > > > > > > > > >> >>>>>>>>> -- Guozhang > >> > > > > > > > > >> >>>>>>>>> > >> > > > > > > > > >> >>>>>>> > >> > > > > > > > > >> >>>>>> > >> > > > > > > > > >> >>>>>> -- > >> > > > > > > > > >> >>>>> -Cheers > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>>> Jeyhun > >> > > > > > > > > >> >>>>> > >> > > > > > > > > >> >>>> > >> > > > > > > > > >> >>> -- > >> > > > > > > > > >> >>> -Cheers > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >>> Jeyhun > >> > > > > > > > > >> >>> > >> > > > > > > > > >> >> > >> > > > > > > > > >> > >> > > > > > > > > >> -- > >> > > > > > > > > > -Cheers > >> > > > > > > > > > > >> > > > > > > > > > Jeyhun > >> > > > > > > > > > > >> > > > > > > > > -- > >> > > > > > > > > -Cheers > >> > > > > > > > > > >> > > > > > > > > Jeyhun > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > -- > >> > > > > > > -Cheers > >> > > > > > > > >> > > > > > > Jeyhun > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > -- > >> > > > -- Guozhang > >> > > > > >> > > > >> > > >> > > >