One more question:

Should we add any of
 - InitizialierWithKey
 - ReducerWithKey
 - ValueTransformerWithKey

To get consistent/complete API, it might be a good idea. Any thoughts?


-Matthias


On 5/24/17 3:47 PM, Matthias J. Sax wrote:
> 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