Hi Matthias, It is probably my bad, the discussion was a bit long in this thread. I proposed the related issue in the related KIP discuss thread [1] and got an approval [2,3]. Maybe I misunderstood.
[1] http://search-hadoop.com/m/Kafka/uyzND19Asmg1GKKXT1?subj=Re+DISCUSS+KIP+159+Introducing+Rich+functions+to+Streams [2] http://search-hadoop.com/m/Kafka/uyzND1kpct22GKKXT1?subj=Re+DISCUSS+KIP+159+Introducing+Rich+functions+to+Streams [3] http://search-hadoop.com/m/Kafka/uyzND1G6TGIGKKXT1?subj=Re+DISCUSS+KIP+159+Introducing+Rich+functions+to+Streams On Mon, Oct 23, 2017 at 8:44 PM Matthias J. Sax <matth...@confluent.io> wrote: > Interesting. > > I thought that https://issues.apache.org/jira/browse/KAFKA-4125 is the > main motivation for this KIP :) > > I also think, that we should not expose the full ProcessorContext at DSL > level. > > Thus, overall I am not even sure if we should fix KAFKA-3907 at all. > Manual commits are something DSL users should not worry about -- and if > one really needs this, an advanced user can still insert a dummy > `transform` to request a commit from there. > > -Matthias > > > On 10/18/17 5:39 AM, Jeyhun Karimov wrote: > > Hi, > > > > The main intuition is to solve [1], which is part of this KIP. > > I agree with you that this might not seem semantically correct as we are > > not committing record state. > > Alternatively, we can remove commit() from RecordContext and add > > ProcessorContext (which has commit() method) as an extra argument to Rich > > methods: > > > > instead of > > public interface RichValueMapper<V, VR, K> { > > VR apply(final V value, > > final K key, > > final RecordContext recordContext); > > } > > > > we can adopt > > > > public interface RichValueMapper<V, VR, K> { > > VR apply(final V value, > > final K key, > > final RecordContext recordContext, > > final ProcessorContext processorContext); > > } > > > > > > However, in this case, a user can get confused as ProcessorContext and > > RecordContext share some methods with the same name. > > > > > > Cheers, > > Jeyhun > > > > > > [1] https://issues.apache.org/jira/browse/KAFKA-3907 > > > > > > On Tue, Oct 17, 2017 at 3:19 AM Guozhang Wang <wangg...@gmail.com> > wrote: > > > >> Regarding #6 above, I'm still not clear why we would need `commit()` in > >> both ProcessorContext and RecordContext, could you elaborate a bit more? > >> > >> To me `commit()` is really a processor context not a record context > >> logically: when you call that function, it means we would commit the > state > >> of the whole task up to this processed record, not only that single > record > >> itself. > >> > >> > >> Guozhang > >> > >> On Mon, Oct 16, 2017 at 9:19 AM, Jeyhun Karimov <je.kari...@gmail.com> > >> wrote: > >> > >>> Hi, > >>> > >>> Thanks for the feedback. > >>> > >>> > >>> 0. RichInitializer definition seems missing. > >>> > >>> > >>> > >>> - Fixed. > >>> > >>> > >>> I'd suggest moving the key parameter in the RichValueXX and > RichReducer > >>>> after the value parameters, as well as in the templates; e.g. > >>>> public interface RichValueJoiner<V1, V2, VR, K> { > >>>> VR apply(final V1 value1, final V2 value2, final K key, final > >>>> RecordContext > >>>> recordContext); > >>>> } > >>> > >>> > >>> > >>> - Fixed. > >>> > >>> > >>> 2. Some of the listed functions are not necessary since their pairing > >> APIs > >>>> are being deprecated in 1.0 already: > >>>> <KR> KGroupedStream<KR, V> groupBy(final RichKeyValueMapper<? super K, > >> ? > >>>> super V, KR> selector, > >>>> final Serde<KR> keySerde, > >>>> final Serde<V> valSerde); > >>>> <VT, VR> KStream<K, VR> leftJoin(final KTable<K, VT> table, > >>>> final RichValueJoiner<? super K, ? > >> super > >>>> V, > >>>> ? super VT, ? extends VR> joiner, > >>>> final Serde<K> keySerde, > >>>> final Serde<V> valSerde); > >>> > >>> > >>> -Fixed > >>> > >>> 3. For a few functions where we are adding three APIs for a combo of > both > >>>> mapper / joiner, or both initializer / aggregator, or adder / > >> subtractor, > >>>> I'm wondering if we can just keep one that use "rich" functions for > >> both; > >>>> so that we can have less overloads and let users who only want to > >> access > >>>> one of them to just use dummy parameter declarations. For example: > >>>> > >>>> <GK, GV, RV> KStream<K, RV> join(final GlobalKTable<GK, GV> > >> globalKTable, > >>>> final RichKeyValueMapper<? super K, ? > >>>> super > >>>> V, ? extends GK> keyValueMapper, > >>>> final RichValueJoiner<? super K, ? > >> super > >>>> V, > >>>> ? super GV, ? extends RV> joiner); > >>> > >>> > >>> > >>> -Agreed. Fixed. > >>> > >>> > >>> 4. For TimeWindowedKStream, I'm wondering why we do not make its > >>>> Initializer also "rich" functions? I.e. > >>> > >>> > >>> - It was a typo. Fixed. > >>> > >>> > >>> 5. We need to move "RecordContext" from o.a.k.processor.internals to > >>>> o.a.k.processor. > >>>> > >>>> 6. I'm not clear why we want to move `commit()` from ProcessorContext > >> to > >>>> RecordContext? > >>>> > >>> > >>> - > >>> Because it makes sense logically and to reduce code maintenance (both > >>> interfaces have offset() timestamp() topic() partition() methods), I > >>> inherit ProcessorContext from RecordContext. > >>> Since we need commit() method both in ProcessorContext and in > >> RecordContext > >>> I move commit() method to parent class (RecordContext). > >>> > >>> > >>> Cheers, > >>> Jeyhun > >>> > >>> > >>> > >>> On Wed, Oct 11, 2017 at 12:59 AM, Guozhang Wang <wangg...@gmail.com> > >>> wrote: > >>> > >>>> Jeyhun, > >>>> > >>>> Thanks for the updated KIP, here are my comments. > >>>> > >>>> 0. RichInitializer definition seems missing. > >>>> > >>>> 1. I'd suggest moving the key parameter in the RichValueXX and > >>> RichReducer > >>>> after the value parameters, as well as in the templates; e.g. > >>>> > >>>> public interface RichValueJoiner<V1, V2, VR, K> { > >>>> VR apply(final V1 value1, final V2 value2, final K key, final > >>>> RecordContext > >>>> recordContext); > >>>> } > >>>> > >>>> My motivation is that for lambda expression in J8, users that would > not > >>>> care about the key but only the context, or vice versa, is likely to > >>> write > >>>> it as (value1, value2, dummy, context) -> ... than putting the dummy > at > >>> the > >>>> beginning of the parameter list. Generally speaking we'd like to make > >> all > >>>> the "necessary" parameters prior to optional ones. > >>>> > >>>> > >>>> 2. Some of the listed functions are not necessary since their pairing > >>> APIs > >>>> are being deprecated in 1.0 already: > >>>> > >>>> <KR> KGroupedStream<KR, V> groupBy(final RichKeyValueMapper<? super K, > >> ? > >>>> super V, KR> selector, > >>>> final Serde<KR> keySerde, > >>>> final Serde<V> valSerde); > >>>> > >>>> <VT, VR> KStream<K, VR> leftJoin(final KTable<K, VT> table, > >>>> final RichValueJoiner<? super K, ? > >> super > >>>> V, > >>>> ? super VT, ? extends VR> joiner, > >>>> final Serde<K> keySerde, > >>>> final Serde<V> valSerde); > >>>> > >>>> > >>>> > >>>> 3. For a few functions where we are adding three APIs for a combo of > >> both > >>>> mapper / joiner, or both initializer / aggregator, or adder / > >> subtractor, > >>>> I'm wondering if we can just keep one that use "rich" functions for > >> both; > >>>> so that we can have less overloads and let users who only want to > >> access > >>>> one of them to just use dummy parameter declarations. For example: > >>>> > >>>> > >>>> <GK, GV, RV> KStream<K, RV> join(final GlobalKTable<GK, GV> > >> globalKTable, > >>>> final RichKeyValueMapper<? super K, ? > >>>> super > >>>> V, ? extends GK> keyValueMapper, > >>>> final RichValueJoiner<? super K, ? > >> super > >>>> V, > >>>> ? super GV, ? extends RV> joiner); > >>>> > >>>> <VR> KTable<K, VR> aggregate(final RichInitializer<K, VR> initializer, > >>>> final RichAggregator<? super K, ? super > V, > >>> VR> > >>>> aggregator, > >>>> final Materialized<K, VR, > >>> KeyValueStore<Bytes, > >>>> byte[]>> materialized); > >>>> > >>>> Similarly for KGroupedTable, a bunch of aggregate() are deprecated so > >> we > >>> do > >>>> not need to add its rich functions any more. > >>>> > >>>> > >>>> 4. For TimeWindowedKStream, I'm wondering why we do not make its > >>>> Initializer also "rich" functions? I.e. > >>>> > >>>> <VR> KTable<Windowed<K>, VR> aggregate(final RichInitializer<VR, K> > >>>> initializer, > >>>> final RichAggregator<? super K, > >> ? > >>>> super V, VR> aggregator); > >>>> <VR> KTable<Windowed<K>, VR> aggregate(final RichInitializer<VR, K> > >>>> initializer, > >>>> final RichAggregator<? super K, > >> ? > >>>> super V, VR> aggregator, > >>>> final Materialized<K, VR, > >>>> WindowStore<Bytes, byte[]>> materialized); > >>>> > >>>> > >>>> 5. We need to move "RecordContext" from o.a.k.processor.internals to > >>>> o.a.k.processor. > >>>> > >>>> 6. I'm not clear why we want to move `commit()` from ProcessorContext > >> to > >>>> RecordContext? Conceptually I think it would better staying in the > >>>> ProcessorContext. Do you find this not doable in the internal > >>>> implementations? > >>>> > >>>> > >>>> Guozhang > >>>> > >>>> > >>>> > >>>> On Fri, Sep 22, 2017 at 1:09 PM, Ted Yu <yuzhih...@gmail.com> wrote: > >>>> > >>>>> recordContext = new RecordContext() { // > >> recordContext > >>>>> initialization is added in this KIP > >>>>> > >>>>> This code snippet seems to be standard - would it make sense to pull > >> it > >>>>> into a (sample) RecordContext implementation ? > >>>>> > >>>>> Cheers > >>>>> > >>>>> On Fri, Sep 22, 2017 at 12:14 PM, Jeyhun Karimov < > >> je.kari...@gmail.com > >>>> > >>>>> wrote: > >>>>> > >>>>>> Hi Ted, > >>>>>> > >>>>>> Thanks for your comments. I added a couple of comments in KIP to > >>>> clarify > >>>>>> some points. > >>>>>> > >>>>>> > >>>>>> bq. provides a hybrd solution > >>>>>>> Typo in hybrid. > >>>>>> > >>>>>> > >>>>>> - My bad. Thanks for the correction. > >>>>>> > >>>>>> It would be nice if you can name some Value operator as examples. > >>>>>> > >>>>>> > >>>>>>> > >>>>>> - I added the corresponding interface names to KIP. > >>>>>> > >>>>>> > >>>>>> <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 ? > >>>>>> > >>>>>> > >>>>>> > >>>>>> - Exactly. However, there are 2 Aggregator-type arguments in the > >>>> related > >>>>>> method. So, I had to overload all possible their Rich counterparts: > >>>>>> > >>>>>> // adder with non-rich, subtrctor is rich > >>>>>> <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer, > >>>>>> final Aggregator<? super K, ? super V, > >>> VR> > >>>>>> adder, > >>>>>> final RichAggregator<? super K, ? > >> super > >>> V, > >>>>> VR> > >>>>>> subtractor, > >>>>>> final Materialized<K, VR, > >>>>> KeyValueStore<Bytes, > >>>>>> byte[]>> materialized); > >>>>>> > >>>>>> // adder withrich, subtrctor is non-rich > >>>>>> <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer, > >>>>>> final RichAggregator<? super K, ? > >> super > >>> V, > >>>>> VR> > >>>>>> adder, > >>>>>> final Aggregator<? super K, ? super V, > >>> VR> > >>>>>> subtractor, > >>>>>> final Materialized<K, VR, > >>>>> KeyValueStore<Bytes, > >>>>>> byte[]>> materialized); > >>>>>> > >>>>>> // both adder and subtractor are rich > >>>>>> <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer, > >>>>>> final RichAggregator<? super K, ? > >> super > >>> V, > >>>>> VR> > >>>>>> adder, > >>>>>> final RichAggregator<? super K, ? > >> super > >>> V, > >>>>> VR> > >>>>>> subtractor, > >>>>>> final Materialized<K, VR, > >>>>> KeyValueStore<Bytes, > >>>>>> byte[]>> materialized); > >>>>>> > >>>>>> > >>>>>> 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 ? > >>>>>> > >>>>>> > >>>>>> > >>>>>> - I added some comments both inside and outside the code snippets > >> in > >>>> KIP. > >>>>>> Specifically, for the code snippet above, we add *commit()* method > >> to > >>>>>> *RecordContext* interface. > >>>>>> However, we want *commit()* method to be used only for > >>> *RecordContext* > >>>>>> instances (at least for now), so we add > >> UnsupportedOperationException > >>>> in > >>>>>> all classes/interfaces that extend/implement *RecordContext.* > >>>>>> In general, 1) we make RecordContext publicly available within > >>>>>> ProcessorContext, 2) initialize its instance within all required > >>>>>> Processors and 3) pass it as an argument to the related Rich > >>> interfaces > >>>>>> inside Processors. > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> Cheers, > >>>>>> Jeyhun > >>>>>> > >>>>>> On Fri, Sep 22, 2017 at 6:44 PM Ted Yu <yuzhih...@gmail.com> > >> wrote: > >>>>>> > >>>>>>> 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, > >>>>>>>>>