Hi Jeyhun, thanks for starting the VOTE thread. I did make one more pass over the KIP before casting my vote and I saw that the KIP still contains backward incompatible change introducing `ValueTransformerCommon`.
I think, that for this case, it is not worth breaking compatibility. We should have two independent interface and duplicate init() and close() (note, with KIP-138 that got merged already, we don't need `punctuate()` for ValueTransformerWithKey) -Matthias On 6/14/17 3:03 PM, Matthias J. Sax wrote: > I have no strong opinion, but it seems that at least InitializerWithKey > with be helpful if you want to have different start values for different > keys (even if I cannot come up with a use case example why one wanted to > do this...). Otherwise, there is just the "completeness" argument, that > is not too strong either. > > > -Matthias > > On 6/14/17 2:03 PM, Guozhang Wang wrote: >> I'm not particularly concerning that we should NEVER break compatibility; >> in fact if we think that is worthwhile (i.e. small impact with large >> benefit) I think we can break compatibility as long as we have not removed >> the compatibility annotations from Streams. All I was saying is that if we >> decided to go this way we need to make sure this is mentioned in the >> upgrade guidance. >> >> Regarding the scope I'm still trying to solicit opinions regarding >> ReducerWithKey and InitializerWithKey; to me they are not necessarily to be >> included. >> >> >> Guozhang >> >> >> On Wed, Jun 14, 2017 at 5:22 AM, Jeyhun Karimov <je.kari...@gmail.com> >> wrote: >> >>> Hi, >>> >>> I introduced ValueTransformerCommon just to combine common methods of >>> ValueTransformer and ValueTransformerWithKey and avoid copy-paste. >>> I am aware of this issue and I agree that this needs users to compile the >>> code and therefore is not backwards compatible. When I saw this issue, I >>> thought the degree of incompatibility is small (the public APIs are the >>> same, users just need to recompile their code), so we can trade more >>> maintainable code in this case. I have to comments/solutions: >>> >>> 1. Basically we can remove ValueTransformerCommon class and return >>> ValueTransformer to its original form, which means there will be no issues >>> with backwards-compatibility. We just copy and past the methods inside >>> ValueTransformerCommon to ValueTransformerWithKey and maybe in future >>> releases, we can introduce ValueTransformerCommon. >>> >>> 2. I have some doubts about Matthias's proposal. >>> If we extent withKey interface from original one as you mentioned in >>> previous email, then we have to deal with >>> ValueTransformer.transform(V value) method. As a result, inside withKey >>> interface we will have two transforms. Even if we make it abstract class, >>> user still have an access to play with both transform() methods. I think >>> this should not be allowed and seems "hacky" to me. Actually this was one >>> reason why I created withKey classes independently from original >>> interfaces. >>> >>> Of course, you can correct me if I am wrong. >>> >>> >>> Cheers, >>> Jeyhun >>> >>> >>> >>> On Tue, Jun 13, 2017 at 7:42 PM Matthias J. Sax <matth...@confluent.io> >>> wrote: >>> >>>> I agree with Guozhang's second point. This change does not seem backward >>>> compatible. >>>> >>>> As we don't have to support lambdas, it might be the easiest thing to >>>> just extend the current interface: >>>> >>>>> public interface ValueTransformerWithKey<K, V, VR> extends >>>> ValueTransformer<VR> >>>> >>>> When plugging the topology together, we can check if we get the >>>> `withKey` variant and use a corresponding runtime class for execution, >>>> so we get only a single time check. Thus, for the `withKey` variant, the >>>> will be a `transfrom(V value)` method, but we will never call it. >>>> >>>> Maybe we could make `ValueTransformerWithKey` an abstract class with a >>>> `final` no-op implemenation of `transform(V value)` ? >>>> >>>> >>>> -Matthias >>>> >>>> >>>> On 6/6/17 4:58 PM, Guozhang Wang wrote: >>>>> Jeyhun, Matthias: >>>>> >>>>> Thanks for the explanation, I overlooked the repartition argument >>>>> previously. >>>>> >>>>> 1) Based on that argument I'm convinced of having ValueMapperWithKey / >>>>> ValueJoinerWithKey / ValueTransformerWithKey; though I'm still not >>>>> convinced with ReducerWithKey and InitializerWithKey since for the >>> former >>>>> it can be covered with `aggregate` completely and with latter I have >>> seen >>>>> little use cases with it. >>>>> >>>>> 2) Another comment is on public interface ValueTransformer<V, VR> >>> extends >>>>> ValueTransformerCommon<VR>: >>>>> >>>>> I think changing the interface to extend from a new interface is not >>>> binary >>>>> compatible though source compatible, i.e. users still need to recompile >>>>> their code though no need to make code changes. We may need to mention >>>> that >>>>> in the upgrade path if we want to keep it that way. >>>>> >>>>> Guozhang >>>>> >>>>> On Mon, Jun 5, 2017 at 2:28 PM, Jeyhun Karimov <je.kari...@gmail.com> >>>> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> >>>>>> Sorry for late reply. Just to make everybody in sync, the current >>>> version >>>>>> of KIP supports lambdas. "withKey" (ValueMapperWithKey) interfaces are >>>>>> independent, meaning they do not extend from "withoutKey" >>> (ValueMapper) >>>>>> interfaces. >>>>>> >>>>>> >>>>>> I agree with Guozhang, and I am personally a bit reluctant to increase >>>>>> overloaded methods in public APIs but it seems this is only way to >>> solve >>>>>> all related jira issues. >>>>>> However, the most overloaded methods will be with ValueJoiner type, >>>> which >>>>>> will be with ValueJoinerWithKey with new overloaded methods. Other >>>>>> interfaces require mostly 1 extra overload. >>>>>> >>>>>> >>>>>>>> I would suggest not doing it if user pop it up, but rather >>> suggesting >>>>>> them >>>>>>>> to use `map` >>>>>> >>>>>> I agree with Matthias as the core idea of this KIP was to collect all >>>>>> related jira issues and propose one-shot solution for all. Afterwards, >>>> we >>>>>> broke its scope into 2 KIPs (149 and 159). >>>>>> >>>>>> Cheers, >>>>>> Jeyhun >>>>>> >>>>>> >>>>>> >>>>>> On Mon, Jun 5, 2017 at 7:55 AM Matthias J. Sax <matth...@confluent.io >>>> >>>>>> wrote: >>>>>> >>>>>>> I guess I missunderstood you. Your are right that overloading the >>>> method >>>>>>> would also work. As both interfaces will be independent from each >>>> other, >>>>>>> there should be no problem. >>>>>>> >>>>>>> The initial proposal was to use >>>>>>> >>>>>>>> interface ValueMapperWithKey extends ValueMapper >>>>>>> >>>>>>> and this would break Lambda. We totally missed, that we don't need >>> new >>>>>>> methods but only only overlaods. Great you point this out! I was not >>>>>>> quite happy with the newly added methods. >>>>>>> >>>>>>>>> I would suggest not doing it if user pop it up, but rather >>> suggesting >>>>>>> them >>>>>>>>> to use `map` >>>>>>> >>>>>>> But this might introduce unnecessary re-partitioning for downstream >>>>>>> operators. I don't thinks that a good suggestion. But if we only add >>>> new >>>>>>> overloads for mapValue(), flatMapValue() etc, I don't see a big issue >>>>>>> with "overstaffing" the API (what is btw a very valid concern). >>>>>>> >>>>>>> >>>>>>> -Matthias >>>>>>> >>>>>>> >>>>>>> On 6/4/17 10:37 PM, Guozhang Wang wrote: >>>>>>>> On Sun, Jun 4, 2017 at 8:41 PM, Matthias J. Sax < >>>> matth...@confluent.io >>>>>>> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> We started with this proposal but it does not allow for Lambdas (in >>>>>> case >>>>>>>>> you want key access). Do you think preserving Lambdas is not >>>> important >>>>>>>>> enough for this case -- I agree that there is some price to be paid >>>> to >>>>>>>>> keep Lambdas. >>>>>>>>> >>>>>>>> >>>>>>>> Not sure if I understand this comment.. My main point is not on >>>>>> changing >>>>>>>> the proposal but just reduce it scope to `ValueJoinerWithKey` only; >>>> and >>>>>>>> even if we want to keep them all, I'd suggest we just implement the >>>>>> added >>>>>>>> APIs by using the `KeyValueMapper` for `ValueMapperWithKeys`, etc, >>>>>> which >>>>>>>> seems simpler to me. Does that affect lambda expression usage? >>>>>>>> >>>>>>>>> >>>>>>>>> About API consistency: I can't remember a concrete user request to >>>>>> have >>>>>>>>> key access in all operators. But I am pretty sure, if we only add >>> it >>>>>> for >>>>>>>>> some, this request will pop up quickly. IMHO, it's better to do it >>>> all >>>>>>>>> in one shot. (But I am not strict about it if most people think we >>>>>>>>> should limit it to what was requested by users.) >>>>>>>>> >>>>>>>>> >>>>>>>> I would suggest not doing it if user pop it up, but rather >>> suggesting >>>>>>> them >>>>>>>> to use `map` etc directly but set the key unchanged rather than >>>>>>> providing a >>>>>>>> new operator for it. To me some syntax sugars like this seems of >>> less >>>>>>>> valuable than others (like print / writeAsText / foreach that are >>> all >>>>>>>> depending on peek), and keeping adding them will just make the DSL >>> too >>>>>>>> “overstaffed”. >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> -Matthias >>>>>>>>> >>>>>>>>> On 6/4/17 6:23 PM, Guozhang Wang wrote: >>>>>>>>>> With KIP-159, the added "valueMapperWithKey" and >>>>>>>>> "valueTransformerWithKey" >>>>>>>>>> along seem to be just adding a few syntax-sugars? E.g. we can >>> simply >>>>>>>>>> implement: >>>>>>>>>> >>>>>>>>>> mapValues(ValueMapperWithKey mapperWithKey) >>>>>>>>>> >>>>>>>>>> as >>>>>>>>>> >>>>>>>>>> map((k, v) -> (k, mapperWithKey(k, v)) >>>>>>>>>> >>>>>>>>>> ---------------------- >>>>>>>>>> >>>>>>>>>> I'm not sure how many users would really need such syntax sugars, >>>> and >>>>>>>>> even >>>>>>>>>> they do, we can support them easily as the above implementations; >>>>>>>>>> >>>>>>>>>> Similarly for "ReducerWithKey", it can be implemented as >>>>>> `Aggregator<K, >>>>>>>>> V, >>>>>>>>>> V>`, and people who needs key access can just use `aggregate` >>>>>> directly. >>>>>>>>>> >>>>>>>>>> The function which I think is really of valuable is >>>>>>> `ValueJoinerWithKey`, >>>>>>>>>> and that seems to be the original request from users while others >>>> are >>>>>>>>>> coming from "API consistency" concerns. Personally I'd prefer only >>>>>> keep >>>>>>>>> the >>>>>>>>>> last one (`InitializerWithKey` might also have some value, but I >>>> have >>>>>>> not >>>>>>>>>> seen people widely requesting it in their DSL usage yet; if there >>> is >>>>>> a >>>>>>>>>> common request we can keep it in this KIP as well). WDYT? >>>>>>>>>> >>>>>>>>>> Guozhang >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Sun, May 28, 2017 at 10:16 AM, Jeyhun Karimov < >>>>>> je.kari...@gmail.com >>>>>>>> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Thanks for clarification Matthias, now everything is clear. >>>>>>>>>>> >>>>>>>>>>> On Sun, May 28, 2017 at 6:21 PM Matthias J. Sax < >>>>>>> matth...@confluent.io> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> I don't think we can drop ValueTransformerSupplier. If you don't >>>>>> have >>>>>>>>> an >>>>>>>>>>>> supplier, you only get a single instance of your function. But >>> for >>>>>> a >>>>>>>>>>>> stateful transformation, we need multiple instances (one for >>> each >>>>>>> task) >>>>>>>>>>>> of ValueTransformer. >>>>>>>>>>>> >>>>>>>>>>>> We don't need suppliers for functions like "ValueMapper" etc >>>>>> because >>>>>>>>>>>> those are stateless and thus, we can reuse a single instance >>> over >>>>>>>>>>>> multiple tasks -- but we can't do this for ValueTransformer (and >>>>>>>>>>> similar). >>>>>>>>>>>> >>>>>>>>>>>> Btw: This reminds me about KIP-159: with regard to the >>>> RichFunction >>>>>>> we >>>>>>>>>>>> might need a supplier pattern, too. (I'll comment on the other >>>>>>> thread, >>>>>>>>>>>> too.) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -Matthias >>>>>>>>>>>> >>>>>>>>>>>> On 5/28/17 5:45 AM, Jeyhun Karimov wrote: >>>>>>>>>>>>> Hi, >>>>>>>>>>>>> >>>>>>>>>>>>> I updated KIP. >>>>>>>>>>>>> Just to avoid misunderstanding, I meant deprecating >>>>>>>>>>>> ValueTransformerSupplier >>>>>>>>>>>>> and I am ok with ValueTransformer. >>>>>>>>>>>>> So instead of using ValueTransformerSupplier can't we directly >>>> use >>>>>>>>>>>>> ValueTransformer >>>>>>>>>>>>> or ValueTransformerWithKey? >>>>>>>>>>>>> >>>>>>>>>>>>> Btw, in current design all features of ValueTransformer will be >>>>>>>>>>> available >>>>>>>>>>>>> in ValueTransformerWithKey interface. >>>>>>>>>>>>> >>>>>>>>>>>>> Cheers, >>>>>>>>>>>>> Jeyhun >>>>>>>>>>>>> >>>>>>>>>>>>> On Sun, May 28, 2017 at 6:15 AM Matthias J. Sax < >>>>>>>>> matth...@confluent.io >>>>>>>>>>>> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks Jeyhun. >>>>>>>>>>>>>> >>>>>>>>>>>>>> About ValueTransformer: I don't think we can remove it. Note, >>>>>>>>>>>>>> ValueTransformer allows to attach a state and also allows to >>>>>>> register >>>>>>>>>>>>>> punctuations. Both those features will not be available via >>>>>>> withKey() >>>>>>>>>>>>>> interfaces. >>>>>>>>>>>>>> >>>>>>>>>>>>>> -Matthias >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 5/27/17 1:25 PM, Jeyhun Karimov wrote: >>>>>>>>>>>>>>> Hi Matthias, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks for your comments. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I tested the deep copy approach. It has significant overhead. >>>>>>>>>>>> Especially >>>>>>>>>>>>>>> for "light" and stateless operators it slows down the >>> topology >>>>>>>>>>>>>>> significantly (> 20% ). I think "warning" users about >>>>>>> not-changing >>>>>>>>>>> the >>>>>>>>>>>>>> key >>>>>>>>>>>>>>> is better warning them about possible performance loss. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> About the interfaces, additionally I considered adding >>>>>>>>>>>>>> InitializerWithKey, >>>>>>>>>>>>>>> AggregatorWithKey and ValueTransformerWithKey. I think they >>> are >>>>>>>>>>>> included >>>>>>>>>>>>>> in >>>>>>>>>>>>>>> PR but not in KIP. I will also include them in KIP, sorry my >>>>>> bad. >>>>>>>>>>>>>>> Including ReducerWithKey definitely makes sense. Thanks. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> One thing I want to mention is that, maybe we should >>> deprecate >>>>>>>>>>> methods >>>>>>>>>>>>>> with >>>>>>>>>>>>>>> argument type ValueTransformerSupplier >>>>>>>>> (KStream.transformValues(...)) >>>>>>>>>>>> and >>>>>>>>>>>>>>> and as a whole the ValueTransformerSupplier interface. >>>>>>>>>>>>>>> We can use ValueTransformer/ValueTransformerWithKey type >>>>>> instead >>>>>>>>>>>> without >>>>>>>>>>>>>>> additional supplier layer. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Cheers, >>>>>>>>>>>>>>> Jeyhun >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Thu, May 25, 2017 at 1:07 AM Matthias J. Sax < >>>>>>>>>>> matth...@confluent.io >>>>>>>>>>>>> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 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 >>>>>>>>>>>>>>>>>>> >>> >> >> >> >
signature.asc
Description: OpenPGP digital signature