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:
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> Hi Guozhang,
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> It subsumes partially. Initially the
>> > idea
>> > > > was
>> > > > > to
>> > > > > > > > > >> >> support
>> > > > > > > > > >> >>>>>>>>>>>>> RichFunctions
>> > > > > > > > > >> >>>>>>>>>>>>>>>> as a
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> separate interface. Throughout the
>> > > > discussion,
>> > > > > > > > > however,
>> > > > > > > > > >> >>> we
>> > > > > > > > > >> >>>>>>>>>>> considered
>> > > > > > > > > >> >>>>>>>>>>>>>>>> maybe
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> overloading the related methods (with
>> > > > > > RecodContext
>> > > > > > > > > >> >> param)
>> > > > > > > > > >> >>>> is
>> > > > > > > > > >> >>>>>>>>>> better
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> approach than providing a separate
>> > > > > RichFunction
>> > > > > > > > > >> >>> interface.
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> Cheers,
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> Jeyhun
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>> On Fri, Jun 2, 2017 at 2:27 AM
>> Guozhang
>> > > > Wang <
>> > > > > > > > > >> >>>>>>>>> wangg...@gmail.com>
>> > > > > > > > > >> >>>>>>>>>>>>>> wrote:
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> Does this KIP subsume this ticket as
>> > > well?
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> https://issues.apache.org/
>> > > > > > jira/browse/KAFKA-4125
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> On Sat, May 20, 2017 at 9:05 AM,
>> Jeyhun
>> > > > > > Karimov <
>> > > > > > > > > >> >>>>>>>>>>>>> je.kari...@gmail.com
>> > > > > > > > > >> >>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> wrote:
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Dear community,
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> As we discussed in KIP-149
>> [DISCUSS]
>> > > > thread
>> > > > > > > [1], I
>> > > > > > > > > >> >>> would
>> > > > > > > > > >> >>>>> like
>> > > > > > > > > >> >>>>>>>>> to
>> > > > > > > > > >> >>>>>>>>>>>>>>>> initiate
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> KIP for rich functions (interfaces)
>> > [2].
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> I would like to get your comments.
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> [1]
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>
>> > > > http://search-hadoop.com/m/Kafka/uyzND1PMjdk2CslH12?subj=
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > Re+DISCUSS+KIP+149+Enabling+key+access+in+
>> > > > > > > > > >> >>>>>>>>>>>>>>>> ValueTransformer+ValueMapper+
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> and+ValueJoiner
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> [2]
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> 159%3A+Introducing+Rich+
>> > > > > functions+to+Streams
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Cheers,
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Jeyhun
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> --
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> -Cheers
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>> Jeyhun
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> --
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>> -- Guozhang
>> > > > > > > > > >> >>>>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>>> --
>> > > > > > > > > >> >>>>>>>>>>>>> -Cheers
>> > > > > > > > > >> >>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>> Jeyhun
>> > > > > > > > > >> >>>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>>> --
>> > > > > > > > > >> >>>>>>>>>> -Cheers
>> > > > > > > > > >> >>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>> Jeyhun
>> > > > > > > > > >> >>>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>
>> > > > > > > > > >> >>>>>>>>>
>> > > > > > > > > >> >>>>>>>>> --
>> > > > > > > > > >> >>>>>>>>> -- Guozhang
>> > > > > > > > > >> >>>>>>>>>
>> > > > > > > > > >> >>>>>>>
>> > > > > > > > > >> >>>>>>
>> > > > > > > > > >> >>>>>> --
>> > > > > > > > > >> >>>>> -Cheers
>> > > > > > > > > >> >>>>>
>> > > > > > > > > >> >>>>> Jeyhun
>> > > > > > > > > >> >>>>>
>> > > > > > > > > >> >>>>
>> > > > > > > > > >> >>> --
>> > > > > > > > > >> >>> -Cheers
>> > > > > > > > > >> >>>
>> > > > > > > > > >> >>> Jeyhun
>> > > > > > > > > >> >>>
>> > > > > > > > > >> >>
>> > > > > > > > > >>
>> > > > > > > > > >> --
>> > > > > > > > > > -Cheers
>> > > > > > > > > >
>> > > > > > > > > > Jeyhun
>> > > > > > > > > >
>> > > > > > > > > --
>> > > > > > > > > -Cheers
>> > > > > > > > >
>> > > > > > > > > Jeyhun
>> > > > > > > > >
>> > > > > > > >
>> > > > > > > --
>> > > > > > > -Cheers
>> > > > > > >
>> > > > > > > Jeyhun
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > > >
>> > > >
>> > > > --
>> > > > -- Guozhang
>> > > >
>> > >
>> >
>>
>

Reply via email to