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. >>>>>>>>>>>>>>>>>>>>>>>>>> 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. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >
signature.asc
Description: OpenPGP digital signature