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
>

Reply via email to