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.
> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 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
> > >>>>>>>>>>>>>

Reply via email to