Hi,

Thanks for the feedback.


0. RichInitializer definition seems missing.



- Fixed.


 I'd suggest moving the key parameter in the RichValueXX and RichReducer
> after the value parameters, as well as in the templates; e.g.
> public interface RichValueJoiner<V1, V2, VR, K> {
>     VR apply(final V1 value1, final V2 value2, final K key, final
> RecordContext
> recordContext);
> }



- Fixed.


2. Some of the listed functions are not necessary since their pairing APIs
> are being deprecated in 1.0 already:
> <KR> KGroupedStream<KR, V> groupBy(final RichKeyValueMapper<? super K, ?
> super V, KR> selector,
>                                    final Serde<KR> keySerde,
>                                    final Serde<V> valSerde);
> <VT, VR> KStream<K, VR> leftJoin(final KTable<K, VT> table,
>                                  final RichValueJoiner<? super K, ? super
> V,
> ? super VT, ? extends VR> joiner,
>                                  final Serde<K> keySerde,
>                                  final Serde<V> valSerde);


-Fixed

3. For a few functions where we are adding three APIs for a combo of both
> mapper / joiner, or both initializer / aggregator, or adder / subtractor,
> I'm wondering if we can just keep one that use "rich" functions for both;
> so that we can have less overloads and let users who only want to access
> one of them to just use dummy parameter declarations. For example:
>
> <GK, GV, RV> KStream<K, RV> join(final GlobalKTable<GK, GV> globalKTable,
>                                  final RichKeyValueMapper<? super K, ?
> super
>  V, ? extends GK> keyValueMapper,
>                                  final RichValueJoiner<? super K, ? super
> V,
> ? super GV, ? extends RV> joiner);



-Agreed. Fixed.


4. For TimeWindowedKStream, I'm wondering why we do not make its
> Initializer also "rich" functions? I.e.


- It was a typo. Fixed.


5. We need to move "RecordContext" from o.a.k.processor.internals to
> o.a.k.processor.
>
> 6. I'm not clear why we want to move `commit()` from ProcessorContext to
> RecordContext?
>

-
Because it makes sense logically and  to reduce code maintenance (both
interfaces have offset() timestamp() topic() partition() methods),  I
inherit ProcessorContext from RecordContext.
Since we need commit() method both in ProcessorContext and in RecordContext
I move commit() method to parent class (RecordContext).


Cheers,
Jeyhun



On Wed, Oct 11, 2017 at 12:59 AM, Guozhang Wang <wangg...@gmail.com> wrote:

> Jeyhun,
>
> Thanks for the updated KIP, here are my comments.
>
> 0. RichInitializer definition seems missing.
>
> 1. I'd suggest moving the key parameter in the RichValueXX and RichReducer
> after the value parameters, as well as in the templates; e.g.
>
> public interface RichValueJoiner<V1, V2, VR, K> {
>     VR apply(final V1 value1, final V2 value2, final K key, final
> RecordContext
> recordContext);
> }
>
> My motivation is that for lambda expression in J8, users that would not
> care about the key but only the context, or vice versa, is likely to write
> it as (value1, value2, dummy, context) -> ... than putting the dummy at the
> beginning of the parameter list. Generally speaking we'd like to make all
> the "necessary" parameters prior to optional ones.
>
>
> 2. Some of the listed functions are not necessary since their pairing APIs
> are being deprecated in 1.0 already:
>
> <KR> KGroupedStream<KR, V> groupBy(final RichKeyValueMapper<? super K, ?
> super V, KR> selector,
>                                    final Serde<KR> keySerde,
>                                    final Serde<V> valSerde);
>
> <VT, VR> KStream<K, VR> leftJoin(final KTable<K, VT> table,
>                                  final RichValueJoiner<? super K, ? super
> V,
> ? super VT, ? extends VR> joiner,
>                                  final Serde<K> keySerde,
>                                  final Serde<V> valSerde);
>
>
>
> 3. For a few functions where we are adding three APIs for a combo of both
> mapper / joiner, or both initializer / aggregator, or adder / subtractor,
> I'm wondering if we can just keep one that use "rich" functions for both;
> so that we can have less overloads and let users who only want to access
> one of them to just use dummy parameter declarations. For example:
>
>
> <GK, GV, RV> KStream<K, RV> join(final GlobalKTable<GK, GV> globalKTable,
>                                  final RichKeyValueMapper<? super K, ?
> super
>  V, ? extends GK> keyValueMapper,
>                                  final RichValueJoiner<? super K, ? super
> V,
> ? super GV, ? extends RV> joiner);
>
> <VR> KTable<K, VR> aggregate(final RichInitializer<K, VR> initializer,
>                              final RichAggregator<? super K, ? super V, VR>
> aggregator,
>                              final Materialized<K, VR, KeyValueStore<Bytes,
> byte[]>> materialized);
>
> Similarly for KGroupedTable, a bunch of aggregate() are deprecated so we do
> not need to add its rich functions any more.
>
>
> 4. For TimeWindowedKStream, I'm wondering why we do not make its
> Initializer also "rich" functions? I.e.
>
> <VR> KTable<Windowed<K>, VR> aggregate(final RichInitializer<VR, K>
> initializer,
>                                        final RichAggregator<? super K, ?
> super V, VR> aggregator);
> <VR> KTable<Windowed<K>, VR> aggregate(final RichInitializer<VR, K>
> initializer,
>                                        final RichAggregator<? super K, ?
> super V, VR> aggregator,
>                                        final Materialized<K, VR,
> WindowStore<Bytes, byte[]>> materialized);
>
>
> 5. We need to move "RecordContext" from o.a.k.processor.internals to
> o.a.k.processor.
>
> 6. I'm not clear why we want to move `commit()` from ProcessorContext to
> RecordContext? Conceptually I think it would better staying in the
> ProcessorContext. Do you find this not doable in the internal
> implementations?
>
>
> Guozhang
>
>
>
> On Fri, Sep 22, 2017 at 1:09 PM, Ted Yu <yuzhih...@gmail.com> wrote:
>
> >    recordContext = new RecordContext() {               // recordContext
> > initialization is added in this KIP
> >
> > This code snippet seems to be standard - would it make sense to pull it
> > into a (sample) RecordContext implementation ?
> >
> > Cheers
> >
> > On Fri, Sep 22, 2017 at 12:14 PM, Jeyhun Karimov <je.kari...@gmail.com>
> > wrote:
> >
> > > Hi Ted,
> > >
> > > Thanks for your comments. I added a couple of comments in KIP to
> clarify
> > > some points.
> > >
> > >
> > > bq. provides a hybrd solution
> > > > Typo in hybrid.
> > >
> > >
> > > - My bad. Thanks for the correction.
> > >
> > > It would be nice if you can name some Value operator as examples.
> > >
> > >
> > > >
> > > - I added the corresponding interface names to KIP.
> > >
> > >
> > > <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer,
> > > >                              final Aggregator<? super K, ? super V,
> VR>
> > > > adder,
> > > > The adder doesn't need to be RichAggregator ?
> > >
> > >
> > >
> > > - Exactly. However, there are 2 Aggregator-type arguments in the
> related
> > > method. So, I had to overload all possible their Rich counterparts:
> > >
> > > // adder with non-rich, subtrctor is rich
> > > <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer,
> > >                              final Aggregator<? super K, ? super V, VR>
> > > adder,
> > >                              final RichAggregator<? super K, ? super V,
> > VR>
> > > subtractor,
> > >                              final Materialized<K, VR,
> > KeyValueStore<Bytes,
> > > byte[]>> materialized);
> > >
> > > // adder withrich, subtrctor is non-rich
> > > <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer,
> > >                              final RichAggregator<? super K, ? super V,
> > VR>
> > > adder,
> > >                              final Aggregator<? super K, ? super V, VR>
> > > subtractor,
> > >                              final Materialized<K, VR,
> > KeyValueStore<Bytes,
> > > byte[]>> materialized);
> > >
> > > // both adder and subtractor are rich
> > > <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer,
> > >                              final RichAggregator<? super K, ? super V,
> > VR>
> > > adder,
> > >                              final RichAggregator<? super K, ? super V,
> > VR>
> > > subtractor,
> > >                              final Materialized<K, VR,
> > KeyValueStore<Bytes,
> > > byte[]>> materialized);
> > >
> > >
> > > Can you explain a bit about the above implementation ?
> > > >    void commit () {
> > > >      throw new UnsupportedOperationException("commit() is not
> > supported
> > > in
> > > > this context");
> > > > Is the exception going to be replaced with real code in the PR ?
> > >
> > >
> > >
> > > - I added some comments both inside and outside the code snippets in
> KIP.
> > > Specifically, for the code snippet above, we add *commit()* method to
> > > *RecordContext* interface.
> > > However, we want  *commit()* method to be used only for *RecordContext*
> > > instances (at least for now), so we add UnsupportedOperationException
> in
> > > all classes/interfaces that extend/implement *RecordContext.*
> > > In general, 1) we make RecordContext publicly available within
> > > ProcessorContext,  2) initialize its instance within all required
> > > Processors and 3) pass it as an argument to the related Rich interfaces
> > > inside Processors.
> > >
> > >
> > >
> > >
> > > Cheers,
> > > Jeyhun
> > >
> > > On Fri, Sep 22, 2017 at 6:44 PM Ted Yu <yuzhih...@gmail.com> wrote:
> > >
> > > > bq. provides a hybrd solution
> > > >
> > > > Typo in hybrid.
> > > >
> > > > bq. accessing read-only keys within XXXValues operators
> > > >
> > > > It would be nice if you can name some Value operator as examples.
> > > >
> > > > <VR> KTable<K, VR> aggregate(final Initializer<VR> initializer,
> > > >                              final Aggregator<? super K, ? super V,
> VR>
> > > > adder,
> > > >
> > > > The adder doesn't need to be RichAggregator ?
> > > >
> > > >   public RecordContext recordContext() {
> > > >     return this.recordContext();
> > > >
> > > > Can you explain a bit about the above implementation ?
> > > >
> > > >    void commit () {
> > > >      throw new UnsupportedOperationException("commit() is not
> > supported
> > > in
> > > > this context");
> > > >
> > > > Is the exception going to be replaced with real code in the PR ?
> > > >
> > > > Cheers
> > > >
> > > >
> > > > On Fri, Sep 22, 2017 at 9:28 AM, Jeyhun Karimov <
> je.kari...@gmail.com>
> > > > wrote:
> > > >
> > > > > Dear community,
> > > > >
> > > > > I updated the related KIP [1]. Please feel free to comment.
> > > > >
> > > > > Cheers,
> > > > > Jeyhun
> > > > >
> > > > > [1]
> > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-
> > > > > 159%3A+Introducing+Rich+functions+to+Streams
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On Fri, Sep 22, 2017 at 12:20 AM Jeyhun Karimov <
> > je.kari...@gmail.com>
> > > > > wrote:
> > > > >
> > > > > > Hi Damian,
> > > > > >
> > > > > > Thanks for the update. I working on it and will provide an update
> > > soon.
> > > > > >
> > > > > > Cheers,
> > > > > > Jeyhun
> > > > > >
> > > > > > On Thu, Sep 21, 2017 at 4:50 PM Damian Guy <damian....@gmail.com
> >
> > > > wrote:
> > > > > >
> > > > > >> Hi Jeyhun,
> > > > > >>
> > > > > >> All KIP-182 API PRs have now been merged. So you can consider it
> > as
> > > > > >> stable.
> > > > > >> Thanks,
> > > > > >> Damian
> > > > > >>
> > > > > >> On Thu, 21 Sep 2017 at 15:23 Jeyhun Karimov <
> je.kari...@gmail.com
> > >
> > > > > wrote:
> > > > > >>
> > > > > >> > Hi all,
> > > > > >> >
> > > > > >> > Thanks a lot for your comments. For the single interface
> > (RichXXX
> > > > and
> > > > > >> > XXXWithKey) solution, I have already submitted a PR but
> probably
> > > it
> > > > is
> > > > > >> > outdated (when the KIP first proposed), I need to revisit that
> > > one.
> > > > > >> >
> > > > > >> > @Guozhang, from our (offline) discussion, I understood that we
> > may
> > > > not
> > > > > >> make
> > > > > >> > it merge this KIP into the upcoming release, as KIP-159 is not
> > > voted
> > > > > yet
> > > > > >> > (because we want both KIP-149 and KIP-159 to be as an "atomic"
> > > > merge).
> > > > > >> So
> > > > > >> > I decided to wait until KIP-182 gets stable (there are some
> > minor
> > > > > >> updates
> > > > > >> > AFAIK) and update the KIP accordingly. Please correct me if I
> am
> > > > wrong
> > > > > >> or I
> > > > > >> > misunderstood.
> > > > > >> >
> > > > > >> > Cheers,
> > > > > >> > Jeyhun
> > > > > >> >
> > > > > >> >
> > > > > >> > On Thu, Sep 21, 2017 at 4:11 PM Damian Guy <
> > damian....@gmail.com>
> > > > > >> wrote:
> > > > > >> >
> > > > > >> > > +1
> > > > > >> > >
> > > > > >> > > On Thu, 21 Sep 2017 at 13:46 Guozhang Wang <
> > wangg...@gmail.com>
> > > > > >> wrote:
> > > > > >> > >
> > > > > >> > > > +1 for me as well for collapsing.
> > > > > >> > > >
> > > > > >> > > > Jeyhun, could you update the wiki accordingly to show
> what's
> > > the
> > > > > >> final
> > > > > >> > > > updates post KIP-182 that needs to be done in KIP-159
> > > including
> > > > > >> > KIP-149?
> > > > > >> > > > The child page I made is just a suggestion, but you would
> > > still
> > > > > >> need to
> > > > > >> > > > update your proposal for people to comment and vote on.
> > > > > >> > > >
> > > > > >> > > >
> > > > > >> > > > Guozhang
> > > > > >> > > >
> > > > > >> > > >
> > > > > >> > > > On Thu, Sep 14, 2017 at 10:37 PM, Ted Yu <
> > yuzhih...@gmail.com
> > > >
> > > > > >> wrote:
> > > > > >> > > >
> > > > > >> > > > > +1
> > > > > >> > > > >
> > > > > >> > > > > One interface is cleaner.
> > > > > >> > > > >
> > > > > >> > > > > On Thu, Sep 14, 2017 at 7:26 AM, Bill Bejeck <
> > > > bbej...@gmail.com
> > > > > >
> > > > > >> > > wrote:
> > > > > >> > > > >
> > > > > >> > > > > > +1 for me on collapsing the RichXXXX and
> > ValueXXXXWithKey
> > > > > >> > interfaces
> > > > > >> > > > > into 1
> > > > > >> > > > > > interface.
> > > > > >> > > > > >
> > > > > >> > > > > > Thanks,
> > > > > >> > > > > > Bill
> > > > > >> > > > > >
> > > > > >> > > > > > On Wed, Sep 13, 2017 at 11:31 AM, Jeyhun Karimov <
> > > > > >> > > je.kari...@gmail.com
> > > > > >> > > > >
> > > > > >> > > > > > wrote:
> > > > > >> > > > > >
> > > > > >> > > > > > > Hi Damian,
> > > > > >> > > > > > >
> > > > > >> > > > > > > Thanks for your feedback. Actually, this (what you
> > > > propose)
> > > > > >> was
> > > > > >> > the
> > > > > >> > > > > first
> > > > > >> > > > > > > idea of KIP-149. Then we decided to divide it into
> two
> > > > > KIPs. I
> > > > > >> > also
> > > > > >> > > > > > > expressed my opinion that keeping the two interfaces
> > > (Rich
> > > > > and
> > > > > >> > > > withKey)
> > > > > >> > > > > > > separate would add more overloads. So, email
> > discussion
> > > > > >> resulted
> > > > > >> > > that
> > > > > >> > > > > > this
> > > > > >> > > > > > > would not be a problem.
> > > > > >> > > > > > >
> > > > > >> > > > > > > Our initial idea was similar to :
> > > > > >> > > > > > >
> > > > > >> > > > > > > public abstract class RichValueMapper<K, V, VR>
> > > > implements
> > > > > >> > > > > > > ValueMapperWithKey<K, V, VR>, RichFunction {
> > > > > >> > > > > > > ......
> > > > > >> > > > > > > }
> > > > > >> > > > > > >
> > > > > >> > > > > > >
> > > > > >> > > > > > > So, we check the type of object, whether it is
> RichXXX
> > > or
> > > > > >> > > XXXWithKey
> > > > > >> > > > > > inside
> > > > > >> > > > > > > the called method and continue accordingly.
> > > > > >> > > > > > >
> > > > > >> > > > > > > If this is ok with the community, I would like to
> > revert
> > > > the
> > > > > >> > > current
> > > > > >> > > > > > design
> > > > > >> > > > > > > to this again.
> > > > > >> > > > > > >
> > > > > >> > > > > > > Cheers,
> > > > > >> > > > > > > Jeyhun
> > > > > >> > > > > > >
> > > > > >> > > > > > > On Wed, Sep 13, 2017 at 3:02 PM Damian Guy <
> > > > > >> damian....@gmail.com
> > > > > >> > >
> > > > > >> > > > > wrote:
> > > > > >> > > > > > >
> > > > > >> > > > > > > > Hi Jeyhun,
> > > > > >> > > > > > > >
> > > > > >> > > > > > > > Thanks for sending out the update. I guess i was
> > > > thinking
> > > > > >> more
> > > > > >> > > > along
> > > > > >> > > > > > the
> > > > > >> > > > > > > > lines of option 2 where we collapse the RichXXXX
> and
> > > > > >> > > > ValueXXXXWithKey
> > > > > >> > > > > > etc
> > > > > >> > > > > > > > interfaces into 1 interface that has all of the
> > > > > arguments. I
> > > > > >> > > think
> > > > > >> > > > we
> > > > > >> > > > > > > then
> > > > > >> > > > > > > > only need to add one additional overload for each
> > > > > operator?
> > > > > >> > > > > > > >
> > > > > >> > > > > > > > Thanks,
> > > > > >> > > > > > > > Damian
> > > > > >> > > > > > > >
> > > > > >> > > > > > > > On Wed, 13 Sep 2017 at 10:59 Jeyhun Karimov <
> > > > > >> > > je.kari...@gmail.com>
> > > > > >> > > > > > > wrote:
> > > > > >> > > > > > > >
> > > > > >> > > > > > > > > Dear all,
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > I would like to resume the discussion on
> KIP-159.
> > I
> > > > (and
> > > > > >> > > > Guozhang)
> > > > > >> > > > > > > think
> > > > > >> > > > > > > > > that releasing KIP-149 and KIP-159 in the same
> > > release
> > > > > >> would
> > > > > >> > > make
> > > > > >> > > > > > sense
> > > > > >> > > > > > > > to
> > > > > >> > > > > > > > > avoid a release with "partial" public APIs.
> There
> > > is a
> > > > > KIP
> > > > > >> > [1]
> > > > > >> > > > > > proposed
> > > > > >> > > > > > > > by
> > > > > >> > > > > > > > > Guozhang (and approved by me) to unify both
> KIPs.
> > > > > >> > > > > > > > > Please feel free to comment on this.
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > [1]
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > https://cwiki.apache.org/
> confluence/pages/viewpage.
> > > > > >> > > > > > > action?pageId=73637757
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > Cheers,
> > > > > >> > > > > > > > > Jeyhun
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > On Fri, Jul 21, 2017 at 2:00 AM Jeyhun Karimov <
> > > > > >> > > > > je.kari...@gmail.com
> > > > > >> > > > > > >
> > > > > >> > > > > > > > > wrote:
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > > Hi Matthias, Damian, all,
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > > Thanks for your comments and sorry for
> > super-late
> > > > > >> update.
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > > Sure, the DSL refactoring is not blocking for
> > this
> > > > > KIP.
> > > > > >> > > > > > > > > > I made some changes to KIP document based on
> my
> > > > > >> prototype.
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > > Please feel free to comment.
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > > Cheers,
> > > > > >> > > > > > > > > > Jeyhun
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > > On Fri, Jul 7, 2017 at 9:35 PM Matthias J.
> Sax <
> > > > > >> > > > > > > matth...@confluent.io>
> > > > > >> > > > > > > > > > wrote:
> > > > > >> > > > > > > > > >
> > > > > >> > > > > > > > > >> I would not block this KIP with regard to DSL
> > > > > >> refactoring.
> > > > > >> > > > IMHO,
> > > > > >> > > > > > we
> > > > > >> > > > > > > > can
> > > > > >> > > > > > > > > >> just finish this one and the DSL refactoring
> > will
> > > > > help
> > > > > >> > later
> > > > > >> > > > on
> > > > > >> > > > > to
> > > > > >> > > > > > > > > >> reduce the number of overloads.
> > > > > >> > > > > > > > > >>
> > > > > >> > > > > > > > > >> -Matthias
> > > > > >> > > > > > > > > >>
> > > > > >> > > > > > > > > >> On 7/7/17 5:28 AM, Jeyhun Karimov wrote:
> > > > > >> > > > > > > > > >> > I am following the related thread in the
> > > mailing
> > > > > list
> > > > > >> > and
> > > > > >> > > > > > looking
> > > > > >> > > > > > > > > >> forward
> > > > > >> > > > > > > > > >> > for one-shot solution for overloads issue.
> > > > > >> > > > > > > > > >> >
> > > > > >> > > > > > > > > >> > Cheers,
> > > > > >> > > > > > > > > >> > Jeyhun
> > > > > >> > > > > > > > > >> >
> > > > > >> > > > > > > > > >> > On Fri, Jul 7, 2017 at 10:32 AM Damian Guy
> <
> > > > > >> > > > > > damian....@gmail.com>
> > > > > >> > > > > > > > > >> wrote:
> > > > > >> > > > > > > > > >> >
> > > > > >> > > > > > > > > >> >> Hi Jeyhun,
> > > > > >> > > > > > > > > >> >>
> > > > > >> > > > > > > > > >> >> About overrides, what other alternatives
> do
> > we
> > > > > have?
> > > > > >> > For
> > > > > >> > > > > > > > > >> >>> backwards-compatibility we have to add
> > extra
> > > > > >> methods
> > > > > >> > to
> > > > > >> > > > the
> > > > > >> > > > > > > > existing
> > > > > >> > > > > > > > > >> >> ones.
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >> It wasn't clear to me in the KIP if these
> > are
> > > > new
> > > > > >> > methods
> > > > > >> > > > or
> > > > > >> > > > > > > > > replacing
> > > > > >> > > > > > > > > >> >> existing ones.
> > > > > >> > > > > > > > > >> >> Also, we are currently discussing options
> > for
> > > > > >> replacing
> > > > > >> > > the
> > > > > >> > > > > > > > > overrides.
> > > > > >> > > > > > > > > >> >>
> > > > > >> > > > > > > > > >> >> Thanks,
> > > > > >> > > > > > > > > >> >> Damian
> > > > > >> > > > > > > > > >> >>
> > > > > >> > > > > > > > > >> >>
> > > > > >> > > > > > > > > >> >>> About ProcessorContext vs RecordContext,
> > you
> > > > are
> > > > > >> > right.
> > > > > >> > > I
> > > > > >> > > > > > think
> > > > > >> > > > > > > I
> > > > > >> > > > > > > > > >> need to
> > > > > >> > > > > > > > > >> >>> implement a prototype to understand the
> > full
> > > > > >> picture
> > > > > >> > as
> > > > > >> > > > some
> > > > > >> > > > > > > parts
> > > > > >> > > > > > > > > of
> > > > > >> > > > > > > > > >> the
> > > > > >> > > > > > > > > >> >>> KIP might not be as straightforward as I
> > > > thought.
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >>> Cheers,
> > > > > >> > > > > > > > > >> >>> Jeyhun
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >>> On Wed, Jul 5, 2017 at 10:40 AM Damian
> Guy
> > <
> > > > > >> > > > > > > damian....@gmail.com>
> > > > > >> > > > > > > > > >> wrote:
> > > > > >> > > > > > > > > >> >>>
> > > > > >> > > > > > > > > >> >>>> HI Jeyhun,
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>> Is the intention that these methods are
> > new
> > > > > >> overloads
> > > > > >> > > on
> > > > > >> > > > > the
> > > > > >> > > > > > > > > KStream,
> > > > > >> > > > > > > > > >> >>>> KTable, etc?
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>> It is worth noting that a
> ProcessorContext
> > > is
> > > > > not
> > > > > >> a
> > > > > >> > > > > > > > RecordContext.
> > > > > >> > > > > > > > > A
> > > > > >> > > > > > > > > >> >>>> RecordContext, as it stands, only exists
> > > > during
> > > > > >> the
> > > > > >> > > > > > processing
> > > > > >> > > > > > > > of a
> > > > > >> > > > > > > > > >> >>> single
> > > > > >> > > > > > > > > >> >>>> record. Whereas the ProcessorContext
> > exists
> > > > for
> > > > > >> the
> > > > > >> > > > > lifetime
> > > > > >> > > > > > of
> > > > > >> > > > > > > > the
> > > > > >> > > > > > > > > >> >>>> Processor. Sot it doesn't make sense to
> > > cast a
> > > > > >> > > > > > ProcessorContext
> > > > > >> > > > > > > > to
> > > > > >> > > > > > > > > a
> > > > > >> > > > > > > > > >> >>>> RecordContext.
> > > > > >> > > > > > > > > >> >>>> You mentioned above passing the
> > > > > >> > > InternalProcessorContext
> > > > > >> > > > to
> > > > > >> > > > > > the
> > > > > >> > > > > > > > > >> init()
> > > > > >> > > > > > > > > >> >>>> calls. It is internal for a reason and i
> > > think
> > > > > it
> > > > > >> > > should
> > > > > >> > > > > > remain
> > > > > >> > > > > > > > > that
> > > > > >> > > > > > > > > >> >> way.
> > > > > >> > > > > > > > > >> >>>> It might be better to move the
> > > recordContext()
> > > > > >> method
> > > > > >> > > > from
> > > > > >> > > > > > > > > >> >>>> InternalProcessorContext to
> > > ProcessorContext.
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>> In the KIP you have an example showing:
> > > > > >> > > > > > > > > >> >>>> richMapper.init((RecordContext)
> > > > > processorContext);
> > > > > >> > > > > > > > > >> >>>> But the interface is:
> > > > > >> > > > > > > > > >> >>>> public interface RichValueMapper<V, VR>
> {
> > > > > >> > > > > > > > > >> >>>>     VR apply(final V value, final
> > > > RecordContext
> > > > > >> > > > > > recordContext);
> > > > > >> > > > > > > > > >> >>>> }
> > > > > >> > > > > > > > > >> >>>> i.e., there is no init(...), besides as
> > > above
> > > > > this
> > > > > >> > > > wouldn't
> > > > > >> > > > > > > make
> > > > > >> > > > > > > > > >> sense.
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>> Thanks,
> > > > > >> > > > > > > > > >> >>>> Damian
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>> On Tue, 4 Jul 2017 at 23:30 Jeyhun
> > Karimov <
> > > > > >> > > > > > > je.kari...@gmail.com
> > > > > >> > > > > > > > >
> > > > > >> > > > > > > > > >> >> wrote:
> > > > > >> > > > > > > > > >> >>>>
> > > > > >> > > > > > > > > >> >>>>> Hi Matthias,
> > > > > >> > > > > > > > > >> >>>>>
> > > > > >> > > > > > > > > >> >>>>> Actually my intend was to provide to
> > > > > >> RichInitializer
> > > > > >> > > and
> > > > > >> > > > > > later
> > > > > >> > > > > > > > on
> > > > > >> > > > > > > > > we
> > > > > >> > > > > > > > > >> >>>> could
> > > > > >> > > > > > > > > >> >>>>> provide the context of the record as
> you
> > > also
> > > > > >> > > mentioned.
> > > > > >> > > > > > > > > >> >>>>> I remove that not to confuse the users.
> > > > > >> > > > > > > > > >> >>>>> Regarding the RecordContext and
> > > > > ProcessorContext
> > > > > >> > > > > > interfaces, I
> > > > > >> > > > > > > > > just
> > > > > >> > > > > > > > > >> >>>>> realized the InternalProcessorContext
> > > class.
> > > > > >> Can't
> > > > > >> > we
> > > > > >> > > > pass
> > > > > >> > > > > > > this
> > > > > >> > > > > > > > > as a
> > > > > >> > > > > > > > > >> >>>>> parameter to init() method of
> processors?
> > > > Then
> > > > > we
> > > > > >> > > would
> > > > > >> > > > be
> > > > > >> > > > > > > able
> > > > > >> > > > > > > > to
> > > > > >> > > > > > > > > >> >> get
> > > > > >> > > > > > > > > >> >>>>> RecordContext easily with just a method
> > > call.
> > > > > >> > > > > > > > > >> >>>>>
> > > > > >> > > > > > > > > >> >>>>>
> > > > > >> > > > > > > > > >> >>>>> Cheers,
> > > > > >> > > > > > > > > >> >>>>> Jeyhun
> > > > > >> > > > > > > > > >> >>>>>
> > > > > >> > > > > > > > > >> >>>>> On Thu, Jun 29, 2017 at 10:14 PM
> Matthias
> > > J.
> > > > > Sax
> > > > > >> <
> > > > > >> > > > > > > > > >> >>> matth...@confluent.io>
> > > > > >> > > > > > > > > >> >>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>
> > > > > >> > > > > > > > > >> >>>>>> One more thing:
> > > > > >> > > > > > > > > >> >>>>>>
> > > > > >> > > > > > > > > >> >>>>>> I don't think `RichInitializer` does
> > make
> > > > > >> sense. As
> > > > > >> > > we
> > > > > >> > > > > > don't
> > > > > >> > > > > > > > have
> > > > > >> > > > > > > > > >> >> any
> > > > > >> > > > > > > > > >> >>>>>> input record, there is also no
> context.
> > We
> > > > > >> could of
> > > > > >> > > > > course
> > > > > >> > > > > > > > > provide
> > > > > >> > > > > > > > > >> >>> the
> > > > > >> > > > > > > > > >> >>>>>> context of the record that triggers
> the
> > > init
> > > > > >> call,
> > > > > >> > > but
> > > > > >> > > > > this
> > > > > >> > > > > > > > seems
> > > > > >> > > > > > > > > >> >> to
> > > > > >> > > > > > > > > >> >>> be
> > > > > >> > > > > > > > > >> >>>>>> semantically questionable. Also, the
> > > context
> > > > > for
> > > > > >> > this
> > > > > >> > > > > first
> > > > > >> > > > > > > > > record
> > > > > >> > > > > > > > > >> >>> will
> > > > > >> > > > > > > > > >> >>>>>> be provided by the consecutive call to
> > > > > aggregate
> > > > > >> > > > anyways.
> > > > > >> > > > > > > > > >> >>>>>>
> > > > > >> > > > > > > > > >> >>>>>>
> > > > > >> > > > > > > > > >> >>>>>> -Matthias
> > > > > >> > > > > > > > > >> >>>>>>
> > > > > >> > > > > > > > > >> >>>>>> On 6/29/17 1:11 PM, Matthias J. Sax
> > wrote:
> > > > > >> > > > > > > > > >> >>>>>>> Thanks for updating the KIP.
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>> I have one concern with regard to
> > > backward
> > > > > >> > > > > compatibility.
> > > > > >> > > > > > > You
> > > > > >> > > > > > > > > >> >>> suggest
> > > > > >> > > > > > > > > >> >>>>> to
> > > > > >> > > > > > > > > >> >>>>>>> use RecrodContext as base interface
> for
> > > > > >> > > > > ProcessorContext.
> > > > > >> > > > > > > This
> > > > > >> > > > > > > > > >> >> will
> > > > > >> > > > > > > > > >> >>>>>>> break compatibility.
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>> I think, we should just have two
> > > > independent
> > > > > >> > > > interfaces.
> > > > > >> > > > > > Our
> > > > > >> > > > > > > > own
> > > > > >> > > > > > > > > >> >>>>>>> ProcessorContextImpl class would
> > > implement
> > > > > >> both.
> > > > > >> > > This
> > > > > >> > > > > > allows
> > > > > >> > > > > > > > us
> > > > > >> > > > > > > > > >> >> to
> > > > > >> > > > > > > > > >> >>>> cast
> > > > > >> > > > > > > > > >> >>>>>>> it to `RecordContext` and thus limit
> > the
> > > > > >> visible
> > > > > >> > > > scope.
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>> -Matthias
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>> On 6/27/17 1:35 PM, Jeyhun Karimov
> > wrote:
> > > > > >> > > > > > > > > >> >>>>>>>> Hi all,
> > > > > >> > > > > > > > > >> >>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>> I updated the KIP w.r.t. discussion
> > and
> > > > > >> comments.
> > > > > >> > > > > > > > > >> >>>>>>>> Basically I eliminated overloads for
> > > > > >> particular
> > > > > >> > > > method
> > > > > >> > > > > if
> > > > > >> > > > > > > > they
> > > > > >> > > > > > > > > >> >> are
> > > > > >> > > > > > > > > >> >>>>> more
> > > > > >> > > > > > > > > >> >>>>>>>> than 3.
> > > > > >> > > > > > > > > >> >>>>>>>> As we can see there are a lot of
> > > overloads
> > > > > >> (and
> > > > > >> > > more
> > > > > >> > > > > will
> > > > > >> > > > > > > > come
> > > > > >> > > > > > > > > >> >>> with
> > > > > >> > > > > > > > > >> >>>>>> KIP-149
> > > > > >> > > > > > > > > >> >>>>>>>> :) )
> > > > > >> > > > > > > > > >> >>>>>>>> So, is it wise to
> > > > > >> > > > > > > > > >> >>>>>>>> wait the result of constructive DSL
> > > thread
> > > > > or
> > > > > >> > > > > > > > > >> >>>>>>>> extend KIP to address this issue as
> > well
> > > > or
> > > > > >> > > > > > > > > >> >>>>>>>> continue as it is?
> > > > > >> > > > > > > > > >> >>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>> Cheers,
> > > > > >> > > > > > > > > >> >>>>>>>> Jeyhun
> > > > > >> > > > > > > > > >> >>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>> On Wed, Jun 14, 2017 at 11:29 PM
> > > Guozhang
> > > > > >> Wang <
> > > > > >> > > > > > > > > >> >>> wangg...@gmail.com>
> > > > > >> > > > > > > > > >> >>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>> LGTM. Thanks!
> > > > > >> > > > > > > > > >> >>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>> Guozhang
> > > > > >> > > > > > > > > >> >>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>> On Tue, Jun 13, 2017 at 2:20 PM,
> > Jeyhun
> > > > > >> Karimov
> > > > > >> > <
> > > > > >> > > > > > > > > >> >>>>> je.kari...@gmail.com>
> > > > > >> > > > > > > > > >> >>>>>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>> Thanks for the comment Matthias.
> > After
> > > > all
> > > > > >> the
> > > > > >> > > > > > discussion
> > > > > >> > > > > > > > > >> >>> (thanks
> > > > > >> > > > > > > > > >> >>>> to
> > > > > >> > > > > > > > > >> >>>>>> all
> > > > > >> > > > > > > > > >> >>>>>>>>>> participants), I think this
> (single
> > > > method
> > > > > >> that
> > > > > >> > > > > passes
> > > > > >> > > > > > > in a
> > > > > >> > > > > > > > > >> >>>>>> RecordContext
> > > > > >> > > > > > > > > >> >>>>>>>>>> object) is the best alternative.
> > > > > >> > > > > > > > > >> >>>>>>>>>> Just a side note: I think
> KAFKA-3907
> > > [1]
> > > > > can
> > > > > >> > also
> > > > > >> > > > be
> > > > > >> > > > > > > > > >> >> integrated
> > > > > >> > > > > > > > > >> >>>> into
> > > > > >> > > > > > > > > >> >>>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>> KIP by adding related method
> inside
> > > > > >> > RecordContext
> > > > > >> > > > > > > > interface.
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>> [1]
> > > > > >> > > > https://issues.apache.org/jira/browse/KAFKA-3907
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>> Cheers,
> > > > > >> > > > > > > > > >> >>>>>>>>>> Jeyhun
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>> On Tue, Jun 13, 2017 at 7:50 PM
> > > Matthias
> > > > > J.
> > > > > >> > Sax <
> > > > > >> > > > > > > > > >> >>>>>> matth...@confluent.io>
> > > > > >> > > > > > > > > >> >>>>>>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> Hi,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> I would like to push this
> > discussion
> > > > > >> further.
> > > > > >> > It
> > > > > >> > > > > seems
> > > > > >> > > > > > > we
> > > > > >> > > > > > > > > got
> > > > > >> > > > > > > > > >> >>>> nice
> > > > > >> > > > > > > > > >> >>>>>>>>>>> alternatives (thanks for the
> > summary
> > > > > >> Jeyhun!).
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> With respect to RichFunctions and
> > > > > allowing
> > > > > >> > them
> > > > > >> > > to
> > > > > >> > > > > be
> > > > > >> > > > > > > > > >> >>> stateful, I
> > > > > >> > > > > > > > > >> >>>>>> have
> > > > > >> > > > > > > > > >> >>>>>>>>>>> my doubt as expressed already.
> From
> > > my
> > > > > >> > > > > understanding,
> > > > > >> > > > > > > the
> > > > > >> > > > > > > > > >> >> idea
> > > > > >> > > > > > > > > >> >>>> was
> > > > > >> > > > > > > > > >> >>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>> give access to record metadata
> > > > > information
> > > > > >> > only.
> > > > > >> > > > If
> > > > > >> > > > > > you
> > > > > >> > > > > > > > want
> > > > > >> > > > > > > > > >> >> to
> > > > > >> > > > > > > > > >> >>>> do
> > > > > >> > > > > > > > > >> >>>>> a
> > > > > >> > > > > > > > > >> >>>>>>>>>>> stateful computation you should
> > > rather
> > > > > use
> > > > > >> > > > > > #transform().
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> Furthermore, as pointed out, we
> > would
> > > > > need
> > > > > >> to
> > > > > >> > > > switch
> > > > > >> > > > > > to
> > > > > >> > > > > > > a
> > > > > >> > > > > > > > > >> >>>>>>>>>>> supplier-pattern introducing many
> > > more
> > > > > >> > > overloads.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> For those reason, I advocate for
> a
> > > > simple
> > > > > >> > > > interface
> > > > > >> > > > > > > with a
> > > > > >> > > > > > > > > >> >>> single
> > > > > >> > > > > > > > > >> >>>>>>>>> method
> > > > > >> > > > > > > > > >> >>>>>>>>>>> that passes in a RecordContext
> > > object.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> -Matthias
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> On 6/6/17 5:15 PM, Guozhang Wang
> > > wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> Thanks for the comprehensive
> > > summary!
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> Personally I'd prefer the option
> > of
> > > > > >> passing
> > > > > >> > > > > > > RecordContext
> > > > > >> > > > > > > > > as
> > > > > >> > > > > > > > > >> >>> an
> > > > > >> > > > > > > > > >> >>>>>>>>>>> additional
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> parameter into he overloaded
> > > function.
> > > > > But
> > > > > >> > I'm
> > > > > >> > > > also
> > > > > >> > > > > > > open
> > > > > >> > > > > > > > to
> > > > > >> > > > > > > > > >> >>>> other
> > > > > >> > > > > > > > > >> >>>>>>>>>>> arguments
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> if there are sth. that I have
> > > > > overlooked.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> Guozhang
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>> On Mon, Jun 5, 2017 at 3:19 PM,
> > > Jeyhun
> > > > > >> > Karimov
> > > > > >> > > <
> > > > > >> > > > > > > > > >> >>>>>> je.kari...@gmail.com
> > > > > >> > > > > > > > > >> >>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Hi,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Thanks for your comments
> Matthias
> > > and
> > > > > >> > > Guozhang.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Below I mention the quick
> summary
> > > of
> > > > > the
> > > > > >> > main
> > > > > >> > > > > > > > alternatives
> > > > > >> > > > > > > > > >> >> we
> > > > > >> > > > > > > > > >> >>>>>> looked
> > > > > >> > > > > > > > > >> >>>>>>>>>> at
> > > > > >> > > > > > > > > >> >>>>>>>>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> introduce the Rich functions (I
> > > will
> > > > > >> refer
> > > > > >> > to
> > > > > >> > > it
> > > > > >> > > > > as
> > > > > >> > > > > > > Rich
> > > > > >> > > > > > > > > >> >>>>> functions
> > > > > >> > > > > > > > > >> >>>>>>>>>>> until we
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> find better/another name).
> > > Initially
> > > > > the
> > > > > >> > > > proposed
> > > > > >> > > > > > > > > >> >>> alternatives
> > > > > >> > > > > > > > > >> >>>>> was
> > > > > >> > > > > > > > > >> >>>>>>>>> not
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> backwards-compatible, so I will
> > not
> > > > > >> mention
> > > > > >> > > > them.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> The related discussions are
> > spread
> > > in
> > > > > >> > KIP-149
> > > > > >> > > > and
> > > > > >> > > > > in
> > > > > >> > > > > > > > this
> > > > > >> > > > > > > > > >> >> KIP
> > > > > >> > > > > > > > > >> >>>>>>>>>> (KIP-159)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> discussion threads.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> 1. The idea of rich functions
> > came
> > > > into
> > > > > >> the
> > > > > >> > > > stage
> > > > > >> > > > > > with
> > > > > >> > > > > > > > > >> >>> KIP-149,
> > > > > >> > > > > > > > > >> >>>>> in
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> discussion thread. As a result
> we
> > > > > >> extended
> > > > > >> > > > KIP-149
> > > > > >> > > > > > to
> > > > > >> > > > > > > > > >> >> support
> > > > > >> > > > > > > > > >> >>>>> Rich
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> functions as well.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> 2.  To as part of the Rich
> > > functions,
> > > > > we
> > > > > >> > > > provided
> > > > > >> > > > > > init
> > > > > >> > > > > > > > > >> >>>>>>>>>>> (ProcessorContext)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> method. Afterwards, Dammian
> > > suggested
> > > > > >> that
> > > > > >> > we
> > > > > >> > > > > should
> > > > > >> > > > > > > not
> > > > > >> > > > > > > > > >> >>>> provide
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> ProcessorContext to users. As a
> > > > result,
> > > > > >> we
> > > > > >> > > > > separated
> > > > > >> > > > > > > the
> > > > > >> > > > > > > > > >> >> two
> > > > > >> > > > > > > > > >> >>>>>>>>> problems
> > > > > >> > > > > > > > > >> >>>>>>>>>>> into
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> two separate KIPs, as it seems
> > they
> > > > can
> > > > > >> be
> > > > > >> > > > solved
> > > > > >> > > > > in
> > > > > >> > > > > > > > > >> >>> parallel.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> - One approach we considered
> was
> > :
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> public interface
> > > > ValueMapperWithKey<K,
> > > > > V,
> > > > > >> > VR>
> > > > > >> > > {
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     VR apply(final K key,
> final V
> > > > > value);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> public interface
> > RichValueMapper<K,
> > > > V,
> > > > > >> VR>
> > > > > >> > > > extends
> > > > > >> > > > > > > > > >> >>>> RichFunction{
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> public interface RichFunction {
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     void init(RecordContext
> > > > > >> recordContext);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     void close();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> public interface RecordContext
> {
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     String applicationId();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     TaskId taskId();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     StreamsMetrics metrics();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     String topic();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     int partition();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     long offset();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     long timestamp();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     Map<String, Object>
> > > appConfigs();
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>     Map<String, Object>
> > > > > >> > > > > appConfigsWithPrefix(String
> > > > > >> > > > > > > > > >> >> prefix);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> public interface
> ProcessorContext
> > > > > extends
> > > > > >> > > > > > > RecordContext
> > > > > >> > > > > > > > {
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>    // all methods but the ones
> in
> > > > > >> > > RecordContext
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> As a result:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> * . All "withKey" and
> > "withoutKey"
> > > > > >> > interfaces
> > > > > >> > > > can
> > > > > >> > > > > be
> > > > > >> > > > > > > > > >> >>> converted
> > > > > >> > > > > > > > > >> >>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>> their
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Rich counterparts (with empty
> > > init()
> > > > > and
> > > > > >> > > close()
> > > > > >> > > > > > > > methods)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> *. All related Processors will
> > > accept
> > > > > >> Rich
> > > > > >> > > > > > interfaces
> > > > > >> > > > > > > in
> > > > > >> > > > > > > > > >> >>> their
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> constructors.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> *. So, we convert the related
> > > > "withKey"
> > > > > >> or
> > > > > >> > > > > > > "withoutKey"
> > > > > >> > > > > > > > > >> >>>>> interfaces
> > > > > >> > > > > > > > > >> >>>>>>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>> Rich
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> interface while building the
> > > topology
> > > > > and
> > > > > >> > > > > initialize
> > > > > >> > > > > > > the
> > > > > >> > > > > > > > > >> >>>> related
> > > > > >> > > > > > > > > >> >>>>>>>>>>> processors
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> with Rich interfaces only.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> *. We will not need to
> overloaded
> > > > > methods
> > > > > >> > for
> > > > > >> > > > rich
> > > > > >> > > > > > > > > >> >> functions
> > > > > >> > > > > > > > > >> >>> as
> > > > > >> > > > > > > > > >> >>>>>> Rich
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> interfaces extend withKey
> > > interfaces.
> > > > > We
> > > > > >> > will
> > > > > >> > > > just
> > > > > >> > > > > > > check
> > > > > >> > > > > > > > > >> >> the
> > > > > >> > > > > > > > > >> >>>>> object
> > > > > >> > > > > > > > > >> >>>>>>>>>> type
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> and act accordingly.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> 3. There was some thoughts that
> > the
> > > > > above
> > > > > >> > > > approach
> > > > > >> > > > > > > does
> > > > > >> > > > > > > > > not
> > > > > >> > > > > > > > > >> >>>>> support
> > > > > >> > > > > > > > > >> >>>>>>>>>>> lambdas
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> so we should support only one
> > > method,
> > > > > >> only
> > > > > >> > > > > > > > > >> >>> init(RecordContext),
> > > > > >> > > > > > > > > >> >>>>> as
> > > > > >> > > > > > > > > >> >>>>>>>>>> part
> > > > > >> > > > > > > > > >> >>>>>>>>>>> of
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Rich interfaces.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> This is still in discussion.
> > > > > Personally I
> > > > > >> > > think
> > > > > >> > > > > Rich
> > > > > >> > > > > > > > > >> >>> interfaces
> > > > > >> > > > > > > > > >> >>>>> are
> > > > > >> > > > > > > > > >> >>>>>>>>> by
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> definition lambda-free and we
> > > should
> > > > > not
> > > > > >> > care
> > > > > >> > > > much
> > > > > >> > > > > > > about
> > > > > >> > > > > > > > > >> >> it.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> 4. Thanks to Matthias's
> > discussion,
> > > > an
> > > > > >> > > > alternative
> > > > > >> > > > > > we
> > > > > >> > > > > > > > > >> >>>> considered
> > > > > >> > > > > > > > > >> >>>>>> was
> > > > > >> > > > > > > > > >> >>>>>>>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> pass in the RecordContext as
> > method
> > > > > >> > parameter.
> > > > > >> > > > > This
> > > > > >> > > > > > > > might
> > > > > >> > > > > > > > > >> >>> even
> > > > > >> > > > > > > > > >> >>>>>>>>> allow
> > > > > >> > > > > > > > > >> >>>>>>>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> use Lambdas and we could keep
> the
> > > > name
> > > > > >> > > > > RichFunction
> > > > > >> > > > > > as
> > > > > >> > > > > > > > we
> > > > > >> > > > > > > > > >> >>>>> preserve
> > > > > >> > > > > > > > > >> >>>>>>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> nature of being a function.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> "If you go with `init()` and
> > > > `close()`
> > > > > we
> > > > > >> > > > > basically
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> allow users to have an
> in-memory
> > > > state
> > > > > >> for a
> > > > > >> > > > > > function.
> > > > > >> > > > > > > > > >> >> Thus,
> > > > > >> > > > > > > > > >> >>> we
> > > > > >> > > > > > > > > >> >>>>>>>>> cannot
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> share a single instance of
> > > > > >> RichValueMapper
> > > > > >> > > (etc)
> > > > > >> > > > > > over
> > > > > >> > > > > > > > > >> >>> multiple
> > > > > >> > > > > > > > > >> >>>>>> tasks
> > > > > >> > > > > > > > > >> >>>>>>>>>> and
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> we would need a supplier
> pattern
> > > > > similar
> > > > > >> to
> > > > > >> > > > > > > > #transform().
> > > > > >> > > > > > > > > >> >> And
> > > > > >> > > > > > > > > >> >>>>> this
> > > > > >> > > > > > > > > >> >>>>>>>>>> would
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> "break the flow" of the API, as
> > > > > >> > > > > > > > (Rich)ValueMapperSupplier
> > > > > >> > > > > > > > > >> >>> would
> > > > > >> > > > > > > > > >> >>>>> not
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> inherit from ValueMapper and
> thus
> > > we
> > > > > >> would
> > > > > >> > > need
> > > > > >> > > > > many
> > > > > >> > > > > > > new
> > > > > >> > > > > > > > > >> >>>> overload
> > > > > >> > > > > > > > > >> >>>>>>>>> for
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> KStream/KTable classes". (Copy
> > > paste
> > > > > from
> > > > > >> > > > > Matthias's
> > > > > >> > > > > > > > > email)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Cheers,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> Jeyhun
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> On Mon, Jun 5, 2017 at 5:18 AM
> > > > Matthias
> > > > > >> J.
> > > > > >> > > Sax <
> > > > > >> > > > > > > > > >> >>>>>>>>> matth...@confluent.io
> > > > > >> > > > > > > > > >> >>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> Yes, we did consider this, and
> > > there
> > > > > is
> > > > > >> no
> > > > > >> > > > > > consensus
> > > > > >> > > > > > > > yet
> > > > > >> > > > > > > > > >> >>> what
> > > > > >> > > > > > > > > >> >>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>> best
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> alternative is.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> @Jeyhun: the email thread got
> > > pretty
> > > > > >> long.
> > > > > >> > > > Maybe
> > > > > >> > > > > > you
> > > > > >> > > > > > > > can
> > > > > >> > > > > > > > > >> >>> give
> > > > > >> > > > > > > > > >> >>>> a
> > > > > >> > > > > > > > > >> >>>>>>>>> quick
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> summary of the current state
> of
> > > the
> > > > > >> > > discussion?
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> -Matthias
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> On 6/4/17 6:04 PM, Guozhang
> Wang
> > > > > wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> Thanks for the explanation
> > Jeyhun
> > > > and
> > > > > >> > > > Matthias.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> I have just read through both
> > > > KIP-149
> > > > > >> and
> > > > > >> > > > > KIP-159
> > > > > >> > > > > > > and
> > > > > >> > > > > > > > am
> > > > > >> > > > > > > > > >> >>>>>> wondering
> > > > > >> > > > > > > > > >> >>>>>>>>>> if
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> you
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> guys have considered a slight
> > > > > different
> > > > > >> > > > approach
> > > > > >> > > > > > for
> > > > > >> > > > > > > > > rich
> > > > > >> > > > > > > > > >> >>>>>>>>> function,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> that
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> is
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> to add the `RecordContext`
> into
> > > the
> > > > > >> apply
> > > > > >> > > > > > functions
> > > > > >> > > > > > > as
> > > > > >> > > > > > > > > an
> > > > > >> > > > > > > > > >> >>>>>>>>> additional
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> parameter. For example:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> ---------------------------
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> interface RichValueMapper<V,
> > VR>
> > > {
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> VR apply(final V value, final
> > > > > >> > RecordContext
> > > > > >> > > > > > > context);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> }
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> ...
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> // then in KStreams
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> <VR> KStream<K, VR>
> > > > > >> > mapValues(ValueMapper<?
> > > > > >> > > > > super
> > > > > >> > > > > > > V, ?
> > > > > >> > > > > > > > > >> >>>> extends
> > > > > >> > > > > > > > > >> >>>>>> VR>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> mapper);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> <VR> KStream<K, VR>
> > > > > >> > > > > > > > mapValueswithContext(RichValueMapper
> > > > > >> > > > > > > > > >> >> <?
> > > > > >> > > > > > > > > >> >>>>> super
> > > > > >> > > > > > > > > >> >>>>>>>>>> V, ?
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> extends VR> mapper);
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> ------------------------------
> > -
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> The caveat is that it will
> > > > introduces
> > > > > >> more
> > > > > >> > > > > > > overloads;
> > > > > >> > > > > > > > > >> >> but I
> > > > > >> > > > > > > > > >> >>>>> think
> > > > > >> > > > > > > > > >> >>>>>>>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> #.overloads are mainly
> > introduced
> > > > by
> > > > > 1)
> > > > > >> > > serde
> > > > > >> > > > > > > > overrides
> > > > > >> > > > > > > > > >> >> and
> > > > > >> > > > > > > > > >> >>>> 2)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> state-store-supplier
> overides,
> > > both
> > > > > of
> > > > > >> > which
> > > > > >> > > > can
> > > > > >> > > > > > be
> > > > > >> > > > > > > > > >> >> reduced
> > > > > >> > > > > > > > > >> >>>> in
> > > > > >> > > > > > > > > >> >>>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>>> near
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> future, and I felt this
> > > overloading
> > > > > is
> > > > > >> > still
> > > > > >> > > > > > > > worthwhile,
> > > > > >> > > > > > > > > >> >> as
> > > > > >> > > > > > > > > >> >>>> it
> > > > > >> > > > > > > > > >> >>>>>> has
> > > > > >> > > > > > > > > >> >>>>>>>>>> the
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> following benefits:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> 1) still allow lambda
> > > expressions.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> 2) clearer code path (do not
> > need
> > > > to
> > > > > >> > > "convert"
> > > > > >> > > > > > from
> > > > > >> > > > > > > > > >> >>> non-rich
> > > > > >> > > > > > > > > >> >>>>>>>>>> functions
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> to
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> rich functions)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> Maybe this approach has
> already
> > > > been
> > > > > >> > > discussed
> > > > > >> > > > > > and I
> > > > > >> > > > > > > > may
> > > > > >> > > > > > > > > >> >>> have
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> overlooked
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>> in
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> the email thread; anyways,
> lmk.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> Guozhang
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> On Thu, Jun 1, 2017 at 10:18
> > PM,
> > > > > >> Matthias
> > > > > >> > J.
> > > > > >> > > > > Sax <
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> matth...@confluent.io>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>> wrote:
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> I agree with Jeyhun. As
> > already
> > > > > >> mention,
> > > > > >> > > the
> > > > > >> > > > > > > overall
> > > > > >> > > > > > > > > API
> > > > > >> > > > > > > > > >> >>>>>>>>>> improvement
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ideas are overlapping and/or
> > > > > >> > contradicting
> > > > > >> > > > each
> > > > > >> > > > > > > > other.
> > > > > >> > > > > > > > > >> >> For
> > > > > >> > > > > > > > > >> >>>>> this
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> reason,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> not all ideas can be
> > > accomplished
> > > > > and
> > > > > >> > some
> > > > > >> > > > Jira
> > > > > >> > > > > > > might
> > > > > >> > > > > > > > > >> >> just
> > > > > >> > > > > > > > > >> >>>> be
> > > > > >> > > > > > > > > >> >>>>>>>>>> closed
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> as
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> "won't fix".
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> For this reason, we try to
> do
> > > > those
> > > > > >> KIP
> > > > > >> > > > > > discussion
> > > > > >> > > > > > > > with
> > > > > >> > > > > > > > > >> >>> are
> > > > > >> > > > > > > > > >> >>>>>> large
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> scope
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> to get an overall picture to
> > > > > converge
> > > > > >> to
> > > > > >> > an
> > > > > >> > > > > > overall
> > > > > >> > > > > > > > > >> >>>> consisted
> > > > > >> > > > > > > > > >> >>>>>>>>> API.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> @Jeyhun: about the
> overloads.
> > > Yes,
> > > > > we
> > > > > >> > might
> > > > > >> > > > get
> > > > > >> > > > > > > more
> > > > > >> > > > > > > > > >> >>>> overload.
> > > > > >> > > > > > > > > >> >>>>>> It
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> might
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> be sufficient though, to do
> a
> > > > single
> > > > > >> > > > > > > xxxWithContext()
> > > > > >> > > > > > > > > >> >>>> overload
> > > > > >> > > > > > > > > >> >>>>>>>>> that
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> will
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> provide key+value+context.
> > > > > Otherwise,
> > > > > >> if
> > > > > >> > > > might
> > > > > >> > > > > > get
> > > > > >> > > > > > > > too
> > > > > >> > > > > > > > > >> >>> messy
> > > > > >> > > > > > > > > >> >>>>>>>>> having
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> ValueMapper,
> > ValueMapperWithKey,
> > > > > >> > > > > > > > > ValueMapperWithContext,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> ValueMapperWithKeyWithContext.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On the other hand, we also
> > have
> > > > the
> > > > > >> > > "builder
> > > > > >> > > > > > > pattern"
> > > > > >> > > > > > > > > >> >> idea
> > > > > >> > > > > > > > > >> >>>> as
> > > > > >> > > > > > > > > >> >>>>> an
> > > > > >> > > > > > > > > >> >>>>>>>>>> API
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> change and this might
> mitigate
> > > the
> > > > > >> > overload
> > > > > >> > > > > > > problem.
> > > > > >> > > > > > > > > Not
> > > > > >> > > > > > > > > >> >>> for
> > > > > >> > > > > > > > > >> >>>>>>>>> simple
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> function like map/flatMap
> etc
> > > but
> > > > > for
> > > > > >> > joins
> > > > > >> > > > and
> > > > > >> > > > > > > > > >> >>>> aggregations.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On the other hand, as I
> > > mentioned
> > > > in
> > > > > >> an
> > > > > >> > > older
> > > > > >> > > > > > > email,
> > > > > >> > > > > > > > I
> > > > > >> > > > > > > > > >> >> am
> > > > > >> > > > > > > > > >> >>>>>>>>>> personally
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> fine to break the pure
> > > functional
> > > > > >> > > interface,
> > > > > >> > > > > and
> > > > > >> > > > > > > add
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>   - interface
> > WithRecordContext
> > > > with
> > > > > >> > method
> > > > > >> > > > > > > > > >> >>>>>> `open(RecordContext)`
> > > > > >> > > > > > > > > >> >>>>>>>>>> (or
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> `init(...)`, or any better
> > name)
> > > > --
> > > > > >> but
> > > > > >> > not
> > > > > >> > > > > > > > `close()`)
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>   - interface
> > > > > >> > ValueMapperWithRecordContext
> > > > > >> > > > > > extends
> > > > > >> > > > > > > > > >> >>>>> ValueMapper,
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> WithRecordContext
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> This would allow us to avoid
> > any
> > > > > >> > overload.
> > > > > >> > > Of
> > > > > >> > > > > > > course,
> > > > > >> > > > > > > > > we
> > > > > >> > > > > > > > > >> >>>> don't
> > > > > >> > > > > > > > > >> >>>>>>>>> get
> > > > > >> > > > > > > > > >> >>>>>>>>>> a
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> "pure function" interface
> and
> > > also
> > > > > >> > > sacrifices
> > > > > >> > > > > > > > Lambdas.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> I am personally a little bit
> > > > > undecided
> > > > > >> > what
> > > > > >> > > > the
> > > > > >> > > > > > > > better
> > > > > >> > > > > > > > > >> >>>> option
> > > > > >> > > > > > > > > >> >>>>>>>>> might
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>> be.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> Curious to hear what other
> > think
> > > > > about
> > > > > >> > this
> > > > > >> > > > > trade
> > > > > >> > > > > > > > off.
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> -Matthias
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>>
> > > > > >> > > > > > > > > >> >>>>>>>>>>>>>>>> On 6/1/17 6:13 PM, Jeyhun
> > > Karimov
> > > > > >> wrote:<
> > >
> >
>
>
>
> --
> -- Guozhang
>

Reply via email to