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