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

Reply via email to