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

Reply via email to