Hi Matthias, Thanks a lot for correcting. It is a leftover from the past designs when punctuate() was not deprecated. I corrected.
Cheers, Jeyhun On Mon, Nov 6, 2017 at 5:30 PM Matthias J. Sax <matth...@confluent.io> wrote: > I just re-read the KIP. > > One minor comment: we don't need to introduce any deprecated methods. > Thus, RichValueTransformer#punctuate can be removed completely instead > of introducing it as deprecated. > > Otherwise looks good to me. > > Thanks for being so patient! > > > -Matthias > > On 11/1/17 9:16 PM, Guozhang Wang wrote: > > Jeyhun, > > > > I think I'm convinced to not do KAFKA-3907 in this KIP. We should think > > carefully if we should add this functionality to the DSL layer moving > > forward since from what we discovered working on it the conclusion is > that > > it would require revamping the public APIs quite a lot, and it's not > clear > > if it is a good trade-off than asking users to call process() instead. > > > > > > Guozhang > > > > > > On Wed, Nov 1, 2017 at 4:50 AM, Damian Guy <damian....@gmail.com> wrote: > > > >> Hi Jeyhun, thanks, looks good. > >> Do we need to remove the line that says: > >> > >> - on-demand commit() feature > >> > >> Cheers, > >> Damian > >> > >> On Tue, 31 Oct 2017 at 23:07 Jeyhun Karimov <je.kari...@gmail.com> > wrote: > >> > >>> Hi, > >>> > >>> I removed the 'commit()' feature, as we discussed. It simplified the > >>> overall design of KIP a lot. > >>> If it is ok, I would like to start a VOTE thread. > >>> > >>> Cheers, > >>> Jeyhun > >>> > >>> On Fri, Oct 27, 2017 at 5:28 PM Matthias J. Sax <matth...@confluent.io > > > >>> wrote: > >>> > >>>> Thanks. I understand what you are saying, but I don't agree that > >>>> > >>>>> but also we need a commit() method > >>>> > >>>> I would just not provide `commit()` at DSL level and close the > >>>> corresponding Jira as "not a problem" or similar. > >>>> > >>>> > >>>> -Matthias > >>>> > >>>> On 10/27/17 3:42 PM, Jeyhun Karimov wrote: > >>>>> Hi Matthias, > >>>>> > >>>>> Thanks for your comments. I agree that this is not the best way to > >> do. > >>> A > >>>>> bit of history behind this design. > >>>>> > >>>>> Prior doing this, I tried to provide ProcessorContext itself as an > >>>> argument > >>>>> in Rich interfaces. However, we dont want to give users that > >>> flexibility > >>>>> and “power”. Moreover, ProcessorContext contains processor level > >>>>> information and not Record level info. The only thing we need ij > >>>>> ProcessorContext is commit() method. > >>>>> > >>>>> So, as far as I understood, we need recor context (offset, timestamp > >>> and > >>>>> etc) but also we need a commit() method ( we dont want to provide > >>>>> ProcessorContext as a parameter so users can use > >>>> ProcessorContext.commit() > >>>>> ). > >>>>> > >>>>> As a result, I thought to “propagate” commit() call from > >> RecordContext > >>> to > >>>>> ProcessorContext() . > >>>>> > >>>>> > >>>>> If there is a misunderstanding in motvation/discussion of > >> KIP/included > >>>>> jiras please let me know. > >>>>> > >>>>> > >>>>> Cheers, > >>>>> Jeyhun > >>>>> > >>>>> > >>>>> On Fri 27. Oct 2017 at 12:39, Matthias J. Sax <matth...@confluent.io > >>> > >>>> wrote: > >>>>> > >>>>>> I am personally still not convinced, that we should add `commit()` > >> at > >>>> all. > >>>>>> > >>>>>> @Guozhang: you created the original Jira. Can you elaborate a little > >>>>>> bit? Isn't requesting commits a low level API that should not be > >>> exposed > >>>>>> in the DSL? Just want to understand the motivation better. Why would > >>>>>> anybody that uses the DSL ever want to request a commit? To me, > >>>>>> requesting commits is useful if you manipulated state explicitly, > >> ie, > >>>>>> via Processor API. > >>>>>> > >>>>>> Also, for the solution: it seem rather unnatural to me, that we add > >>>>>> `commit()` to `RecordContext` -- from my understanding, > >>> `RecordContext` > >>>>>> is an helper object that provide access to record meta data. > >>> Requesting > >>>>>> a commit is something quite different. Additionally, a commit does > >> not > >>>>>> commit a specific record but a `RecrodContext` is for a specific > >>> record. > >>>>>> > >>>>>> To me, this does not seem to be a sound API design if we follow this > >>>> path. > >>>>>> > >>>>>> > >>>>>> -Matthias > >>>>>> > >>>>>> > >>>>>> > >>>>>> On 10/26/17 10:41 PM, Jeyhun Karimov wrote: > >>>>>>> Hi, > >>>>>>> > >>>>>>> Thanks for your suggestions. > >>>>>>> > >>>>>>> I have some comments, to make sure that there is no > >> misunderstanding. > >>>>>>> > >>>>>>> > >>>>>>> 1. Maybe we can deprecate the `commit()` in ProcessorContext, to > >>>> enforce > >>>>>>>> user to consolidate this call as > >>>>>>>> "processorContext.recordContext().commit()". And internal > >>>> implementation > >>>>>>>> of > >>>>>>>> `ProcessorContext.commit()` in `ProcessorContextImpl` is also > >>> changed > >>>> to > >>>>>>>> this call. > >>>>>>> > >>>>>>> > >>>>>>> - I think we should not deprecate `ProcessorContext.commit()`. The > >>> main > >>>>>>> intuition that we introduce `commit()` in `RecordContext` is that, > >>>>>>> `RecordContext` is the one which is provided in Rich interfaces. So > >>> if > >>>>>> user > >>>>>>> wants to commit, then there should be some method inside > >>>> `RecordContext` > >>>>>> to > >>>>>>> do so. Internally, `RecordContext.commit()` calls > >>>>>>> `ProcessorContext.commit()` (see the last code snippet in > >> KIP-159): > >>>>>>> > >>>>>>> @Override > >>>>>>> public void process(final K1 key, final V1 value) { > >>>>>>> > >>>>>>> recordContext = new RecordContext() { // > >>>>>>> recordContext initialization is added in this KIP > >>>>>>> @Override > >>>>>>> public void commit() { > >>>>>>> context().commit(); > >>>>>>> } > >>>>>>> > >>>>>>> @Override > >>>>>>> public long offset() { > >>>>>>> return context().recordContext().offset(); > >>>>>>> } > >>>>>>> > >>>>>>> @Override > >>>>>>> public long timestamp() { > >>>>>>> return context().recordContext().timestamp(); > >>>>>>> } > >>>>>>> > >>>>>>> @Override > >>>>>>> public String topic() { > >>>>>>> return context().recordContext().topic(); > >>>>>>> } > >>>>>>> > >>>>>>> @Override > >>>>>>> public int partition() { > >>>>>>> return context().recordContext().partition(); > >>>>>>> } > >>>>>>> }; > >>>>>>> > >>>>>>> > >>>>>>> So, we cannot deprecate `ProcessorContext.commit()` in this case > >> IMO. > >>>>>>> > >>>>>>> > >>>>>>> 2. Add the `task` reference to the impl class, > >>>> `ProcessorRecordContext`, > >>>>>> so > >>>>>>>> that it can implement the commit call itself. > >>>>>>> > >>>>>>> > >>>>>>> - Actually, I don't think that we need `commit()` in > >>>>>>> `ProcessorRecordContext`. The main intuition is to "transfer" > >>>>>>> `ProcessorContext.commit()` call to Rich interfaces, to support > >>>>>>> user-specific committing. > >>>>>>> To do so, we introduce `commit()` method in `RecordContext()` just > >>>> only > >>>>>> to > >>>>>>> call ProcessorContext.commit() inside. (see the above code snippet) > >>>>>>> So, in Rich interfaces, we are not dealing with > >>>> `ProcessorRecordContext` > >>>>>>> at all, and we leave all its methods as it is. > >>>>>>> In this KIP, we made `RecordContext` to be the parent class of > >>>>>>> `ProcessorRecordContext`, just because of they share quite amount > >> of > >>>>>>> methods and it is logical to enable inheritance between those two. > >>>>>>> > >>>>>>> 3. In the wiki page, the statement that "However, call to a > >> commit() > >>>>>> method, > >>>>>>>> is valid only within RecordContext interface (at least for now), > >> we > >>>>>> throw > >>>>>>>> an exception in ProcessorRecordContext.commit()." and the code > >>> snippet > >>>>>>>> below would need to be updated as well. > >>>>>>> > >>>>>>> > >>>>>>> - I think above explanation covers this as well. > >>>>>>> > >>>>>>> > >>>>>>> I want to gain some speed to this KIP, as it has gone though many > >>>> changes > >>>>>>> based on user/developer needs, both in > >>>>>> documentation-/implementation-wise. > >>>>>>> > >>>>>>> > >>>>>>> Cheers, > >>>>>>> Jeyhun > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> On Tue, Oct 24, 2017 at 1:41 AM Guozhang Wang <wangg...@gmail.com> > >>>>>> wrote: > >>>>>>> > >>>>>>>> Thanks for the information Jeyhun. I had also forgot about > >>> KAFKA-3907 > >>>>>> with > >>>>>>>> this KIP.. > >>>>>>>> > >>>>>>>> Thinking a bit more, I'm now inclined to go with what we agreed > >>>> before, > >>>>>> to > >>>>>>>> add the commit() call to `RecordContext`. A few minor tweaks on > >> its > >>>>>>>> implementation: > >>>>>>>> > >>>>>>>> 1. Maybe we can deprecate the `commit()` in ProcessorContext, to > >>>> enforce > >>>>>>>> user to consolidate this call as > >>>>>>>> "processorContext.recordContext().commit()". And internal > >>>> implementation > >>>>>>>> of > >>>>>>>> `ProcessorContext.commit()` in `ProcessorContextImpl` is also > >>> changed > >>>> to > >>>>>>>> this call. > >>>>>>>> > >>>>>>>> 2. Add the `task` reference to the impl class, > >>>>>> `ProcessorRecordContext`, so > >>>>>>>> that it can implement the commit call itself. > >>>>>>>> > >>>>>>>> 3. In the wiki page, the statement that "However, call to a > >> commit() > >>>>>>>> method, > >>>>>>>> is valid only within RecordContext interface (at least for now), > >> we > >>>>>> throw > >>>>>>>> an exception in ProcessorRecordContext.commit()." and the code > >>> snippet > >>>>>>>> below would need to be updated as well. > >>>>>>>> > >>>>>>>> > >>>>>>>> Guozhang > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> On Mon, Oct 23, 2017 at 1:40 PM, Matthias J. Sax < > >>>> matth...@confluent.io > >>>>>>> > >>>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Fair point. This is a long discussion and I totally forgot that > >> we > >>>>>>>>> discussed this. > >>>>>>>>> > >>>>>>>>> Seems I changed my opinion about including KAFKA-3907... > >>>>>>>>> > >>>>>>>>> Happy to hear what others think. > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> -Matthias > >>>>>>>>> > >>>>>>>>> On 10/23/17 1:20 PM, Jeyhun Karimov wrote: > >>>>>>>>>> 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. > >>>>>>>>>>>>>>>>>>>>>>