Jeyhun,

I was just wondering if you did look into the key-deep-copy idea we
discussed. I am curious to see what the impact might be.


-Matthias

On 5/20/17 2:03 AM, Jeyhun Karimov wrote:
> Hi,
> 
> Thanks for your comments. I rethink about including rich functions into
> this KIP.
> I think once we include rich functions in this KIP and then fix
> ProcessorContext in another KIP and incorporate with existing rich
> functions, the code will not be backwards compatible.
> 
> I see Damian's and your point more clearly now.
> 
> Conclusion: we include only withKey interfaces in this KIP (I updated the
> KIP), I will try also initiate another KIP for rich functions.
> 
> Cheers,
> Jeyhun
> 
> On Fri, May 19, 2017 at 10:50 PM Matthias J. Sax <matth...@confluent.io>
> wrote:
> 
>> With the current KIP, using ValueMapper and ValueMapperWithKey
>> interfaces, RichFunction seems to be an independent add-on. To fix the
>> original issue to allow key access, RichFunctions are not required IMHO.
>>
>> I initially put the RichFunction idea on the table, because I was hoping
>> to get a uniform API. And I think, is was good to consider them --
>> however, the discussion showed that they are not necessary for key
>> access. Thus, it seems to be better to handle RichFunctions in an own
>> KIP. The ProcessorContext/RecordContext issues seems to be a main
>> challenge for this. And introducing RichFunctions with parameter-less
>> init() method, seem not to help too much. We would get an "intermediate"
>> API that we want to change anyway later on...
>>
>> As you put already much effort into RichFunction, feel free do push this
>> further and start a new KIP (we can do this even in parallel) -- we
>> don't want to slow you down :) But it make the discussion and code
>> review easier, if we separate both IMHO.
>>
>>
>> -Matthias
>>
>>
>> On 5/19/17 2:25 AM, Jeyhun Karimov wrote:
>>> Hi Damian,
>>>
>>> Thanks for your comments. I think providing to users *interface* rather
>>> than *abstract class* should be preferred (Matthias also raised this
>> issue
>>> ), anyway I changed the corresponding parts of KIP.
>>>
>>> Regarding with passing additional contextual information, I think it is a
>>> tradeoff,
>>> 1) first, we fix the context parameter for *init() *method in another PR
>>> and solve Rich functions afterwards
>>> 2) first, we fix the requested issues on jira ([1-3]) with providing
>>> (not-complete) Rich functions and integrate the context parameters to
>> this
>>> afterwards (like improvement)
>>>
>>> To me, the second approach seems more incremental. However you are right,
>>> the names might confuse the users.
>>>
>>>
>>>
>>> [1] https://issues.apache.org/jira/browse/KAFKA-4218
>>> [2] https://issues.apache.org/jira/browse/KAFKA-4726
>>> [3] https://issues.apache.org/jira/browse/KAFKA-3745
>>>
>>>
>>> Cheers,
>>> Jeyhun
>>>
>>>
>>> On Fri, May 19, 2017 at 10:42 AM Damian Guy <damian....@gmail.com>
>> wrote:
>>>
>>>> Hi,
>>>>
>>>> I see you've removed the `ProcessorContext` from the RichFunction which
>> is
>>>> good, but why is it a `RichFunction`? I'd have expected it to pass some
>>>> additional contextual information, i.e., the `RecordContext` that
>> contains
>>>> just the topic, partition, timestamp, offset.  I'm ok with it not
>> passing
>>>> this contextual information, but is the naming incorrect? I'm not sure,
>>>> tbh. I'm wondering if we should drop `RichFunctions` until we can do it
>>>> properly with the correct context?
>>>>
>>>> Also, i don't like the abstract classes: RichValueMapper,
>> RichValueJoiner,
>>>> RichInitializer etc. Why can't they not just be interfaces? Generally we
>>>> should provide users with Intefaces to code against, not classes.
>>>>
>>>> Thanks,
>>>> Damian
>>>>
>>>> On Fri, 19 May 2017 at 00:50 Jeyhun Karimov <je.kari...@gmail.com>
>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> Thanks. I initiated the PR as well, to get a better overview.
>>>>>
>>>>> The only reason that I used abstract class instead of interface for
>> Rich
>>>>> functions is that in future if we will have some AbstractRichFunction
>>>>> abstract classes,
>>>>> we can easily extend:
>>>>>
>>>>> public abstract class RichValueMapper<K, V, VR>  implements
>>>>> ValueMapperWithKey<K, V, VR>, RichFunction *extends
>>>> AbstractRichFunction*{
>>>>> }
>>>>>  With interfaces we are only limited to interfaces for inheritance.
>>>>>
>>>>> However, I think we can easily change it (from abstract class ->
>>>> interface)
>>>>> if you think interface is a better fit.
>>>>>
>>>>>
>>>>> Cheers,
>>>>> Jeyhun
>>>>>
>>>>>
>>>>> On Fri, May 19, 2017 at 1:00 AM Matthias J. Sax <matth...@confluent.io
>>>
>>>>> wrote:
>>>>>
>>>>>> Thanks for the update and explanations. The KIP is quite improved now
>>>> --
>>>>>> great job!
>>>>>>
>>>>>> One more question: Why are RichValueMapper etc abstract classes and
>> not
>>>>>> interfaces?
>>>>>>
>>>>>>
>>>>>> Overall, I like the KIP a lot!
>>>>>>
>>>>>>
>>>>>> -Matthias
>>>>>>
>>>>>>
>>>>>> On 5/16/17 7:03 AM, Jeyhun Karimov wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Thanks for your comments.
>>>>>>>
>>>>>>> I think supporting Lambdas for `withKey` and `AbstractRichFunction`
>>>>>>>> don't go together, as Lambdas are only supported for interfaces
>>>> AFAIK.
>>>>>>>
>>>>>>>
>>>>>>> Maybe I misunderstood your comment.
>>>>>>> *withKey* and and *withOnlyValue* are interfaces. So they don't have
>>>>>> direct
>>>>>>> relation with *AbstractRichFunction*.
>>>>>>> *withKey* and and *withOnlyValue* interfaces have only one  method ,
>>>> so
>>>>>> we
>>>>>>> can use lambdas.
>>>>>>> Where does the *AbstractRichFunction* comes to play? Inside Rich
>>>>>> functions.
>>>>>>> And we use Rich functions in 2 places:
>>>>>>>
>>>>>>> 1. User doesn't use rich functions. Just regular *withKey* and and
>>>>>>> *withOnlyValue* interfaces(both support lambdas) . We get those
>>>>>> interfaces
>>>>>>> and wrap into Rich function while building the topology, and send to
>>>>>>> Processor.
>>>>>>> 2. User does use rich functions (Rich functions implement *withKey*
>>>>>>> interface). As a result no lamdas here by definition. In this case,
>>>>> while
>>>>>>> building the topology we do a type check if the object type is
>>>>>>> *withKey* or *RichFunction*.
>>>>>>>
>>>>>>> So *AbstractRichFunction* is just syntactic sugar for Rich functions
>>>>> and
>>>>>>> does not affect using lambdas.
>>>>>>>
>>>>>>> Thus, if we want to support Lambdas for `withKey`, we need to have a
>>>>>>>> interface approach like this
>>>>>>>>   - RichFunction -> only adding init() and close()
>>>>>>>>   - ValueMapper
>>>>>>>>   - ValueMapperWithKey
>>>>>>>>   - RichValueMapper extends ValueMapperWithKey, RichFunction
>>>>>>>
>>>>>>>
>>>>>>> As I said above, currently we support lambdas for *withKey*
>>>> interfaces
>>>>> as
>>>>>>> well.  However, I agree with your idea and I will remove the
>>>>>>> AbstractRichFunction from the design.
>>>>>>>
>>>>>>> As an alternative, we could argue, that it is sufficient to support
>>>>>>>> Lambdas for the "plain" API only, but not for any "extended API".
>>>> For
>>>>>>>> this, RichFunction could add key+init+close and AbstractRichFunction
>>>>>>>> would allow to only care about getting the key.
>>>>>>>> Not sure, which one is better. I don't like the idea of more
>>>>> overloaded
>>>>>>>> methods to get Lambdas for `withKey` interfaces too much because we
>>>>> have
>>>>>>>> already so many overlaods. On the other hand, I do see value in
>>>>>>>> supporting Lambdas for `withKey`.
>>>>>>>
>>>>>>>
>>>>>>> Just to clarify, with current design we have only one extra
>>>> overloaded
>>>>>>> method per *withOnlyValue* interface:  which is *withKey* version of
>>>>>>> particular interface.
>>>>>>> We don't need extra overload for Rich function as Rich function
>>>>>> implements
>>>>>>> *withKey* interface as a result they have same type. We differentiate
>>>>>> them
>>>>>>> while building the topology.
>>>>>>> We supported lambdas for *withKey* APIs because of the comment:
>>>>>>>
>>>>>>> @Jeyhun: I did not put any thought into this, but can we have a
>>>> design
>>>>>>>> that allows for both? Also, with regard to lambdas, it might make
>>>>> sense
>>>>>>>> to allow for both `V -> newV` and `(K, V) -> newV` ?
>>>>>>>
>>>>>>>
>>>>>>> However, I don't think that this complicates the overall design
>>>>>>> significantly.
>>>>>>>
>>>>>>>
>>>>>>> Depending on what we want to support, it might make sense to
>>>>>>>> include/exclude RichFunctions from this KIP -- and thus, this also
>>>>>>>> determines if we should have a "ProcessorContext KIP" before driving
>>>>>>>> this KIP further.
>>>>>>>
>>>>>>>
>>>>>>> Based on our discussion I think we should keep Rich functions as I
>>>>> don't
>>>>>>> think that they bring extra layer of overhead to library.
>>>>>>>
>>>>>>> Any comments are appreciated.
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Jeyhun
>>>>>>>
>>>>>>>
>>>>>>> On Tue, May 16, 2017 at 12:10 AM Matthias J. Sax <
>>>>> matth...@confluent.io>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Jeyhun,
>>>>>>>>
>>>>>>>> thanks for the update.
>>>>>>>>
>>>>>>>> I think supporting Lambdas for `withKey` and `AbstractRichFunction`
>>>>>>>> don't go together, as Lambdas are only supported for interfaces
>>>> AFAIK.
>>>>>>>>
>>>>>>>> Thus, if we want to support Lambdas for `withKey`, we need to have a
>>>>>>>> interface approach like this
>>>>>>>>
>>>>>>>>   - RichFunction -> only adding init() and close()
>>>>>>>>
>>>>>>>>   - ValueMapper
>>>>>>>>   - ValueMapperWithKey
>>>>>>>>
>>>>>>>>   - RichValueMapper extends ValueMapperWithKey, RichFunction
>>>>>>>>
>>>>>>>> For this approach, AbstractRichFunction does not make sense anymore,
>>>>> as
>>>>>>>> the only purpose of `RichFunction` is to allow the implementation of
>>>>>>>> init() and close() -- if you don't want those, you would implement a
>>>>>>>> different interface (ie, ValueMapperWithKey)
>>>>>>>>
>>>>>>>> As an alternative, we could argue, that it is sufficient to support
>>>>>>>> Lambdas for the "plain" API only, but not for any "extended API".
>>>> For
>>>>>>>> this, RichFunction could add key+init+close and AbstractRichFunction
>>>>>>>> would allow to only care about getting the key.
>>>>>>>>
>>>>>>>> Not sure, which one is better. I don't like the idea of more
>>>>> overloaded
>>>>>>>> methods to get Lambdas for `withKey` interfaces too much because we
>>>>> have
>>>>>>>> already so many overlaods. On the other hand, I do see value in
>>>>>>>> supporting Lambdas for `withKey`.
>>>>>>>>
>>>>>>>> Depending on what we want to support, it might make sense to
>>>>>>>> include/exclude RichFunctions from this KIP -- and thus, this also
>>>>>>>> determines if we should have a "ProcessorContext KIP" before driving
>>>>>>>> this KIP further.
>>>>>>>>
>>>>>>>> Thoughts?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> -Matthias
>>>>>>>>
>>>>>>>>
>>>>>>>> On 5/15/17 11:01 AM, Jeyhun Karimov wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Sorry for super late response. Thanks for your comments.
>>>>>>>>>
>>>>>>>>> I am not an expert on Lambdas. Can you elaborate a little bit? I
>>>>> cannot
>>>>>>>>>> follow the explanation in the KIP to see what the problem is.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> - From [1] says "A functional interface is an interface that has
>>>> just
>>>>>> one
>>>>>>>>> abstract method, and thus represents a single function contract".
>>>>>>>>> So basically once we extend some interface from another (in our
>>>> case,
>>>>>>>>> ValueMapperWithKey from ValueMapper) we cannot use lambdas in the
>>>>>>>> extended
>>>>>>>>> interface.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Further comments:
>>>>>>>>>>  - The KIP get a little hard to read -- can you maybe reformat the
>>>>>> wiki
>>>>>>>>>> page a little bit? I think using `CodeBlock` would help.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> - I will work on the KIP.
>>>>>>>>>
>>>>>>>>>  - What about KStream-KTable joins? You don't have overlaods added
>>>>> for
>>>>>>>>>> them. Why? (Even if I still hope that we don't need to add any new
>>>>>>>>>> overloads)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> - Actually there are more than one Processor and public APIs to be
>>>>>>>>> changed (KStream-KTable
>>>>>>>>> joins is one case). However all of them has similar structure: we
>>>>>>>> overload
>>>>>>>>> the *method* with  *methodWithKey*,
>>>>>>>>> wrap it into the Rich function, send to processor and inside the
>>>>>>>> processor
>>>>>>>>> call *init* and *close* methods of the Rich function.
>>>>>>>>> As I wrote in KIP, I wanted to demonstrate the overall idea with
>>>> only
>>>>>>>>> *ValueMapper* as the same can be applied to all changes.
>>>>>>>>> Anyway I will update the KIP.
>>>>>>>>>
>>>>>>>>>  - Why do we need `AbstractRichFunction`?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Instead of overriding the *init(ProcessorContext p)* and* close()*
>>>>>>>> methods
>>>>>>>>> in every Rich function with empty body like:
>>>>>>>>>
>>>>>>>>> @Override
>>>>>>>>> void init(ProcessorContext context) {}
>>>>>>>>>
>>>>>>>>> @Override
>>>>>>>>> void close () {}
>>>>>>>>>
>>>>>>>>> I thought that we can override them once in *AbstractRichFunction*
>>>>> and
>>>>>>>>> extent new Rich functions from *AbstractRichFunction*.
>>>>>>>>> Basically this can eliminate code copy-paste and ease the
>>>>> maintenance.
>>>>>>>>>
>>>>>>>>>  - What about interfaces Initializer, ForeachAction, Merger,
>>>>> Predicate,
>>>>>>>>>> Reducer? I don't want to say we should/need to add to all, but we
>>>>>> should
>>>>>>>>>> discuss all of them and add where it does make sense (e.g.,
>>>>>>>>>> RichForachAction does make sense IMHO)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Definitely agree. As I said, the same technique applies to all this
>>>>>>>>> interfaces and I didn't want to explode the KIP, just wanted to
>>>> give
>>>>>> the
>>>>>>>>> overall intuition.
>>>>>>>>> However, I will update the KIP as I said.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Btw: I like the hierarchy `ValueXX` -- `ValueXXWithKey` --
>>>>>> `RichValueXX`
>>>>>>>>>> in general -- but why can't we do all this with interfaces only?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Sure we can. However the main intuition is we should not force
>>>> users
>>>>> to
>>>>>>>>> implement *init(ProcessorContext)* and *close()* functions every
>>>> time
>>>>>>>> they
>>>>>>>>> use Rich functions.
>>>>>>>>> If one needs, she can override the respective methods. However, I
>>>> am
>>>>>> open
>>>>>>>>> for discussion.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'd rather not see the use of  `ProcessorContext` spread any
>>>> further
>>>>>> than
>>>>>>>>>> it currently is. So maybe we need another KIP that is done before
>>>>>> this?
>>>>>>>>>> Otherwise i think the scope of this KIP is becoming too large.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> That is good point. I wanted to make *init(ProcessorContext)*
>>>> method
>>>>>>>>> persistent among the library (which use ProcessorContext as an
>>>>> input),
>>>>>>>>> therefore I put *ProcessorContext* as an input.
>>>>>>>>> So the important question is that (as @dguy and @mjsax mentioned)
>>>>>> whether
>>>>>>>>> continue this KIP without providing users an access to
>>>>>> *ProcessorContext*
>>>>>>>>> (change *init (ProcessorContext)* to * init()* ) or
>>>>>>>>> initiate another KIP before this.
>>>>>>>>>
>>>>>>>>> [1]
>>>>>>>>> http://cr.openjdk.java.net/~mr/se/8/java-se-8-pfd-spec/java-
>>>>>>>> se-8-jls-pfd-diffs.pdf
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> Jeyhun
>>>>>>>>>
>>>>>>>>> On Mon, May 15, 2017 at 7:15 PM, Damian Guy <damian....@gmail.com>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> I'd rather not see the use of  `ProcessorContext` spread any
>>>> further
>>>>>>>> than
>>>>>>>>>> it currently is. So maybe we need another KIP that is done before
>>>>>> this?
>>>>>>>>>> Otherwise i think the scope of this KIP is becoming too large.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Mon, 15 May 2017 at 18:06 Matthias J. Sax <
>>>> matth...@confluent.io
>>>>>>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> I agree that that `ProcessorContext` interface is too broad in
>>>>>> general
>>>>>>>>>>> -- this is even true for transform/process, and it's also
>>>> reflected
>>>>>> in
>>>>>>>>>>> the API improvement list we want to do.
>>>>>>>>>>>
>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/
>>>>>>>>>> Kafka+Streams+Discussions
>>>>>>>>>>>
>>>>>>>>>>> So I am wondering, if you question the `RichFunction` approach in
>>>>>>>>>>> general? Or if you suggest to either extend the scope of this KIP
>>>>> to
>>>>>>>>>>> include this---or maybe better, do another KIP for it and delay
>>>>> this
>>>>>>>> KIP
>>>>>>>>>>> until the other one is done?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> -Matthias
>>>>>>>>>>>
>>>>>>>>>>> On 5/15/17 2:35 AM, Damian Guy wrote:
>>>>>>>>>>>> Thanks for the KIP.
>>>>>>>>>>>>
>>>>>>>>>>>> I'm not convinced on the `RichFunction` approach. Do we really
>>>>> want
>>>>>> to
>>>>>>>>>>> give
>>>>>>>>>>>> every DSL method access to the `ProcessorContext` ? It has a
>>>> bunch
>>>>>> of
>>>>>>>>>>>> methods on it that seem in-appropriate for some of the DSL
>>>>> methods,
>>>>>>>>>> i.e,
>>>>>>>>>>>> `register`, `getStateStore`, `forward`, `schedule` etc. It is
>>>> far
>>>>>> too
>>>>>>>>>>>> broad. I think it would be better to have a narrower interface
>>>>> like
>>>>>>>> the
>>>>>>>>>>>> `RecordContext`  - remembering it is easier to add
>>>>>> methods/interfaces
>>>>>>>>>>> later
>>>>>>>>>>>> than to remove them
>>>>>>>>>>>>
>>>>>>>>>>>> On Sat, 13 May 2017 at 22:26 Matthias J. Sax <
>>>>> matth...@confluent.io
>>>>>>>
>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Jeyhun,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I am not an expert on Lambdas. Can you elaborate a little bit?
>>>> I
>>>>>>>>>> cannot
>>>>>>>>>>>>> follow the explanation in the KIP to see what the problem is.
>>>>>>>>>>>>>
>>>>>>>>>>>>> For updating the KIP title I don't know -- guess it's up to
>>>> you.
>>>>>>>>>> Maybe a
>>>>>>>>>>>>> committer can comment on this?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Further comments:
>>>>>>>>>>>>>
>>>>>>>>>>>>>  - The KIP get a little hard to read -- can you maybe reformat
>>>>> the
>>>>>>>>>> wiki
>>>>>>>>>>>>> page a little bit? I think using `CodeBlock` would help.
>>>>>>>>>>>>>
>>>>>>>>>>>>>  - What about KStream-KTable joins? You don't have overlaods
>>>>> added
>>>>>>>> for
>>>>>>>>>>>>> them. Why? (Even if I still hope that we don't need to add any
>>>>> new
>>>>>>>>>>>>> overloads)
>>>>>>>>>>>>>
>>>>>>>>>>>>>  - Why do we need `AbstractRichFunction`?
>>>>>>>>>>>>>
>>>>>>>>>>>>>  - What about interfaces Initializer, ForeachAction, Merger,
>>>>>>>>>> Predicate,
>>>>>>>>>>>>> Reducer? I don't want to say we should/need to add to all, but
>>>> we
>>>>>>>>>> should
>>>>>>>>>>>>> discuss all of them and add where it does make sense (e.g.,
>>>>>>>>>>>>> RichForachAction does make sense IMHO)
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Btw: I like the hierarchy `ValueXX` -- `ValueXXWithKey` --
>>>>>>>>>> `RichValueXX`
>>>>>>>>>>>>> in general -- but why can't we do all this with interfaces
>>>> only?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 5/11/17 7:00 AM, Jeyhun Karimov wrote:
>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks for your comments. I think we cannot extend the two
>>>>>>>> interfaces
>>>>>>>>>>> if
>>>>>>>>>>>>> we
>>>>>>>>>>>>>> want to keep lambdas. I updated the KIP [1]. Maybe I should
>>>>> change
>>>>>>>>>> the
>>>>>>>>>>>>>> title, because now we are not limiting the KIP to only
>>>>>> ValueMapper,
>>>>>>>>>>>>>> ValueTransformer and ValueJoiner.
>>>>>>>>>>>>>> Please feel free to comment.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>>>>>> 149%3A+Enabling+key+access+in+ValueTransformer%2C+
>>>>>>>>>> ValueMapper%2C+and+ValueJoiner
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Tue, May 9, 2017 at 7:36 PM Matthias J. Sax <
>>>>>>>>>> matth...@confluent.io>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If `ValueMapperWithKey` extends `ValueMapper` we don't need
>>>> the
>>>>>> new
>>>>>>>>>>>>>>> overlaod.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> And yes, we need to do one check -- but this happens when
>>>>>> building
>>>>>>>>>> the
>>>>>>>>>>>>>>> topology. At runtime (I mean after KafkaStream#start() we
>>>> don't
>>>>>>>> need
>>>>>>>>>>> any
>>>>>>>>>>>>>>> check as we will always use `ValueMapperWithKey`)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On 5/9/17 2:55 AM, Jeyhun Karimov wrote:
>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks for feedback.
>>>>>>>>>>>>>>>> Then we need to overload method
>>>>>>>>>>>>>>>>   <VR> KStream<K, VR> mapValues(ValueMapper<? super V, ?
>>>>> extends
>>>>>>>>>> VR>
>>>>>>>>>>>>>>>> mapper);
>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>   <VR> KStream<K, VR> mapValues(ValueMapperWithKey<? super
>>>> V,
>>>>> ?
>>>>>>>>>>> extends
>>>>>>>>>>>>>>> VR>
>>>>>>>>>>>>>>>> mapper);
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> and in runtime (inside processor) we still have to check it
>>>> is
>>>>>>>>>>>>>>> ValueMapper
>>>>>>>>>>>>>>>> or ValueMapperWithKey before wrapping it into the rich
>>>>> function.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Please correct me if I am wrong.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Tue, May 9, 2017 at 10:56 AM Michal Borowiecki <
>>>>>>>>>>>>>>>> michal.borowie...@openbet.com> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> +1 :)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On 08/05/17 23:52, Matthias J. Sax wrote:
>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I was reading the updated KIP and I am wondering, if we
>>>>> should
>>>>>>>> do
>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> design a little different.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Instead of distinguishing between a RichFunction and
>>>>>>>>>>> non-RichFunction
>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>> runtime level, we would use RichFunctions all the time.
>>>>> Thus,
>>>>>> on
>>>>>>>>>>> the
>>>>>>>>>>>>>>> DSL
>>>>>>>>>>>>>>>>>> entry level, if a user provides a non-RichFunction, we
>>>> wrap
>>>>> it
>>>>>>>>>> by a
>>>>>>>>>>>>>>>>>> RichFunction that is fully implemented by Streams. This
>>>>>>>>>>> RichFunction
>>>>>>>>>>>>>>>>>> would just forward the call omitting the key:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Just to sketch the idea (incomplete code snippet):
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> public StreamsRichValueMapper implements
>>>> RichValueMapper()
>>>>> {
>>>>>>>>>>>>>>>>>>>    private ValueMapper userProvidedMapper; // set by
>>>>>>>> constructor
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>    public VR apply(final K key, final V1 value1, final V2
>>>>>>>>>> value2)
>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>        return userProvidedMapper(value1, value2);
>>>>>>>>>>>>>>>>>>>    }
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>  From a performance point of view, I am not sure if the
>>>>>>>>>>>>>>>>>> "if(isRichFunction)" including casts etc would have more
>>>>>>>> overhead
>>>>>>>>>>>>> than
>>>>>>>>>>>>>>>>>> this approach (we would do more nested method call for
>>>>>>>>>>>>> non-RichFunction
>>>>>>>>>>>>>>>>>> which should be more common than RichFunctions).
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> This approach should not effect lambdas (or do I miss
>>>>>>>> something?)
>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>> might be cleaner, as we could have one more top level
>>>>>> interface
>>>>>>>>>>>>>>>>>> `RichFunction` with methods `init()` and `close()` and
>>>> also
>>>>>>>>>>>>> interfaces
>>>>>>>>>>>>>>>>>> for `RichValueMapper` etc. (thus, no abstract classes
>>>>>> required).
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Any thoughts?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On 5/6/17 5:29 PM, Jeyhun Karimov wrote:
>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks for comments. I extended PR and KIP to include
>>>> rich
>>>>>>>>>>>>> functions.
>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>> will still have to evaluate the cost of deep copying of
>>>>> keys.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Fri, May 5, 2017 at 8:02 PM Mathieu Fenniak <
>>>>>>>>>>>>>>>>> mathieu.fenn...@replicon.com>
>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hey Matthias,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> My opinion would be that documenting the immutability of
>>>>> the
>>>>>>>>>> key
>>>>>>>>>>> is
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> best approach available.  Better than requiring the key
>>>> to
>>>>>> be
>>>>>>>>>>>>>>>>> serializable
>>>>>>>>>>>>>>>>>>>> (as with Jeyhun's last pass at the PR), no performance
>>>>> risk.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> It'd be different if Java had immutable type constraints
>>>>> of
>>>>>>>>>> some
>>>>>>>>>>>>>>> kind.
>>>>>>>>>>>>>>>>> :-)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Mathieu
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Fri, May 5, 2017 at 11:31 AM, Matthias J. Sax <
>>>>>>>>>>>>>>>>> matth...@confluent.io>
>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Agreed about RichFunction. If we follow this path, it
>>>>>> should
>>>>>>>>>>> cover
>>>>>>>>>>>>>>>>>>>>> all(?) DSL interfaces.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> About guarding the key -- I am still not sure what to
>>>> do
>>>>>>>> about
>>>>>>>>>>>>> it...
>>>>>>>>>>>>>>>>>>>>> Maybe it might be enough to document it (and name the
>>>> key
>>>>>>>>>>>>> parameter
>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>> `readOnlyKey` to make is very clear). Ultimately, I
>>>> would
>>>>>>>>>> prefer
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> guard against any modification, but I have no good idea
>>>>> how
>>>>>>>> to
>>>>>>>>>>> do
>>>>>>>>>>>>>>>>> this.
>>>>>>>>>>>>>>>>>>>>> Not sure what others think about the risk of corrupted
>>>>>>>>>>>>> partitioning
>>>>>>>>>>>>>>>>>>>>> (what would be a user error and we could say, well, bad
>>>>>> luck,
>>>>>>>>>>> you
>>>>>>>>>>>>>>> got
>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>> bug in your code, that's not our fault), vs deep copy
>>>>> with
>>>>>> a
>>>>>>>>>>>>>>> potential
>>>>>>>>>>>>>>>>>>>>> performance hit (that we can't quantity atm without any
>>>>>>>>>>>>> performance
>>>>>>>>>>>>>>>>>>>> test).
>>>>>>>>>>>>>>>>>>>>> We do have a performance system test. Maybe it's worth
>>>>> for
>>>>>>>> you
>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> apply
>>>>>>>>>>>>>>>>>>>>> the deep copy strategy and run the test. It's very
>>>> basic
>>>>>>>>>>>>> performance
>>>>>>>>>>>>>>>>>>>>> test only, but might give some insight. If you want to
>>>> do
>>>>>>>>>> this,
>>>>>>>>>>>>> look
>>>>>>>>>>>>>>>>>>>>> into folder "tests" for general test setup, and into
>>>>>>>>>>>>>>>>>>>>> "tests/kafaktests/benchmarks/streams" to find find the
>>>>> perf
>>>>>>>>>>> test.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On 5/5/17 8:55 AM, Jeyhun Karimov wrote:
>>>>>>>>>>>>>>>>>>>>>> Hi Matthias,
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I think extending KIP to include RichFunctions totally
>>>>>>>> makes
>>>>>>>>>>>>>>> sense.
>>>>>>>>>>>>>>>>>>>> So,
>>>>>>>>>>>>>>>>>>>>>>   we don't want to guard the keys because it is
>>>> costly.
>>>>>>>>>>>>>>>>>>>>>> If we introduce RichFunctions I think it should not be
>>>>>>>>>> limited
>>>>>>>>>>>>> only
>>>>>>>>>>>>>>>>>>>> the 3
>>>>>>>>>>>>>>>>>>>>>> interfaces proposed in KIP but to wide range of
>>>>>> interfaces.
>>>>>>>>>>>>>>>>>>>>>> Please correct me if I am wrong.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On Fri, May 5, 2017 at 12:04 AM Matthias J. Sax <
>>>>>>>>>>>>>>>>> matth...@confluent.io
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> One follow up. There was this email on the user list:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>> http://search-hadoop.com/m/Kafka/uyzND17KhCaBzPSZ1?subj=
>>>>>>>>>>>>>>>>>>>>>
>>>>> Shouldn+t+the+initializer+of+a+stream+aggregate+accept+the+
>>>>>>>>>> key+
>>>>>>>>>>>>>>>>>>>>>>> It might make sense so include Initializer, Adder,
>>>> and
>>>>>>>>>>>>> Substractor
>>>>>>>>>>>>>>>>>>>>>>> inferface, too.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> And we should double check if there are other
>>>> interface
>>>>>> we
>>>>>>>>>>> might
>>>>>>>>>>>>>>>>> miss
>>>>>>>>>>>>>>>>>>>>> atm.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> On 5/4/17 1:31 PM, Matthias J. Sax wrote:
>>>>>>>>>>>>>>>>>>>>>>>> Thanks for updating the KIP.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Deep copying the key will work for sure, but I am
>>>>>> actually
>>>>>>>>>> a
>>>>>>>>>>>>>>> little
>>>>>>>>>>>>>>>>>>>> bit
>>>>>>>>>>>>>>>>>>>>>>>> worried about performance impact... We might want to
>>>>> do
>>>>>>>>>> some
>>>>>>>>>>>>> test
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> quantify this impact.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Btw: this remind me about the idea of `RichFunction`
>>>>>>>>>>> interface
>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> would allow users to access record metadata (like
>>>>>>>>>> timestamp,
>>>>>>>>>>>>>>>>> offset,
>>>>>>>>>>>>>>>>>>>>>>>> partition etc) within DSL. This would be a similar
>>>>>>>> concept.
>>>>>>>>>>>>>>> Thus, I
>>>>>>>>>>>>>>>>>>>> am
>>>>>>>>>>>>>>>>>>>>>>>> wondering, if it would make sense to enlarge the
>>>> scope
>>>>>> of
>>>>>>>>>>> this
>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>> that? WDYT?
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> On 5/3/17 2:08 AM, Jeyhun Karimov wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> Hi Mathieu,
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for feedback. I followed similar approach
>>>> and
>>>>>>>>>> updated
>>>>>>>>>>>>> PR
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>>>>>>>>>> accordingly. I tried to guard the key in Processors
>>>>>>>>>> sending
>>>>>>>>>>> a
>>>>>>>>>>>>>>> copy
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>> actual key.
>>>>>>>>>>>>>>>>>>>>>>>>> Because I am doing deep copy of an object, I think
>>>>>> memory
>>>>>>>>>>> can
>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>> bottleneck
>>>>>>>>>>>>>>>>>>>>>>>>> in some use-cases.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, May 2, 2017 at 5:10 PM Mathieu Fenniak <
>>>>>>>>>>>>>>>>>>>>>>> mathieu.fenn...@replicon.com>
>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jeyhun,
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> This approach would change ValueMapper (...etc) to
>>>>> be
>>>>>>>>>>>>> classes,
>>>>>>>>>>>>>>>>>>>> rather
>>>>>>>>>>>>>>>>>>>>>>> than
>>>>>>>>>>>>>>>>>>>>>>>>>> interfaces, which is also a backwards incompatible
>>>>>>>>>> change.
>>>>>>>>>>>>> An
>>>>>>>>>>>>>>>>>>>>>>> alternative
>>>>>>>>>>>>>>>>>>>>>>>>>> approach that would be backwards compatible would
>>>> be
>>>>>> to
>>>>>>>>>>>>> define
>>>>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>>>>>>>>> interfaces, and provide overrides where those
>>>>>> interfaces
>>>>>>>>>>> are
>>>>>>>>>>>>>>>>> used.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Unfortunately, making the key parameter as "final"
>>>>>>>>>> doesn't
>>>>>>>>>>>>>>> change
>>>>>>>>>>>>>>>>>>>>> much
>>>>>>>>>>>>>>>>>>>>>>>>>> about guarding against key change.  It only
>>>> prevents
>>>>>> the
>>>>>>>>>>>>>>>>> parameter
>>>>>>>>>>>>>>>>>>>>>>> variable
>>>>>>>>>>>>>>>>>>>>>>>>>> from being reassigned.  If the key type is a
>>>> mutable
>>>>>>>>>> object
>>>>>>>>>>>>>>> (eg.
>>>>>>>>>>>>>>>>>>>>>>> byte[]),
>>>>>>>>>>>>>>>>>>>>>>>>>> it can still be mutated. (eg. key[0] = 0).  But
>>>> I'm
>>>>>> not
>>>>>>>>>>>>> really
>>>>>>>>>>>>>>>>> sure
>>>>>>>>>>>>>>>>>>>>>>> there's
>>>>>>>>>>>>>>>>>>>>>>>>>> much that can be done about that.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Mathieu
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, May 1, 2017 at 5:39 PM, Jeyhun Karimov <
>>>>>>>>>>>>>>>>>>>> je.kari...@gmail.com
>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for comments.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> The concerns makes sense. Although we can guard
>>>> for
>>>>>>>>>>>>> immutable
>>>>>>>>>>>>>>>>> keys
>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>> current implementation (with few changes), I
>>>> didn't
>>>>>>>>>>> consider
>>>>>>>>>>>>>>>>>>>>> backward
>>>>>>>>>>>>>>>>>>>>>>>>>>> compatibility.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> In this case 2 solutions come to my mind. In both
>>>>>>>> cases,
>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>> accesses
>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> key in Object type, as passing extra type
>>>> parameter
>>>>>>>> will
>>>>>>>>>>>>> break
>>>>>>>>>>>>>>>>>>>>>>>>>>> backwards-compatibility.  So user has to cast to
>>>>>> actual
>>>>>>>>>>> key
>>>>>>>>>>>>>>>>> type.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Firstly, We can overload apply method with 2
>>>>>>>> argument
>>>>>>>>>>>>> (key
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>> value)
>>>>>>>>>>>>>>>>>>>>>>>>>>> and force key to be *final*. By doing this,  I
>>>>> think
>>>>>> we
>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> address
>>>>>>>>>>>>>>>>>>>>>>> both
>>>>>>>>>>>>>>>>>>>>>>>>>>> backward-compatibility and guarding against key
>>>>>> change.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. Secondly, we can create class KeyAccess like:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> public class KeyAccess {
>>>>>>>>>>>>>>>>>>>>>>>>>>>      Object key;
>>>>>>>>>>>>>>>>>>>>>>>>>>>      public void beforeApply(final Object key) {
>>>>>>>>>>>>>>>>>>>>>>>>>>>          this.key = key;
>>>>>>>>>>>>>>>>>>>>>>>>>>>      }
>>>>>>>>>>>>>>>>>>>>>>>>>>>      public Object getKey() {
>>>>>>>>>>>>>>>>>>>>>>>>>>>          return key;
>>>>>>>>>>>>>>>>>>>>>>>>>>>      }
>>>>>>>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> We can extend *ValueMapper, ValueJoiner* and
>>>>>>>>>>>>>>> *ValueTransformer*
>>>>>>>>>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>>>>>>>>>>>> *KeyAccess*. Inside processor (for example
>>>>>>>>>>>>>>>>>>>>> *KTableMapValuesProcessor*)
>>>>>>>>>>>>>>>>>>>>>>>>>>> before calling *mapper.apply(value)* we can set
>>>> the
>>>>>>>>>> *key*
>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>>>> *mapper.beforeApply(key)*. As a result, user can
>>>>> use
>>>>>>>>>>>>>>> *getKey()*
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> access
>>>>>>>>>>>>>>>>>>>>>>>>>>> the key inside *apply(value)* method.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, May 1, 2017 at 7:24 PM Matthias J. Sax <
>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io
>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> thanks a lot for the KIP!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think there are two issues we need to address:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> (1) The KIP does not consider backward
>>>>>> compatibility.
>>>>>>>>>>> Users
>>>>>>>>>>>>>>> did
>>>>>>>>>>>>>>>>>>>>>>>>>> complain
>>>>>>>>>>>>>>>>>>>>>>>>>>>> about this in past releases already, and as the
>>>>> user
>>>>>>>>>> base
>>>>>>>>>>>>>>>>> grows,
>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>>> should not break backward compatibility in
>>>> future
>>>>>>>>>>> releases
>>>>>>>>>>>>>>>>>>>> anymore.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thus, we should think of a better way to allow
>>>> key
>>>>>>>>>>> access.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Mathieu's comment goes into the same direction
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On the other hand, the number of compile
>>>>> failures
>>>>>>>>>> that
>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>> need
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fixed from this change is unfortunate. :-)
>>>>>>>>>>>>>>>>>>>>>>>>>>>> (2) Another concern is, that there is no guard
>>>> to
>>>>>>>>>> prevent
>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>> code
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>> modify the key. This might corrupt partitioning
>>>> if
>>>>>>>>>> users
>>>>>>>>>>> do
>>>>>>>>>>>>>>>>> alter
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>> key (accidentally -- or users are just not aware
>>>>>> that
>>>>>>>>>>> they
>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>> allowed to modify the provided key object) and
>>>>> thus
>>>>>>>>>> break
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>> application. (This was the original motivation
>>>> to
>>>>>> not
>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> key
>>>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>>> the first place -- it's guards against
>>>>>> modification.)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 5/1/17 6:31 AM, Mathieu Fenniak wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jeyhun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I just want to add my voice that, I too, have
>>>>>> wished
>>>>>>>>>> for
>>>>>>>>>>>>>>>>> access
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> record key during a mapValues or similar
>>>>> operation.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On the other hand, the number of compile
>>>> failures
>>>>>>>> that
>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>> need
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fixed from this change is unfortunate. :-)  But
>>>>> at
>>>>>>>>>> least
>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pretty clear and easy change.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Mathieu
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, May 1, 2017 at 6:55 AM, Jeyhun Karimov
>>>> <
>>>>>>>>>>>>>>>>>>>>>>> je.kari...@gmail.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Dear community,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I want to share KIP-149 [1] based on issues
>>>>>>>>>> KAFKA-4218
>>>>>>>>>>>>> [2],
>>>>>>>>>>>>>>>>>>>>>>>>>> KAFKA-4726
>>>>>>>>>>>>>>>>>>>>>>>>>>>> [3],
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KAFKA-3745 [4]. The related PR can be found at
>>>>>> [5].
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would like to get your comments.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> https://cwiki.apache.org/
>>>>>>>>>> confluence/display/KAFKA/KIP-
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>> 149%3A+Enabling+key+access+in+ValueTransformer%2C+
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ValueMapper%2C+and+ValueJoiner
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [2] https://issues.apache.org/jira
>>>>>>>> /browse/KAFKA-4218
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [3] https://issues.apache.org/jira
>>>>>>>> /browse/KAFKA-4726
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [4] https://issues.apache.org/jira
>>>>>>>> /browse/KAFKA-3745
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [5] https://github.com/apache/kafka/pull/2946
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Cheers
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>>>>> -Cheers
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>> -Cheers
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> -Cheers
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> -Cheers
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jeyhun
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>> -Cheers
>>>>>
>>>>> Jeyhun
>>>>>
>>>>
>>
>> --
> -Cheers
> 
> Jeyhun
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to