Hi Matthias, Bill, I've updated the KIP with your last feedbacks. However, you have suggested to rename : `Suppressed#withName(String)` withName is not a static method like Joined.named was. withName method is part of the new interface NameOperation.
In addition, I've split the PR in 5 commits so that it will be much easier to review. Thanks Le jeu. 21 févr. 2019 à 23:54, Bill Bejeck <bbej...@gmail.com> a écrit : > Hi Florian, > > Overall the KIP LGTM. Once you've addressed the final comments from > Matthias I think we can put this up for a vote. > > Thanks, > Bill > > On Wed, Feb 20, 2019 at 9:42 PM Matthias J. Sax <matth...@confluent.io> > wrote: > > > Florian, > > > > thanks for updating the KIP (and no worries for late reply -- 2.2 > > release kept us busy anyway...). Overall LGTM. > > > > Just some nits: > > > > > > KStream-Table: > > > > Do we need to list the existing stream-globalTable join methods in the > > first table (thought it should only contain new/changing methods). > > > > typo: `join(GlobalKTbale, KeyValueMapper, ValueJoiner, Named)` > > > > `leftJoin(GlobalKTable, KeyValueMapper, ValueJoiner)` is missing the new > > `Named` parameter. > > > > `static Joined#named(final String name)` > > -> should be `#as(...)` instead of `named(...)` > > > > flatTransform() is missing (cf. KIP-313) > > > > > > > > KTable-table: > > > > `Suppressed#withName(String)` > > -> should we change this to `#as(...)` too (similar to `named()`) > > > > > > > > -Matthias > > > > > > > > On 1/25/19 9:49 AM, Matthias J. Sax wrote: > > > I was reading the KIP again, and there are still some open question and > > > inconsistencies: > > > > > > For example for `KGroupedStream#count(Named)` the KIP says, that only > > > the processor will be named, while the state store name will be `PREFIX > > > + COUNT` (ie, an auto-generated name). Additionally, for > > > `KGroupedStream#count(Named, Materialized)` the processor will be named > > > according to `Named` and the store will be named according to > > > `Materialized.as()`. So far so good. It implies that naming the > > > processor and naming the store are independent. (This pattern is > applied > > > to all aggregation functions, for KStream and KTable). > > > > > > However, for `KTable#filter(Predicate, Named)` the KIP says, the > > > processor name and the store name are set. This sound wrong (ie, > > > inconsistent with the first paragraph from above), because there is > also > > > `KTable#filter(Predicate, Named, Materialized)`. Also note, for the > > > first operator, the store might not be materialized to at all. (This > > > issue is there for all KTable operators -- stateless and stateful). > > > > > > Finally, there is the following statement in the KIP: > > > > > >> Also, note that for all methods accepting a Materialized argument, if > > no state store named is provided then the node named will be used to > > generate a one. The state store name will be the node name suffixed with > > "-table". > > > > > > > > > This contradict the non-naming of stores from the very beginning. > > > > > > > > > Also, the KIP still contains the question about `join(GlobalKTable, > > > KeyValueMapper, ValueJoiner)` and `leftJoin(GlobalKTable, > > > KeyValueMapper, ValueJoiner)`. I think a consistent approach would be > to > > > add one overload each that takes a `Named` parameter. > > > > > > > > > Thoughts? > > > > > > > > > -Matthias > > > > > > > > > On 1/17/19 2:56 PM, Bill Bejeck wrote: > > >> +1 for me on Guozhang's proposal for changes to Joined. > > >> > > >> Thanks, > > >> Bill > > >> > > >> On Thu, Jan 17, 2019 at 5:55 PM Matthias J. Sax < > matth...@confluent.io> > > >> wrote: > > >> > > >>> Thanks for all the follow up comments! > > >>> > > >>> As I mentioned earlier, I am ok with adding overloads instead of > using > > >>> Materialized to specify the processor name. Seems this is what the > > >>> majority of people prefers. > > >>> > > >>> I am also +1 on Guozhang's suggestion to deprecate `static > > >>> Joined#named()` and replace it with `static Joined#as` for > consistency > > >>> and to deprecate getter `Joined#name()` for removal and introduce > > >>> `JoinedInternal` to access the name. > > >>> > > >>> @Guozhang: the vote is already up :) > > >>> > > >>> > > >>> -Matthias > > >>> > > >>> On 1/17/19 2:45 PM, Guozhang Wang wrote: > > >>>> Wow that's a lot of discussions in 6 days! :) Just catching up and > > >>> sharing > > >>>> my two cents here: > > >>>> > > >>>> 1. Materialized: I'm inclined to not let Materialized extending > Named > > and > > >>>> add the overload as well. All the rationales have been very well > > >>> summarized > > >>>> before. Just to emphasize on John's points: Materialized is > > considered as > > >>>> the control object being leveraged by the optimization framework to > > >>>> determine if the state store should be physically materialized or > > not. So > > >>>> let's say if the user does not want to query the store (hence it can > > just > > >>>> be locally materialized), but still want to name the processor, they > > need > > >>>> to do either > > "count(Materialized.as(null).withName("processorName"));" or > > >>>> "count(Named.as("processorName"));" and neither of it is a bit hard > to > > >>>> educate to users, and hence it looks that an overload function with > > two > > >>>> parameters are easier to understand. > > >>>> > > >>>> 2. As for `NamedOperation`: I've left a comment about it before, > i.e. > > "1) > > >>>> Regarding the interface / function name, I'd propose we call the > > >>> interface > > >>>> `NamedOperation` which would be implemented by Produced / Consumed / > > >>>> Printed / Joined / Grouped / Suppressed (note I intentionally > exclude > > >>>> Materialized here since its semantics is quite), and have the > default > > >>> class > > >>>> that implements `NamedOperation` as `Named`, which would be used in > > our > > >>>> adding overload functions. The main reason is to have consistency in > > >>>> naming." And I think I'm on the same page with John with his more > > >>> detailed > > >>>> proposal. > > >>>> > > >>>> 3. As for `Joined`: I actually would suggest we bite the bullet and > > >>> remove > > >>>> it as well, because we are trying to fix some inconsistencies in > this > > KIP > > >>>> anyways (or is that not agreed upon yet?), my thoughts were that we > > will > > >>>> have the following breaking renamings as below: > > >>>> > > >>>> 3.a) static Joined#named() -> Joined#as() > > >>>> 3.b) Joined#name() -> "deleted" > > >>>> > > >>>> > > >>>> I also think that we can start the voting thread asap since we are > > >>>> achieving to an consensus and the KIP deadline is approaching. The > > wiki > > >>>> page itself may still need to be updated though with the API > breaking > > >>>> changes above. > > >>>> > > >>>> > > >>>> Guozhang > > >>>> > > >>>> > > >>>> On Thu, Jan 17, 2019 at 1:43 PM Florian Hussonnois < > > >>> fhussonn...@gmail.com> > > >>>> wrote: > > >>>> > > >>>>> Sorry, I've sent my previous mail to quickly. Unlike the Consumed, > > >>> Produced > > >>>>> and Grouped classes, the Joined class does have getter methods. So > I > > >>>>> propose to keep the name() method only for this class. > > >>>>> For other classes the name will be accessible through XXXInternal > > >>> classes. > > >>>>> > > >>>>> Le jeu. 17 janv. 2019 à 22:39, John Roesler <j...@confluent.io> a > > >>> écrit : > > >>>>> > > >>>>>> Just to chime in regarding NamedInternal. That was my bad mental > > model > > >>> to > > >>>>>> blame. It is indeed coercion, not casting. Even more relevant, I'm > > not > > >>> a > > >>>>>> fan of the XInternal pattern, but it is the pattern we have. It > > would > > >>> be > > >>>>>> worse to start carving out exceptions. > > >>>>>> > > >>>>>> So I agree that we should have: > > >>>>>> * `NamedOperation` interface, declaring only the > `withName(String)` > > >>>>> setter > > >>>>>> member > > >>>>>> * `Named implements NamedOperation` class with a protected `name` > > >>> field, > > >>>>>> set by the `withName` setter (and also other config objects would > do > > >>> the > > >>>>>> same, e.g., `Grouped implements NamedOperation`) > > >>>>>> * `NamedInternal extends Named` class with a public (but > internally > > >>>>>> targeted) `name()` getter to expose the name to the topology > > builder. > > >>>>>> Likewise all the other config classes that implement > NamedOperation > > >>> would > > >>>>>> expose a `name()` getter for the same purpose. It's not in the > > public > > >>>>> API, > > >>>>>> but we should take care to make sure the getter method has the > same > > >>> name > > >>>>>> everywhere for minimum confusion. > > >>>>>> > > >>>>>> Thanks, everyone! > > >>>>>> -John > > >>>>>> > > >>>>>> On Thu, Jan 17, 2019 at 12:09 PM Bill Bejeck <bbej...@gmail.com> > > >>> wrote: > > >>>>>> > > >>>>>>> I'm getting caught up with the current state of this KIP. > > >>>>>>> > > >>>>>>> I agree that the question on what to do with overloads is a > > difficult > > >>>>> one > > >>>>>>> to answer. > > >>>>>>> > > >>>>>>> Both John and Matthias have laid out their thoughts thoroughly, > and > > >>> the > > >>>>>>> points made by both resonate with me. > > >>>>>>> > > >>>>>>> I've spent some time thinking about this, and while I have a > > problem > > >>>>> with > > >>>>>>> adding overloaded methods, I can't quite get comfortable with the > > >>>>> notion > > >>>>>> of > > >>>>>>> Materialized naming the processing node. For me, it comes down > to > > the > > >>>>>> fact > > >>>>>>> that Materialized is used to configure the state store for an > > >>>>> individual > > >>>>>>> processing node and knows nothing of the operation itself. So > I'll > > go > > >>>>>> with > > >>>>>>> adding the Named overload to methods taking a Materialized by a > > narrow > > >>>>>>> margin. > > >>>>>>> > > >>>>>>> As for the name method, I agree with Matthias that it's not > > consistent > > >>>>>> with > > >>>>>>> the approach we've taken so far whether for better or worse, but > to > > >>>>> quote > > >>>>>>> Matthias, "that ship has sailed." IMHO adding the method for > > making > > >>>>>>> testing easier doesn't justify it, as there are ways to get the > > name > > >>>>> via > > >>>>>>> NamedInternal class. > > >>>>>>> > > >>>>>>> Just my 2 cents. > > >>>>>>> > > >>>>>>> Thanks, > > >>>>>>> Bill > > >>>>>>> > > >>>>>>> On Wed, Jan 16, 2019 at 5:40 PM Matthias J. Sax < > > >>> matth...@confluent.io > > >>>>>> > > >>>>>>> wrote: > > >>>>>>> > > >>>>>>>> Thanks for the details John. > > >>>>>>>> > > >>>>>>>> While I understand your argument that it is no optimal to use > > >>>>>>>> `Materialized` to set the processor name, I still slightly > prefer > > >>>>> this > > >>>>>>>> option, because adding more overloads seems to be even worse to > > me. > > >>>>>>>> > > >>>>>>>> But I would also not block this KIP if the majority of people > > prefer > > >>>>> to > > >>>>>>>> add overloads instead of extending `Materialized`. > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> However, I cannot follow your argument about > > `NamedOperation#name()` > > >>>>>>>> getter method. So far, all configuration classes don't have > > getters > > >>>>> and > > >>>>>>>> it seems to be inconsistent to add a single one now. We also > don't > > >>>>> need > > >>>>>>>> any cast IMHO, as we would use the same construct as we do for > all > > >>>>>> other > > >>>>>>>> config classed via `NamedInternal` to access the name: > > >>>>>>>> > > >>>>>>>>> final String name = new NamedInternal(named).name(); > > >>>>>>>> > > >>>>>>>> Maybe, it would have been better to add getters from the > > beginning on > > >>>>>>>> (even if I think it was the right decision to not add getters). > > >>>>>> However, > > >>>>>>>> this ship have sailed and if we want to add getters to avoid the > > >>>>>>>> `XxxInternal()` construct, we should do it for all classes -- > > >>>>> however, > > >>>>>>>> what would a user gain if we do this? It would just be a lot of > > >>>>> "noise" > > >>>>>>>> IMHO. > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> @Florian: I would suggest to start a VOTE if you want to get > this > > >>>>> into > > >>>>>>>> 2.2 release. The open questions seem to be minor and I think we > > can > > >>>>>>>> resolve them in parallel to the vote. > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> -Matthias > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> On 1/16/19 12:59 PM, John Roesler wrote: > > >>>>>>>>> Hi Matthias, > > >>>>>>>>> > > >>>>>>>>> One thing that we discussed earlier was to avoid creating > > ambiguity > > >>>>>> by > > >>>>>>>>> conflating config objects that configure an operation (like > > >>>>> Grouped) > > >>>>>>> with > > >>>>>>>>> config objects that configure an aspect of the operation (like > > >>>>>>>>> Materialized). > > >>>>>>>>> > > >>>>>>>>> It is natural for the Grouped config to extend Named, as doing > so > > >>>>>>>> indicates > > >>>>>>>>> that grouping operations can be named (I.e., the name applies > to > > >>>>> the > > >>>>>>>>> operation itself, which in turn makes it reasonable to use the > > >>>>>>>> operation's > > >>>>>>>>> name as a component in the related processors' and topics' > > names). > > >>>>>>>>> > > >>>>>>>>> But what would it mean for Materialized to extend Named? > > >>>>> Materialized > > >>>>>>>> only > > >>>>>>>>> configures the materialization of an operation's result, not > the > > >>>>>>>> operation > > >>>>>>>>> itself, so I guess it would mean the name applies to the result > > of > > >>>>>> the > > >>>>>>>>> operation? It doesn't really work. > > >>>>>>>>> > > >>>>>>>>> Adding config objects to the DSL was an attempt to avoid > overload > > >>>>>> bloat > > >>>>>>>> as > > >>>>>>>>> more aspects of operations need to be configured. > > >>>>>>>>> However, we made a mistake with Materialized, since (as noted) > it > > >>>>>>> doesn't > > >>>>>>>>> configure the operation itself, but just one aspect of it. > > >>>>>>>>> We basically bagged a bunch of parameters into one, without > > solving > > >>>>>> the > > >>>>>>>>> problem structurally, and this is the result: > > >>>>>>>>> As soon as we need to configure a *different* aspect of the > > >>>>>> operation, > > >>>>>>> we > > >>>>>>>>> again need to add a new overload, and the cycle begins again. > > >>>>>>>>> > > >>>>>>>>> The proper solution here is to add an eponymous config object > to > > >>>>> each > > >>>>>>>>> stateful operation, one which mixes in or composes the > > Materialized > > >>>>>>>> aspect > > >>>>>>>>> config and the Named aspect config. But this is a large API > > change, > > >>>>>> and > > >>>>>>>> we > > >>>>>>>>> decided on the middle ground of just adding Named as an > optional > > >>>>>>>> parameter > > >>>>>>>>> via new overloads for now. > > >>>>>>>>> > > >>>>>>>>> A similar compromise was to go ahead and add a Named overload > > >>>>>> directly > > >>>>>>> to > > >>>>>>>>> all the operators that currently have no config object. > > >>>>>>>>> Again, the proper thing would be to add a new config class for > > each > > >>>>>>>>> individual operation, but it seemed like a drastic change. > > >>>>>>>>> We basically said that right now, we don't think we'll ever > need > > to > > >>>>>>>>> configure another aspect of those operators than the name, and > > >>>>> we're > > >>>>>>>>> acknowledging that if we do, we'll have to created a small mess > > to > > >>>>>>> clean > > >>>>>>>> up. > > >>>>>>>>> It's really just a generalization of the same problem with > > >>>>>> Materialized > > >>>>>>>>> operations. > > >>>>>>>>> > > >>>>>>>>> To answer your question about the Named interface: > > >>>>>>>>> The primary reason is that Named is an aspect that is meant to > be > > >>>>>> mixed > > >>>>>>>> in > > >>>>>>>>> with other config objects. > > >>>>>>>>> For example, Grouped can extend Named. > > >>>>>>>>> If we followed the pattern you've referenced, we would have a > > >>>>> public > > >>>>>>>>> interface Named with only the setter and a private class > > >>>>>> NamedInternal > > >>>>>>>> with > > >>>>>>>>> the setter and getter. > > >>>>>>>>> But would Grouped be a subclass of NamedInternal? > > >>>>>>>>> Then, we could only have one kind of aspect mixin, since Java > > >>>>> doesn't > > >>>>>>>> have > > >>>>>>>>> multiple class inheritance, or we'd have to decide if the next > > >>>>> thing > > >>>>>>>> should > > >>>>>>>>> be a superclass of Named or a subclass of Named and a > superclass > > of > > >>>>>>>> Grouped. > > >>>>>>>>> Plus, in the implementation, instead of just casting Grouped to > > >>>>>>>>> GroupedInternal (which is already unclean design), we'd also be > > >>>>>> casting > > >>>>>>>>> Grouped to NamedInternal, which is super confusing. > > >>>>>>>>> > > >>>>>>>>> It's far cleaner all around just to use the type system "the > > right > > >>>>>>> way", > > >>>>>>>>> which is what we've proposed. > > >>>>>>>>> Any config class can mix in the Named aspect, and it inherits a > > >>>>>>> contract > > >>>>>>>> to > > >>>>>>>>> supply both the setter and the getter. > > >>>>>>>>> Our implementation can actually avoid any casting in this > usage, > > >>>>>> since > > >>>>>>> we > > >>>>>>>>> can just call grouped.name() to get the name, instead of > > something > > >>>>>>> like > > >>>>>>>>> ((NamedInternal) grouped).name(). > > >>>>>>>>> > > >>>>>>>>> Plus, what harm does it do to let people get back the > > configuration > > >>>>>>>>> property that they *just set* on the config object? > > >>>>>>>>> It doesn't break encapsulation. > > >>>>>>>>> It would certainly make writing tests a lot easier for > everyone. > > >>>>>>>>> > > >>>>>>>>> All around, I would advocate for moving toward this design for > > all > > >>>>>> the > > >>>>>>>>> config interfaces, as I've previously demonstrated how we've > made > > >>>>> an > > >>>>>>>>> intractable mess out of the window config hierarchy by trying > to > > be > > >>>>>>>> clever > > >>>>>>>>> and hiding the getters. > > >>>>>>>>> > > >>>>>>>>> I hope this helps, > > >>>>>>>>> -John > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On Wed, Jan 16, 2019 at 12:59 AM Matthias J. Sax < > > >>>>>>> matth...@confluent.io> > > >>>>>>>>> wrote: > > >>>>>>>>> > > >>>>>>>>>> While I understand that it should be possible to specify store > > >>>>> name > > >>>>>>> and > > >>>>>>>>>> processor name independent from each other, it's still unclear > > to > > >>>>>> me, > > >>>>>>>>>> why we cannot use the `Materialized` parameter to specify the > > >>>>>>> processor > > >>>>>>>>>> name: > > >>>>>>>>>> > > >>>>>>>>>>> // only set the node name > > >>>>>>>>>>> #count(Named.as("processorName")); > > >>>>>>>>>>> > > >>>>>>>>>>> // only set the store name > > >>>>>>>>>>> #count(Materialized.as("storeName")); > > >>>>>>>>>>> > > >>>>>>>>>>> // set both > > >>>>>>>>>>> > #count(Materialized.as("storeName").withName("processorName")); > > >>>>>>>>>> > > >>>>>>>>>> This this case, it might be good to rename `withName` to > > >>>>>>>>>> `withProcessorName` to avoid confusion with the store name. > > >>>>>>>>>> > > >>>>>>>>>> However, why do we need this: > > >>>>>>>>>> > > >>>>>>>>>>> #count(Materialized.as("storeName"), > > Named.as("processorName")); > > >>>>>>>>>> > > >>>>>>>>>> I would prefer to not add this overload. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> Strictly, we could also avoid `#count(Named)`, and set the > > >>>>> processor > > >>>>>>>>>> name only via: > > >>>>>>>>>> > > >>>>>>>>>>> #count(Materialized.as(null).withName("processorName")); > > >>>>>>>>>> > > >>>>>>>>>> I admit, it's a little clumsy, but would save us one more > > >>>>> overload. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> One more comment that I forgot last time: why do we add the > > getter > > >>>>>>>>>> `Named#name()`? All other configuration classes only define > > >>>>> setters > > >>>>>>> and > > >>>>>>>>>> we add getters only in the internal implementation. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> -Matthias > > >>>>>>>>>> > > >>>>>>>>>> On 1/13/19 4:22 AM, Florian Hussonnois wrote: > > >>>>>>>>>>> Hi Matthias, > > >>>>>>>>>>> > > >>>>>>>>>>> The reason for overloading the methods with Materialized > > >>>>> parameter > > >>>>>> is > > >>>>>>>>>>> regarding the semantic of this class. > > >>>>>>>>>>> The Materialized class allow to name a queryable store. if a > > name > > >>>>>> is > > >>>>>>>> set > > >>>>>>>>>>> then it will be used both to name the state-store and the > > >>>>>>>>>> changelog-topic. > > >>>>>>>>>>> If no name is given, then the provided Named will be used. > > >>>>>>>>>>> This allow to name the operation without having a queriable > > >>>>> store. > > >>>>>>>>>>> > > >>>>>>>>>>> So if my analysis is correct, we will end up with : > > >>>>>>>>>>> > > >>>>>>>>>>> Generated | Named | > > Joined / > > >>>>>>>>>> Grouped > > >>>>>>>>>>> | Materialized > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> Node | X | X > > | > > >>>>>> X > > >>>>>>>>>>> | > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> Repartition Topic | X | | > > X > > >>>>>>>>>>> | > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> Queryable Store | | | > > >>>>>>>>>>> | X > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> State store | X | X | > > >>>>> X > > >>>>>>>>>>> | X > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> Changelog Topic | X | X | > X > > >>>>>>>>>>> | X > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>> > > > ------------------------------------------------------------------------------------------------- > > >>>>>>>>>>> > > >>>>>>>>>>> Le dim. 13 janv. 2019 à 03:23, Matthias J. Sax < > > >>>>>>> matth...@confluent.io> > > >>>>>>>> a > > >>>>>>>>>>> écrit : > > >>>>>>>>>>> > > >>>>>>>>>>>> Just catching up on this KIP again. > > >>>>>>>>>>>> > > >>>>>>>>>>>> One nit. The KIP says: > > >>>>>>>>>>>> > > >>>>>>>>>>>>> In addition, the generated names have a few disadvantages > to > > >>>>>>>> guarantee > > >>>>>>>>>>>> topology compatibilities. In fact, adding a new operator, > > using > > >>>>> a > > >>>>>>>>>>>> third-library doing some optimization to remove some > operators > > >>>>> or > > >>>>>>>>>> upgrading > > >>>>>>>>>>>> to a new KafkaStreams version with internal API changes may > > >>>>>> changed > > >>>>>>>>>> suffix > > >>>>>>>>>>>> indexing for a large amount of the processor names. This > will > > in > > >>>>>>> turn > > >>>>>>>>>>>> change the internal state store names, as well as internal > > topic > > >>>>>>> names > > >>>>>>>>>> as > > >>>>>>>>>>>> well. > > >>>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> This is not true any longer (I guess it was true, when the > KIP > > >>>>> was > > >>>>>>>>>>>> initially proposed), because all stores/internal-topics can > be > > >>>>>> named > > >>>>>>>>>>>> since 2.1 release. I would suggest to remove the paragraph. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Overall, I like the Named/NamedOperation design. > > >>>>>>>>>>>> > > >>>>>>>>>>>> What is unclear to me thought is, why we need new overloads > > for > > >>>>>>>> methods > > >>>>>>>>>>>> that accept `Materialized`. To be more precise, I think it > > make > > >>>>>>> sense > > >>>>>>>> to > > >>>>>>>>>>>> add an overload that only takes `Named`, but not one that > > takes > > >>>>>> both > > >>>>>>>>>>>> `Named` and `Materialized`. For example: > > >>>>>>>>>>>> > > >>>>>>>>>>>> KGroupedStream#count() // exists > > >>>>>>>>>>>> KGroupedStream#count(Materialized) // exits > > >>>>>>>>>>>> KGroupedStream#count(Named) // added (makes sense to me) > > >>>>>>>>>>>> KGroupedStream#count(Named, Materialized) // added -- why? > > >>>>>>>>>>>> > > >>>>>>>>>>>> I would prefer to use `Materialized` to name the processor > for > > >>>>>> this > > >>>>>>>>>>>> case, too. Can you elaborate on the motivation? > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> -Matthias > > >>>>>>>>>>>> > > >>>>>>>>>>>> On 1/11/19 3:39 PM, Florian Hussonnois wrote: > > >>>>>>>>>>>>> Hi Guozhang, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I have updated the PR as well as the KIP. I should add more > > >>>>> unit > > >>>>>>>> tests > > >>>>>>>>>> to > > >>>>>>>>>>>>> covers all new methods. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> However, I still have one test in failure. The reason is > that > > >>>>>> using > > >>>>>>>>>>>>> Joined.name() in both potential repartition topic and > > processor > > >>>>>>> nodes > > >>>>>>>>>>>> leads > > >>>>>>>>>>>>> to topology-incompatible. > > >>>>>>>>>>>>> How should we deal with that ? > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Le jeu. 10 janv. 2019 à 01:21, Guozhang Wang < > > >>>>> wangg...@gmail.com > > >>>>>>> > > >>>>>>> a > > >>>>>>>>>>>> écrit : > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hello Florian, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Just checking if have read about my previous email and if > > you > > >>>>>> feel > > >>>>>>>>>> happy > > >>>>>>>>>>>>>> about it. We have the 2.2 KIP freeze deadline at 24th this > > >>>>>> month, > > >>>>>>>>>> while > > >>>>>>>>>>>> the > > >>>>>>>>>>>>>> PR itself is getting quite close. So it'll be great if we > > can > > >>>>>> get > > >>>>>>>> the > > >>>>>>>>>>>>>> agreement on it and get it into 2.2.0 release. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Mon, Dec 17, 2018 at 2:39 PM Guozhang Wang < > > >>>>>> wangg...@gmail.com > > >>>>>>>> > > >>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Hi Florian / John, > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Just wanted to throw a couple minor thoughts on the > current > > >>>>>>>> proposal: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> 1) Regarding the interface / function name, I'd propose > we > > >>>>> call > > >>>>>>> the > > >>>>>>>>>>>>>>> interface `NamedOperation` which would be implemented by > > >>>>>>> Produced / > > >>>>>>>>>>>>>>> Consumed / Printed / Joined / Grouped / Suppressed (note > I > > >>>>>>>>>>>> intentionally > > >>>>>>>>>>>>>>> exclude Materialized here since its semantics is quite), > > and > > >>>>>> have > > >>>>>>>> the > > >>>>>>>>>>>>>>> default class that implements `NamedOperation` as > `Named`, > > >>>>>> which > > >>>>>>>>>> would > > >>>>>>>>>>>> be > > >>>>>>>>>>>>>>> used in our adding overload functions. The main reason is > > to > > >>>>>> have > > >>>>>>>>>>>>>>> consistency in naming. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> 2) As a minor tweak, I think it's better to use > > Joined.name() > > >>>>>> in > > >>>>>>>> both > > >>>>>>>>>>>> its > > >>>>>>>>>>>>>>> possibly generate repartition topic, as well as the map > > >>>>>> processor > > >>>>>>>>>> used > > >>>>>>>>>>>> for > > >>>>>>>>>>>>>>> group-by (currently this name is only used for the > > >>>>> repartition > > >>>>>>>>>> topic). > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Florian: if you think this proposal makes sense, please > > feel > > >>>>>> free > > >>>>>>>> to > > >>>>>>>>>> go > > >>>>>>>>>>>>>>> ahead and update the PR; after we made a first pass on it > > and > > >>>>>>> feels > > >>>>>>>>>>>>>>> confident about it, we can go ahead with the VOTING > > process. > > >>>>>>> About > > >>>>>>>>>> the > > >>>>>>>>>>>>>>> implementation of 2) above, this may be out of your > > >>>>>>> implementation > > >>>>>>>>>>>> scope, > > >>>>>>>>>>>>>>> so feel free to leave it out side your PR while Bill who > > >>>>>>> originally > > >>>>>>>>>>>> worked > > >>>>>>>>>>>>>>> on the Grouped KIP can make a follow-up PR for it. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> On Fri, Dec 14, 2018 at 9:43 PM Guozhang Wang < > > >>>>>>> wangg...@gmail.com> > > >>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Hello Florian, > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Really appreciate you for your patience. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> I know that we've discussed about the approach to adding > > >>>>>>>> overloaded > > >>>>>>>>>>>>>>>> functions and rejected it early on. But looking deeper > > into > > >>>>>> the > > >>>>>>>>>>>> current PR > > >>>>>>>>>>>>>>>> I realized that this approach has a danger of great API > > >>>>>>> confusions > > >>>>>>>>>> to > > >>>>>>>>>>>> users > > >>>>>>>>>>>>>>>> (I tried to explain my thoughts in the PR, but it was > not > > >>>>> very > > >>>>>>>>>> clear) > > >>>>>>>>>>>> --- > > >>>>>>>>>>>>>>>> the basic idea is that, today we already have a few > > existing > > >>>>>>>> control > > >>>>>>>>>>>>>>>> classes including Grouped, Joined, Suppressed that allow > > >>>>> users > > >>>>>>> to > > >>>>>>>>>>>> specify > > >>>>>>>>>>>>>>>> serdes etc, while also a "name" which can then be used > to > > >>>>>> define > > >>>>>>>> the > > >>>>>>>>>>>>>>>> processor name / internal topic names in the topology > (the > > >>>>>>> static > > >>>>>>>>>>>> function > > >>>>>>>>>>>>>>>> names are not consistent, which I think we should fix as > > >>>>>> well). > > >>>>>>>> And > > >>>>>>>>>>>> Named > > >>>>>>>>>>>>>>>> interface, by extending the lambda function interfaces > > like > > >>>>>>>>>>>> ValueJoiner / > > >>>>>>>>>>>>>>>> Predicate etc opens the door for another way to specify > > the > > >>>>>>> names > > >>>>>>>>>>>> again. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> So in order to achieve consistency, we are left with > > >>>>> generally > > >>>>>>> two > > >>>>>>>>>>>>>>>> options: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> 1) only allow users to specify names via the lambda > > >>>>> interfaces > > >>>>>>>> that > > >>>>>>>>>>>>>>>> extends Named interface. This means we'd better remove > the > > >>>>>>> naming > > >>>>>>>>>>>> mechanism > > >>>>>>>>>>>>>>>> from the existing control objects to keep consistency. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> 2) only allow users to specify names via control > classes, > > >>>>> and > > >>>>>> we > > >>>>>>>>>>>>>>>> introduce a new class (Named) for those which do not > have > > >>>>> one > > >>>>>>> yet > > >>>>>>>>>> --- > > >>>>>>>>>>>> this > > >>>>>>>>>>>>>>>> leads to the overloaded functions. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> I did a quick count on the num.of overloaded functions, > > and > > >>>>>>>> summing > > >>>>>>>>>>>> from > > >>>>>>>>>>>>>>>> KTable (8) / KStream (15) / KGroupedStream (6) / > > >>>>> KGroupedTable > > >>>>>>>> (6) / > > >>>>>>>>>>>>>>>> TimeWindowedKStream (6) / SessionWindowedKStream (6) we > > got > > >>>>>>> about > > >>>>>>>> 47 > > >>>>>>>>>>>>>>>> overloaded functions (our guess was pretty close!) -- > note > > >>>>>> this > > >>>>>>> is > > >>>>>>>>>>>> based on > > >>>>>>>>>>>>>>>> John's proposal that we can let existing Grouped / > Joined > > to > > >>>>>>>> extend > > >>>>>>>>>>>> Named > > >>>>>>>>>>>>>>>> and hence we only need overloaded functions with a > default > > >>>>>>>>>>>> NamedOperation > > >>>>>>>>>>>>>>>> for those operators that do not have a control classes > > >>>>>> already. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Thinking about this approach I feel it is not too bad > > >>>>> compared > > >>>>>>>> with > > >>>>>>>>>>>>>>>> either 1) above, which would require us to deprecate lot > > of > > >>>>>>> public > > >>>>>>>>>>>>>>>> functions around name(), or having a mixed mechanism for > > >>>>>> naming, > > >>>>>>>>>> which > > >>>>>>>>>>>>>>>> could lead to very confusing behavior to users. > > >>>>> Additionally, > > >>>>>>> for > > >>>>>>>>>> most > > >>>>>>>>>>>>>>>> users who would only want to specify the names for those > > >>>>>>> stateful > > >>>>>>>>>>>>>>>> operations which have internal topics / state stores and > > >>>>> hence > > >>>>>>> are > > >>>>>>>>>>>> more > > >>>>>>>>>>>>>>>> keen to upgrade compatibility, those added overloads > would > > >>>>> be > > >>>>>>>>>>>> not-often > > >>>>>>>>>>>>>>>> used functions for them anyways. And by letting existing > > >>>>>> control > > >>>>>>>>>>>> classes to > > >>>>>>>>>>>>>>>> extend Named, we can have a unified method name for > static > > >>>>>>>>>>>> constructor as > > >>>>>>>>>>>>>>>> well. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> On Fri, Dec 14, 2018 at 10:24 AM John Roesler < > > >>>>>>> j...@confluent.io> > > >>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Sorry about the run-around of rejecting the original > > >>>>>> proposal, > > >>>>>>>>>>>>>>>>> only to return to it later on. Hopefully, it's more > > >>>>>> encouraging > > >>>>>>>>>>>>>>>>> than frustrating that we're coming around to your > initial > > >>>>> way > > >>>>>>> of > > >>>>>>>>>>>>>>>>> thinking. > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Thanks! > > >>>>>>>>>>>>>>>>> -John > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> On Thu, Dec 13, 2018 at 4:28 PM Florian Hussonnois < > > >>>>>>>>>>>>>>>>> fhussonn...@gmail.com> > > >>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Hi all, > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Thanks again. I agree with your propositions. > > >>>>>>>>>>>>>>>>>> Also IMHO, overloading all methods (filter, map) to > > >>>>> accept a > > >>>>>>> new > > >>>>>>>>>>>>>>>>> control > > >>>>>>>>>>>>>>>>>> object seems to provide a more natural development > > >>>>>> experience > > >>>>>>>> for > > >>>>>>>>>>>>>>>>> users. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Actually, this was the first proposition for this KIP, > > but > > >>>>>> we > > >>>>>>>> have > > >>>>>>>>>>>>>>>>> rejected > > >>>>>>>>>>>>>>>>>> it because this solution led to adding a lot of new > > >>>>> methods. > > >>>>>>>>>>>>>>>>>> As you mentioned it, the API has evolve since the > > creation > > >>>>>> of > > >>>>>>>> this > > >>>>>>>>>>>>>>>>> KIP - > > >>>>>>>>>>>>>>>>>> some existing control objects already allow to > customize > > >>>>>>>> internal > > >>>>>>>>>>>>>>>>> names. We > > >>>>>>>>>>>>>>>>>> should so keep on that strategy. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> If everyone is OK with that, I will update the KIP and > > the > > >>>>>> PR > > >>>>>>>>>>>>>>>>> accordingly; > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Thanks. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Le jeu. 13 déc. 2018 à 18:08, John Roesler < > > >>>>>> j...@confluent.io > > >>>>>>>> > > >>>>>>>> a > > >>>>>>>>>>>>>>>>> écrit : > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Hi again, all, > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Matthias, I agree with you. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Florian, thanks for your response. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> I think your proposal is the best way to address the > > ask > > >>>>>> for > > >>>>>>>>>> hiding > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>> name() getter. But I'd like to question that ask and > > >>>>>> instead > > >>>>>>>>>>>>>>>>> propose that > > >>>>>>>>>>>>>>>>>>> we just make the name() getter part of the public > API. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> The desire to "hide" the getters causes a lot of > > >>>>> complexity > > >>>>>>> in > > >>>>>>>>>> our > > >>>>>>>>>>>>>>>>> code > > >>>>>>>>>>>>>>>>>>> base, and it will become completely impractical with > > the > > >>>>>>> mixin > > >>>>>>>>>>>>>>>>> strategy > > >>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>> Named. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> If we were to switch strategies back to mixing Named > in > > >>>>> to > > >>>>>>> the > > >>>>>>>>>>>>>>>>> control > > >>>>>>>>>>>>>>>>>>> objects rather than the functions, then the path > > forward > > >>>>>>>> becomes > > >>>>>>>>>>>>>>>>> quite > > >>>>>>>>>>>>>>>>>>> clear. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> On the other hand, it seems harmless for anyone who > > wants > > >>>>>> to > > >>>>>>> be > > >>>>>>>>>>>>>>>>> able to > > >>>>>>>>>>>>>>>>>>> query the name from a control object after setting > it, > > so > > >>>>>> my > > >>>>>>>> vote > > >>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>> simply to keep the Named interface as: > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> public interface Named<T extends Named<T>> { > > >>>>>>>>>>>>>>>>>>> String name(); > > >>>>>>>>>>>>>>>>>>> T withName(String name); > > >>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Under this proposal, we only mix Named in to the > > control > > >>>>>>>> objects, > > >>>>>>>>>>>>>>>>> which > > >>>>>>>>>>>>>>>>>>> means we have no need of default implementations > > anymore > > >>>>>>>> (because > > >>>>>>>>>>>>>>>>> we can > > >>>>>>>>>>>>>>>>>>> update all the control objects concurrently with > adding > > >>>>>> this > > >>>>>>>>>>>>>>>>> interface to > > >>>>>>>>>>>>>>>>>>> them). > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> This does hinge on switching over to a > > >>>>> control-object-only > > >>>>>>>>>>>> strategy, > > >>>>>>>>>>>>>>>>>> which > > >>>>>>>>>>>>>>>>>>> introduces the need to add about 50 new control > object > > >>>>>>> classes, > > >>>>>>>>>>>>>>>>> which > > >>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>> only serve to implement Named. As a middle ground, > > maybe > > >>>>> we > > >>>>>>>> could > > >>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>> add > > >>>>>>>>>>>>>>>>>>> one generic control object class, like: > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> public class NamedOperation implements > > >>>>>> Named<NamedOperation> > > >>>>>>> { > > >>>>>>>>>>>>>>>>>>> private final String name; > > >>>>>>>>>>>>>>>>>>> private NamedOperation(final String name) { > > this.name > > >>>>> = > > >>>>>>>> name; > > >>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>> public static NamedOperation name(final String > name) > > { > > >>>>>>>>>>>>>>>>>>> return new NamedOperation(name); > > >>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>> public String name() { return name; } > > >>>>>>>>>>>>>>>>>>> public NamedOperation withName(final String name) { > > >>>>>>>>>>>>>>>>>>> return new NamedOperation(name); > > >>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> And then, we'd add overloads for all the methods that > > >>>>> don't > > >>>>>>>> have > > >>>>>>>>>>>>>>>>> control > > >>>>>>>>>>>>>>>>>>> objects already (for example, filter() ): > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> // existing > > >>>>>>>>>>>>>>>>>>> KStream<K, V> filter(Predicate<? super K, ? super V> > > >>>>>>>> predicate); > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> // new > > >>>>>>>>>>>>>>>>>>> KStream<K, V> filter(Predicate<? super K, ? super V> > > >>>>>>> predicate, > > >>>>>>>>>>>>>>>>>>> NamedOperation named); > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Additionally, in regard to Matthias's point about > > >>>>> existing > > >>>>>>>>>> control > > >>>>>>>>>>>>>>>>>> objects > > >>>>>>>>>>>>>>>>>>> with naming semantics, they would extend Named (but > not > > >>>>>>>>>>>>>>>>> NamedOperation) > > >>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>> uniformity. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> You provided a good approach to hide the getter with > > your > > >>>>>>>>>>>>>>>>> SettableName > > >>>>>>>>>>>>>>>>>>> class; I think what you proposed is the only way we > > could > > >>>>>>> hide > > >>>>>>>>>> the > > >>>>>>>>>>>>>>>>> name. > > >>>>>>>>>>>>>>>>>>> In the end, though, it's a lot of complexity added > > >>>>> (control > > >>>>>>>>>> object > > >>>>>>>>>>>>>>>>> class > > >>>>>>>>>>>>>>>>>>> hierarchy, inheritance, mutable state, internal > > casting) > > >>>>>> for > > >>>>>>>>>>>>>>>>> something of > > >>>>>>>>>>>>>>>>>>> dubious value: to be able to hide the name from > someone > > >>>>>>> *after > > >>>>>>>>>> they > > >>>>>>>>>>>>>>>>>>> themselves have set it*. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Although it'll be a pain, perhaps Matthias's > suggestion > > >>>>> to > > >>>>>>>>>>>>>>>>> enumerate all > > >>>>>>>>>>>>>>>>>>> the API methods is the best way to be sure we all > agree > > >>>>> on > > >>>>>>>> what's > > >>>>>>>>>>>>>>>>> going > > >>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>> happen. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Thanks again for wrangling with this issue, > > >>>>>>>>>>>>>>>>>>> -John > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> On Thu, Dec 13, 2018 at 9:03 AM Matthias J. Sax < > > >>>>>>>>>>>>>>>>> matth...@confluent.io> > > >>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Just catching up on this discussion. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> My overall personal take is, that I am not a big fan > > of > > >>>>>> the > > >>>>>>>>>>>>>>>>> interface > > >>>>>>>>>>>>>>>>>>>> `Named` that is used as a factory. I would rather > > prefer > > >>>>>> to > > >>>>>>>> add > > >>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>> control object parameter to all methods that don't > > have > > >>>>>> one > > >>>>>>>> yet. > > >>>>>>>>>>>>>>>>> This > > >>>>>>>>>>>>>>>>>>>> KIP was started a while ago, and we added new naming > > >>>>>>>>>> capabilities > > >>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>> meantime. Guozhang's example in the PR comment about > > >>>>>> naming > > >>>>>>> in > > >>>>>>>>>>>>>>>>>>>> stream-stream join shows, that we might end up in a > > >>>>>>> confusion > > >>>>>>>>>>>>>>>>> situation > > >>>>>>>>>>>>>>>>>>>> for users if we use `Named`. Also, in 2.1, user can > > >>>>>> already > > >>>>>>>> name > > >>>>>>>>>>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>> repartition-/changelog-topics and stores. Thus, > > KIP-307 > > >>>>>>> boils > > >>>>>>>>>>>>>>>>> down to > > >>>>>>>>>>>>>>>>>>>> provide non-functional naming? > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Hence, for all methods that allow to specify names > > >>>>>> already, > > >>>>>>> I > > >>>>>>>>>>>>>>>>> don't see > > >>>>>>>>>>>>>>>>>>>> any reason to change them, but use the existing API > to > > >>>>>> also > > >>>>>>>> name > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>> processor(s) instead of allowing uses to specify a > new > > >>>>>> name. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> About the inconsistency in method naming. I agree, > > that > > >>>>>> `as` > > >>>>>>>> is > > >>>>>>>>>>>>>>>>> very > > >>>>>>>>>>>>>>>>>>>> generic and maybe not the best choice. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> I think it might be helpful, to have a table > overview > > in > > >>>>>> the > > >>>>>>>>>> KIP, > > >>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>> list all existing static/non-static methods that > allow > > >>>>> to > > >>>>>>>>>> specify > > >>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>> name, plus a columns with the new suggested naming > for > > >>>>>> those > > >>>>>>>>>>>>>>>>> methods? > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Thoughts? > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> -Matthias > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> On 12/12/18 12:45 AM, Florian Hussonnois wrote: > > >>>>>>>>>>>>>>>>>>>>> Thank you very much for your feedbacks. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Currently, there is still lot of discussions > > regarding > > >>>>>> the > > >>>>>>>>>> Named > > >>>>>>>>>>>>>>>>>>>> interface. > > >>>>>>>>>>>>>>>>>>>>> On the one hand we should provided consistency over > > the > > >>>>>>>> stream > > >>>>>>>>>>>>>>>>> API > > >>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>> on > > >>>>>>>>>>>>>>>>>>>>> the other hand we should not break the semantic as > > John > > >>>>>>> point > > >>>>>>>>>>>>>>>>> it up. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Guozhang, I'm sorry, but I'm little bit confused, > > >>>>> maybe I > > >>>>>>>>>> missed > > >>>>>>>>>>>>>>>>>>>> something. > > >>>>>>>>>>>>>>>>>>>>> In your comment you have suggested that : > > >>>>>>>>>>>>>>>>>>>>> * Produced/Consumed/Suppressed should extends Named > > >>>>>>>>>>>>>>>>>>>>> * Named should have a private-package method to get > > the > > >>>>>>>>>>>>>>>>> specified > > >>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>> name internally (processorName()) > > >>>>>>>>>>>>>>>>>>>>> * Finally we should end up with something like : > > Named > > >>>>>> -> > > >>>>>>>> XXX > > >>>>>>>>>>>>>>>>> -> > > >>>>>>>>>>>>>>>>>>>>> XXXInternal or Named -> Produced -> > ProducedInternal > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> The objective behind that is to : > > >>>>>>>>>>>>>>>>>>>>> * consolidate the internal method processorName() > > >>>>>>>>>>>>>>>>>>>>> * consolidate the method withName that exists now > > >>>>>> existing > > >>>>>>>> into > > >>>>>>>>>>>>>>>>>>> Produced, > > >>>>>>>>>>>>>>>>>>>>> Consumed and Suppressed. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> But, Named is an interface so we can't define a > > >>>>>>>> private-package > > >>>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>> on > > >>>>>>>>>>>>>>>>>>>>> it. Also, for example Produced and ProducedInternal > > are > > >>>>>> not > > >>>>>>>> in > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>> same > > >>>>>>>>>>>>>>>>>>>>> package so having a private-package method doesn't > > >>>>> really > > >>>>>>>> help. > > >>>>>>>>>>>>>>>>>>>>> In addition, if we add the withName method into > Named > > >>>>>>>> interface > > >>>>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>>>>> become confusing for developers because action > > >>>>> interfaces > > >>>>>>>>>>>>>>>>>> (ValueMapper, > > >>>>>>>>>>>>>>>>>>>>> Reducer, etc) extend it. > > >>>>>>>>>>>>>>>>>>>>> The interface would look like : > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> public interface Named<T extends Named<T>> { > > >>>>>>>>>>>>>>>>>>>>> default String name() { > > >>>>>>>>>>>>>>>>>>>>> return null; > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> default Named<T> withName(final String name) { > > >>>>>>>>>>>>>>>>>>>>> return null; > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> ... > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> So maybe instead of adding another method to Named > we > > >>>>>> could > > >>>>>>>>>>>>>>>>> create a > > >>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>> package-private class that could be extended by > > >>>>>>>>>>>>>>>>>>>>> Produced/Consumed/Joined/Suppressed. For exemple, > > >>>>>>>>>>>>>>>>>>>>> class SettableName<T extends SettableName<T>> > > >>>>> implements > > >>>>>>>> Named > > >>>>>>>>>> { > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> protected String processorName; > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> SettableName(final SettableName settable) { > > >>>>>>>>>>>>>>>>>>>>> this(Objects.requireNonNull(settable, > > "settable > > >>>>>>> can't > > >>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>> null").name()); > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> SettableName(final String processorName) { > > >>>>>>>>>>>>>>>>>>>>> this.processorName = processorName; > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> @Override > > >>>>>>>>>>>>>>>>>>>>> public String name() { > > >>>>>>>>>>>>>>>>>>>>> return processorName; > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> public T withName(final String processorName) { > > >>>>>>>>>>>>>>>>>>>>> this.processorName = processorName; > > >>>>>>>>>>>>>>>>>>>>> return (T)this; > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> In that way, we will get : public class Produced > > >>>>>> implements > > >>>>>>>>>>>>>>>>>>>>> SettableName<Produced> { ... > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> WDYT? > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Le mar. 11 déc. 2018 à 02:46, Guozhang Wang < > > >>>>>>>>>> wangg...@gmail.com> > > >>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>> écrit : > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> I had one meta comment on the PR: > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>> https://github.com/apache/kafka/pull/5909#discussion_r240447153 > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> On Mon, Dec 10, 2018 at 5:22 PM John Roesler < > > >>>>>>>>>>>>>>>>> j...@confluent.io> > > >>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I hope it's ok if I ask a few questions at this > > late > > >>>>>>>> stage... > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Comment 1 ====== > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> It seems like the proposal is to add a new > "Named" > > >>>>>>>> interface > > >>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>> intended to be mixed in with the existing API > > objects > > >>>>>> at > > >>>>>>>>>>>>>>>>> various > > >>>>>>>>>>>>>>>>>>>> points. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Just to preface some of my comments, it looks > like > > >>>>> your > > >>>>>>> KIP > > >>>>>>>>>>>>>>>>> was > > >>>>>>>>>>>>>>>>>>> created > > >>>>>>>>>>>>>>>>>>>>>>> quite a while ago, so the API may have changed > > >>>>> somewhat > > >>>>>>>> since > > >>>>>>>>>>>>>>>>> you > > >>>>>>>>>>>>>>>>>>>>>> started. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> As I see the API, there are a few different kinds > > of > > >>>>>> DSL > > >>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>>>>> arguments: > > >>>>>>>>>>>>>>>>>>>>>>> * functions: things like Initializer, Aggregator, > > >>>>>>>>>> ValueJoiner, > > >>>>>>>>>>>>>>>>>>>>>>> ForEachAction... All of these are essentially > > >>>>>>>>>> Streams-flavored > > >>>>>>>>>>>>>>>>>>> Function > > >>>>>>>>>>>>>>>>>>>>>>> interfaces with different arities, type bounds, > and > > >>>>>>>>>> semantics. > > >>>>>>>>>>>>>>>>>>>>>>> * config objects: things like Produced, Consumed, > > >>>>>> Joined, > > >>>>>>>>>>>>>>>>>> Grouped... > > >>>>>>>>>>>>>>>>>>>>>> These > > >>>>>>>>>>>>>>>>>>>>>>> are containers for configurations, where the > target > > >>>>> of > > >>>>>>> the > > >>>>>>>>>>>>>>>>>>>> configuration > > >>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>> the operation itself > > >>>>>>>>>>>>>>>>>>>>>>> * raw configurations: things like a raw > topic-name > > >>>>>> string > > >>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>> Materialized: > > >>>>>>>>>>>>>>>>>>>>>>> These are configurations for operations that have > > no > > >>>>>>> config > > >>>>>>>>>>>>>>>>> object, > > >>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>> various reasons, we didn't make one. The > > >>>>> distinguishing > > >>>>>>>>>>>>>>>>> feature is > > >>>>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> target of the configuration is not the operation > > >>>>>> itself, > > >>>>>>>> but > > >>>>>>>>>>>>>>>>> some > > >>>>>>>>>>>>>>>>>>>> aspect > > >>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>> it. For example, in Materialized, we are not > > setting > > >>>>>> the > > >>>>>>>>>>>>>>>>> caching > > >>>>>>>>>>>>>>>>>>>> behavior > > >>>>>>>>>>>>>>>>>>>>>>> of, for example, an aggregation; we're setting > the > > >>>>>>> caching > > >>>>>>>>>>>>>>>>> behavior > > >>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>> materialized state store attached to the > > aggregation. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> It seems like choosing to mix the Named interface > > in > > >>>>>> with > > >>>>>>>> the > > >>>>>>>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>>>>>>>>> has > > >>>>>>>>>>>>>>>>>>>>>>> a couple of unfortunate side-effects: > > >>>>>>>>>>>>>>>>>>>>>>> * Aggregator is not the only function passed to > any > > >>>>> of > > >>>>>>> the > > >>>>>>>>>>>>>>>>> relevant > > >>>>>>>>>>>>>>>>>>>>>>> aggregate methods, so it seems a little arbitrary > > to > > >>>>>> pick > > >>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>>>>>>>>>> over Initializer or Merger. > > >>>>>>>>>>>>>>>>>>>>>>> * As you noted, branch() takes an array of > > Predicate, > > >>>>>> so > > >>>>>>> we > > >>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>> ignore > > >>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> provided name(s), even though Predicate names are > > >>>>> used > > >>>>>>>>>>>>>>>>> elsewhere. > > >>>>>>>>>>>>>>>>>>>>>>> * Not all things that we want to name have > function > > >>>>>>>>>> arguments, > > >>>>>>>>>>>>>>>>>>> notably > > >>>>>>>>>>>>>>>>>>>>>>> source and sink, so we'd switch paradigms and use > > the > > >>>>>>>> config > > >>>>>>>>>>>>>>>>> object > > >>>>>>>>>>>>>>>>>>>>>>> instead. > > >>>>>>>>>>>>>>>>>>>>>>> * Adding an extra method to the function > interfaces > > >>>>>> means > > >>>>>>>>>> that > > >>>>>>>>>>>>>>>>>> those > > >>>>>>>>>>>>>>>>>>>> are > > >>>>>>>>>>>>>>>>>>>>>> no > > >>>>>>>>>>>>>>>>>>>>>>> longer SAM interfaces. You proposed to add a > > default > > >>>>>>>>>>>>>>>>>> implementation, > > >>>>>>>>>>>>>>>>>>> so > > >>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>> could still pass a lambda if we don't want to set > > the > > >>>>>>> name, > > >>>>>>>>>>>>>>>>> but if > > >>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>> *do* > > >>>>>>>>>>>>>>>>>>>>>>> want to set the name, we can no longer use > lambdas. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I think the obvious other choice would be to mix > > >>>>> Named > > >>>>>> in > > >>>>>>>>>>>>>>>>> with the > > >>>>>>>>>>>>>>>>>>>> config > > >>>>>>>>>>>>>>>>>>>>>>> objects instead, but this has one main downside > of > > >>>>> its > > >>>>>>>> own... > > >>>>>>>>>>>>>>>>>>>>>>> * not every operator we wish to name has a config > > >>>>>>> object. I > > >>>>>>>>>>>>>>>>> don't > > >>>>>>>>>>>>>>>>>>> know > > >>>>>>>>>>>>>>>>>>>> if > > >>>>>>>>>>>>>>>>>>>>>>> everyone involved is comfortable with adding a > > config > > >>>>>>>> object > > >>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>> every > > >>>>>>>>>>>>>>>>>>>>>>> operator that's missing one. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Personally, I favor moving toward a more > consistent > > >>>>>> state > > >>>>>>>>>>>>>>>>> that's > > >>>>>>>>>>>>>>>>>>>> forward > > >>>>>>>>>>>>>>>>>>>>>>> compatible with any further changes we wish to > > make. > > >>>>> I > > >>>>>>>>>>>>>>>>> *think* that > > >>>>>>>>>>>>>>>>>>>>>> giving > > >>>>>>>>>>>>>>>>>>>>>>> every operator two forms (one with no config and > > one > > >>>>>>> with a > > >>>>>>>>>>>>>>>>> config > > >>>>>>>>>>>>>>>>>>>>>> object) > > >>>>>>>>>>>>>>>>>>>>>>> would be such an API. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Comment 2 ========= > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Finally, just a minor comment: the static method > in > > >>>>>> Named > > >>>>>>>>>>>>>>>>> wouldn't > > >>>>>>>>>>>>>>>>>>> work > > >>>>>>>>>>>>>>>>>>>>>>> properly as defined. Assuming that we mix Named > in > > >>>>> with > > >>>>>>>>>>>>>>>>> Produced, > > >>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>> example, we'd need to be able to use it like: > > >>>>>>>>>>>>>>>>>>>>>>>> kStream.to("out", Produced.with("myOut")) > > >>>>>>>>>>>>>>>>>>>>>>> This doesn't work because with() returns a Named, > > but > > >>>>>> we > > >>>>>>>> need > > >>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>> Produced. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> We can pull off a builder method in the > interface, > > >>>>> but > > >>>>>>> not > > >>>>>>>> a > > >>>>>>>>>>>>>>>>> static > > >>>>>>>>>>>>>>>>>>>>>> method. > > >>>>>>>>>>>>>>>>>>>>>>> To define a builder method in the interface that > > >>>>>> returns > > >>>>>>> an > > >>>>>>>>>>>>>>>>>> instance > > >>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> concrete subtype, you have to use the "curiously > > >>>>>>> recurring > > >>>>>>>>>>>>>>>>> generic" > > >>>>>>>>>>>>>>>>>>>>>>> pattern. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> It would look like: > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> public interface Named<N extends Named<N>> { > > >>>>>>>>>>>>>>>>>>>>>>> String name(); > > >>>>>>>>>>>>>>>>>>>>>>> N withName(String name); > > >>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> You can see where the name of the pattern comes > > from > > >>>>> ;) > > >>>>>>>>>>>>>>>>>>>>>>> An implementation would then look like: > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> public class Produced implements Named<Produced> > { > > >>>>>>>>>>>>>>>>>>>>>>> String name() { return name; } > > >>>>>>>>>>>>>>>>>>>>>>> Produced withName(final String name) { > this.name > > = > > >>>>>>> name; > > >>>>>>>>>>>>>>>>> return > > >>>>>>>>>>>>>>>>>>>> this; > > >>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Note that the generic parameter gets filled in > > >>>>> properly > > >>>>>>> in > > >>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>> implementing > > >>>>>>>>>>>>>>>>>>>>>>> class, so that you get the right return type out. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> It doesn't work at all with a static factory > method > > >>>>> at > > >>>>>>> the > > >>>>>>>>>>>>>>>>>> interface > > >>>>>>>>>>>>>>>>>>>>>> level, > > >>>>>>>>>>>>>>>>>>>>>>> so it would be up to Produced to define a static > > >>>>>> factory > > >>>>>>> if > > >>>>>>>>>> it > > >>>>>>>>>>>>>>>>>> wants > > >>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>> present one. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> ====== > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Those are my two feedbacks! > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I hope you find this helpful, rather than > > >>>>> frustrating. > > >>>>>>> I'm > > >>>>>>>>>>>>>>>>> sorry I > > >>>>>>>>>>>>>>>>>>>> didn't > > >>>>>>>>>>>>>>>>>>>>>>> get a chance to comment sooner. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP, I think it will be much nicer > > to > > >>>>> be > > >>>>>>>> able > > >>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> processor nodes. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> -John > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> On Tue, Nov 27, 2018 at 6:34 PM Guozhang Wang < > > >>>>>>>>>>>>>>>>> wangg...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> I've made a pass over the PR. There are some > > >>>>> comments > > >>>>>>> that > > >>>>>>>>>>>>>>>>> are > > >>>>>>>>>>>>>>>>>>> related > > >>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>> the function names which may be affecting the > KIP > > >>>>> wiki > > >>>>>>>> page, > > >>>>>>>>>>>>>>>>> but > > >>>>>>>>>>>>>>>>>>>>>> overall > > >>>>>>>>>>>>>>>>>>>>>>> I > > >>>>>>>>>>>>>>>>>>>>>>>> think it looks good already. > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> On Fri, Nov 16, 2018 at 4:21 PM Guozhang Wang < > > >>>>>>>>>>>>>>>>> wangg...@gmail.com > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Thanks Florian! I will take a look at the PR. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> On Mon, Nov 12, 2018 at 2:44 PM Florian > > Hussonnois > > >>>>> < > > >>>>>>>>>>>>>>>>>>>>>>>> fhussonn...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> Hi Matthias, > > >>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> Sorry I was absent for a while. I have > started a > > >>>>> new > > >>>>>>> PR > > >>>>>>>>>>>>>>>>> for this > > >>>>>>>>>>>>>>>>>>>>>> KIP. > > >>>>>>>>>>>>>>>>>>>>>>> It > > >>>>>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>> still in progress for now. I'm working on it. > > >>>>>>>>>>>>>>>>>>>>>>>>>> https://github.com/apache/kafka/pull/5909 > > >>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> Le ven. 19 oct. 2018 à 20:13, Matthias J. Sax > < > > >>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io> > > >>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>> écrit : > > >>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> What is the status of this KIP? > > >>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias > > >>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> On 7/19/18 5:17 PM, Guozhang Wang wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Sorry for being late... Found myself keep > > >>>>>>> apologizing > > >>>>>>>>>>>>>>>>> for late > > >>>>>>>>>>>>>>>>>>>>>>>> replies > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> these days. But I do want to push this KIP's > > >>>>>>> progress > > >>>>>>>>>>>>>>>>> forward > > >>>>>>>>>>>>>>>>>>>>>> as I > > >>>>>>>>>>>>>>>>>>>>>>>>>> see it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> very important and helpful feature for > > >>>>>>> extensibility. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> About the exceptions, I've gone through them > > and > > >>>>>>>>>>>>>>>>> hopefully it > > >>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>> an > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> exhaustive list: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. KTable#toStream() > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. KStream#merge(KStream) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. KStream#process() / transform() / > > >>>>>>> transformValues() > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> 4. KGroupedTable / KGroupedStream#count() > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Here's my reasoning: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> * It is okay not letting users to override > the > > >>>>>> name > > >>>>>>>> for > > >>>>>>>>>>>>>>>>> 1/2, > > >>>>>>>>>>>>>>>>>>>>>> since > > >>>>>>>>>>>>>>>>>>>>>>>>>> they > > >>>>>>>>>>>>>>>>>>>>>>>>>>> are > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> too trivial to be useful for debugging, plus > > >>>>> their > > >>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>> names > > >>>>>>>>>>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> not determine any related topic / store > names. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> * For 3, I'd vote for adding overloaded > > >>>>> functions > > >>>>>>> with > > >>>>>>>>>>>>>>>>> Named. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> * For 4, if users really want to name the > > >>>>>> processor > > >>>>>>>> she > > >>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>> call > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> aggregate() instead, so I think it is okay > to > > >>>>> skip > > >>>>>>>> this > > >>>>>>>>>>>>>>>>> case. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Jul 6, 2018 at 3:06 PM, Florian > > >>>>>> Hussonnois < > > >>>>>>>>>>>>>>>>>>>>>>>>>>> fhussonn...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> The option #3 seems to be a good > alternative > > >>>>> and > > >>>>>> I > > >>>>>>>> find > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>> API > > >>>>>>>>>>>>>>>>>>>>>>>> more > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> elegant (thanks John). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> But, we still have the need to overload > some > > >>>>>>> methods > > >>>>>>>>>>>>>>>>> either > > >>>>>>>>>>>>>>>>>>>>>>> because > > >>>>>>>>>>>>>>>>>>>>>>>>>>> they do > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> not accept an action instance or because > they > > >>>>> are > > >>>>>>>>>>>>>>>>> translated > > >>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>> multiple > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> processors. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> For example, this is the case for methods > > >>>>>> branch() > > >>>>>>>> and > > >>>>>>>>>>>>>>>>>> merge(). > > >>>>>>>>>>>>>>>>>>>>>>> We > > >>>>>>>>>>>>>>>>>>>>>>>>>> could > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> introduce a new interface Named (or maybe a > > >>>>>>> different > > >>>>>>>>>>>>>>>>> name ?) > > >>>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> name(). All action interfaces could extend > > this > > >>>>>> one > > >>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>> implement > > >>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>> option > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> This would result by having the following > > >>>>>> overloads > > >>>>>>>> : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Stream<K, V> merge(final Named name, final > > >>>>>>> KStream<K, > > >>>>>>>>>> V> > > >>>>>>>>>>>>>>>>>>>>>> stream); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> KStream<K, V>[] branch(final Named name, > > final > > >>>>>>>>>>>>>>>>> Predicate<? > > >>>>>>>>>>>>>>>>>>>>>> super > > >>>>>>>>>>>>>>>>>>>>>>>> K, ? > > >>>>>>>>>>>>>>>>>>>>>>>>>>> super > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> V>... predicates) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> N.B : The list above is not exhaustive > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> --------- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> user's code will become : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> KStream<String, Integer> stream = > > >>>>>>>>>>>>>>>>>>>>>> builder.stream("test"); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> KStream<String, Integer>[] > branches = > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>> stream.branch(Named.with("BRANCH-STREAM-ON-VALUE"), > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>> Predicate.named("STREAM-PAIR-VALUE", > > >>>>>>>>>>>>>>>>> (k, v) > > >>>>>>>>>>>>>>>>>> -> > > >>>>>>>>>>>>>>>>>>>>>> v > > >>>>>>>>>>>>>>>>>>>>>>> % > > >>>>>>>>>>>>>>>>>>>>>>>> 2 > > >>>>>>>>>>>>>>>>>>>>>>>>>> == > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0), > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>> Predicate.named("STREAM-IMPAIR-VALUE", > > >>>>>>>>>>>>>>>>> (k, v) > > >>>>>>>>>>>>>>>>>>>>>> -> > > >>>>>>>>>>>>>>>>>>>>>>> v > > >>>>>>>>>>>>>>>>>>>>>>>> % > > >>>>>>>>>>>>>>>>>>>>>>>>>> 2 > > >>>>>>>>>>>>>>>>>>>>>>>>>>> != > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0)); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> branches[0].to("pair"); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> branches[1].to("impair"); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> --------- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is a mix of the options 3) and 1) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Le ven. 6 juil. 2018 à 22:58, Guozhang > Wang < > > >>>>>>>>>>>>>>>>>>>>>> wangg...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>> écrit : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi folks, just to summarize the options we > > >>>>> have > > >>>>>> so > > >>>>>>>>>> far: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1) Add a new "as" for KTable / KStream, > plus > > >>>>>>> adding > > >>>>>>>>>> new > > >>>>>>>>>>>>>>>>>> fields > > >>>>>>>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operators-returns-void control objects > (the > > >>>>>>> current > > >>>>>>>>>>>>>>>>> wiki's > > >>>>>>>>>>>>>>>>>>>>>>>>>> proposal). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Pros: no more overloads. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cons: a bit departing with the current > > >>>>>> high-level > > >>>>>>>> API > > >>>>>>>>>>>>>>>>> design > > >>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>> DSL, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> plus, the inconsistency between > > >>>>>>>> operators-returns-void > > >>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operators-not-return-voids. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2) Add overloaded functions for all > > operators, > > >>>>>>> that > > >>>>>>>>>>>>>>>>> accepts > > >>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>>> control > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> object "Described". > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Pros: consistent with current APIs. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cons: lots of overloaded functions to add. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3) Add another default function in the > > >>>>> interface > > >>>>>>>>>>>>>>>>> (thank you > > >>>>>>>>>>>>>>>>>>>>>> J8!) > > >>>>>>>>>>>>>>>>>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>>>>>>>>> John > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> proposed. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Pros: no overloaded functions, no > > "Described". > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cons: do we lose lambda functions really > > >>>>> (seems > > >>>>>>> not > > >>>>>>>> if > > >>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>> provide > > >>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> "named" > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for each func)? Plus "Described" may be > more > > >>>>>>>>>> extensible > > >>>>>>>>>>>>>>>>>> than a > > >>>>>>>>>>>>>>>>>>>>>>>>>> single > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `String`. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> My principle of considering which one is > > >>>>> better > > >>>>>>>>>> depends > > >>>>>>>>>>>>>>>>>>>>>>> primarily > > >>>>>>>>>>>>>>>>>>>>>>>> on > > >>>>>>>>>>>>>>>>>>>>>>>>>>> "how > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to make advanced users easily use the > > >>>>> additional > > >>>>>>>> API, > > >>>>>>>>>>>>>>>>> while > > >>>>>>>>>>>>>>>>>>>>>>>> keeping > > >>>>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hidden from normal users who do not care > at > > >>>>>> all". > > >>>>>>>> For > > >>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>>>> purpose I > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> think > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3) > 1) > 2). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> One caveat though, is that changing the > > >>>>>> interface > > >>>>>>>>>>>>>>>>> would not > > >>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> binary-compatible though > source-compatible, > > >>>>>> right? > > >>>>>>>>>> I.e. > > >>>>>>>>>>>>>>>>>> users > > >>>>>>>>>>>>>>>>>>>>>>> need > > >>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> recompile their code though no changes > > needed. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Another note: for 3), if we really want to > > >>>>> keep > > >>>>>>>>>>>>>>>>>> extensibility > > >>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Described > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we could do sth. like: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --------- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public interface Predicate<K, V> { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // existing method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> boolean test(final K key, final V > > value); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // new default method adds the ability > > to > > >>>>>> name > > >>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>> predicate > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default Described described() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return new Described(null); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ---------- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> where user's code becomes: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stream.filter(named("key", (k, v) -> > true)); > > >>>>>> // > > >>>>>>>> note > > >>>>>>>>>>>>>>>>>> `named` > > >>>>>>>>>>>>>>>>>>>>>>> now > > >>>>>>>>>>>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sets a Described("key") in "described()". > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > stream.filter(described(Described.as("key", > > /* > > >>>>>> any > > >>>>>>>>>>>>>>>>> other > > >>>>>>>>>>>>>>>>>> fancy > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameters > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in the future*/), (k, v) -> true)); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ---------- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I feel it is not much likely that we'd > need > > to > > >>>>>>>> extend > > >>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>> further > > >>>>>>>>>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> future, so just a `String` would be good > > >>>>> enough. > > >>>>>>> But > > >>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>>>>>> listing > > >>>>>>>>>>>>>>>>>>>>>>>>>> all > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> possibilities here. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Jul 6, 2018 at 8:19 AM, John > > Roesler < > > >>>>>>>>>>>>>>>>>>>>>> j...@confluent.io > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Sorry I'm late to the party, but I missed > > the > > >>>>>>>> message > > >>>>>>>>>>>>>>>>>>>>>>> originally. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regarding the names, it's probably a good > > >>>>> idea > > >>>>>> to > > >>>>>>>>>>>>>>>>> stick to > > >>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>> same > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> character set we're currently using: > > letters, > > >>>>>>>>>>>>>>>>> numbers, and > > >>>>>>>>>>>>>>>>>>>>>>>> hyphens. > > >>>>>>>>>>>>>>>>>>>>>>>>>>> The > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> names are used in Kafka topics, files and > > >>>>>>> folders, > > >>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>> RocksDB > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> databases, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and we also need them to work with the > file > > >>>>>>> systems > > >>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>> Windows, > > >>>>>>>>>>>>>>>>>>>>>>>>>> Linux, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MacOS. My opinion is that with a > situation > > >>>>> like > > >>>>>>>> that, > > >>>>>>>>>>>>>>>>> it's > > >>>>>>>>>>>>>>>>>>>>>>> better > > >>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> conservative. It might also be a good > idea > > to > > >>>>>>>> impose > > >>>>>>>>>>>>>>>>> an > > >>>>>>>>>>>>>>>>>> upper > > >>>>>>>>>>>>>>>>>>>>>>>>>> limit on > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> length to avoid running afoul of any of > > those > > >>>>>>>>>> systems. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It seems like there's a small debate > > between > > >>>>> 1) > > >>>>>>>>>>>>>>>>> adding a > > >>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>> method to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KStream (and maybe KTable) to modify its > > name > > >>>>>>> after > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>> fact, > > >>>>>>>>>>>>>>>>>>>>>>> or > > >>>>>>>>>>>>>>>>>>>>>>>> 2) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> piggy-backing on the config objects where > > >>>>> they > > >>>>>>>> exist > > >>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>> adding > > >>>>>>>>>>>>>>>>>>>>>>>> one > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> where > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> they don't. To me, #2 is the better > > >>>>> alternative > > >>>>>>>> even > > >>>>>>>>>>>>>>>>> though > > >>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>> produces > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> more overloads and may be a bit awkward > in > > >>>>>>> places. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The reason is simply that #1 is a > > high-level > > >>>>>>>>>>>>>>>>> departure from > > >>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> graph-building paradigm we're using in > the > > >>>>> DSL. > > >>>>>>>>>>>>>>>>> Consider: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Graph.node1(config).node2(config) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> vs > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Graph.node1().config().node2().config() > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We could have done either, but we picked > > the > > >>>>>>>> former. > > >>>>>>>>>> I > > >>>>>>>>>>>>>>>>>> think > > >>>>>>>>>>>>>>>>>>>>>>> it's > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> probably > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a good goal to try and stick to it so > that > > >>>>>>>> developers > > >>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>>>>>>> develop > > >>>>>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> rely > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> on their instincts for how the DSL will > > >>>>> behave. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I do want to present one alternative to > > >>>>> adding > > >>>>>>> new > > >>>>>>>>>>>>>>>>> config > > >>>>>>>>>>>>>>>>>>>>>>>> objects: > > >>>>>>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> just add a "name()" method to all our > > >>>>> "action" > > >>>>>>>>>>>>>>>>> interfaces. > > >>>>>>>>>>>>>>>>>>>>>> For > > >>>>>>>>>>>>>>>>>>>>>>>>>>> example, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'll demonstrate how we can add a "name" > to > > >>>>>>>> Predicate > > >>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>> then > > >>>>>>>>>>>>>>>>>>>>>>>> use > > >>>>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name a "KStream#filter" DSL operator: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public interface Predicate<K, V> { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // existing method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> boolean test(final K key, final V > > value); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // new default method adds the > ability > > to > > >>>>>>> name > > >>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> predicate > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default String name() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return null; > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // new static factory method adds the > > >>>>>> ability > > >>>>>>>> to > > >>>>>>>>>>>>>>>>> wrap > > >>>>>>>>>>>>>>>>>>>>>>> lambda > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicates > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> with a named predicate > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> static <K, V> Predicate<K, V> > > named(final > > >>>>>>>> String > > >>>>>>>>>>>>>>>>> name, > > >>>>>>>>>>>>>>>>>>>>>>> final > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Predicate<K, V> predicate) { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return new Predicate<K, V>() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @Override > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public boolean test(final K > > key, > > >>>>>>> final > > >>>>>>>> V > > >>>>>>>>>>>>>>>>>> value) { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return > predicate.test(key, > > >>>>>>> value); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @Override > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public String name() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return name; > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> }; > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Then, here's how it would look to use it: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Anonymous predicates continue to work > > just > > >>>>>>> fine > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stream.filter((k, v) -> true); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Devs can swap in a Predicate that > > >>>>> implements > > >>>>>>> the > > >>>>>>>>>>>>>>>>> name() > > >>>>>>>>>>>>>>>>>>>>>>>> method. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stream.filter(new Predicate<Object, > > >>>>> Object>() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @Override > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public boolean test(final Object key, > > >>>>> final > > >>>>>>>>>> Object > > >>>>>>>>>>>>>>>>>>>>>> value) { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return true; > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @Override > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public String name() { > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return "hey"; > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> }); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Or they can wrap their existing lambda > > >>>>> using > > >>>>>>> the > > >>>>>>>>>>>>>>>>> static > > >>>>>>>>>>>>>>>>>>>>>>>> factory > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stream.filter(named("key", (k, v) -> > > true)); > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just a thought. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Overall, I think it's really valuable to > be > > >>>>>> able > > >>>>>>> to > > >>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> processors, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for all the reasons you mentioned in the > > KIP. > > >>>>>> So > > >>>>>>>>>>>>>>>>> thank you > > >>>>>>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> introducing > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this! > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -John > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, Jul 5, 2018 at 4:53 PM Florian > > >>>>>>> Hussonnois < > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> fhussonn...@gmail.com > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, thank you very much for all you > > >>>>>> suggestions. > > >>>>>>>>>> I've > > >>>>>>>>>>>>>>>>>>>>>> started > > >>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> update > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP ( > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>> > 307%3A+Allow+to+define+custom+processor+names+with+KStreams+DSL > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Also, I propose to rename the Processed > > >>>>> class > > >>>>>>> into > > >>>>>>>>>>>>>>>>>>>>>> Described - > > >>>>>>>>>>>>>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> more meaningful (but this is just a > > detail). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm OK to not enforcing uppercase for > > >>>>> specific > > >>>>>>>> names > > >>>>>>>>>>>>>>>>> but > > >>>>>>>>>>>>>>>>>>>>>>> should > > >>>>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> allow > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> arbitrary names with whitespaces for > > >>>>> example ? > > >>>>>>>>>>>>>>>>> Currently, > > >>>>>>>>>>>>>>>>>> I > > >>>>>>>>>>>>>>>>>>>>>>>> can't > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> tell > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this can lead to some side effects ? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Le lun. 11 juin 2018 à 01:31, Matthias > J. > > >>>>> Sax > > >>>>>> < > > >>>>>>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> écrit : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just catching up on this thread. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I like the general idea. Couple of > > >>>>> comments: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - I think that adding `Processed` (or > > >>>>> maybe > > >>>>>> a > > >>>>>>>>>>>>>>>>> different > > >>>>>>>>>>>>>>>>>>>>>>> name?) > > >>>>>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> valid proposal for stateless operators > > that > > >>>>>>> only > > >>>>>>>>>>>>>>>>> have a > > >>>>>>>>>>>>>>>>>>>>>>> single > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overload > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> atm. It would align with the overall > API > > >>>>>>> design. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - for all methods with multiple > existing > > >>>>>>>>>>>>>>>>> overloads, we > > >>>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> consider > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> extend `Consumed`, `Produced`, > > >>>>> `Materialized` > > >>>>>>> etc > > >>>>>>>>>>>>>>>>> to take > > >>>>>>>>>>>>>>>>>>>>>> an > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> additional > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor name (not sure atm how > elegant > > >>>>> this > > >>>>>>> is; > > >>>>>>>>>> we > > >>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>> need > > >>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "play" with the API a little bit; the > > >>>>>> advantage > > >>>>>>>>>>>>>>>>> would be, > > >>>>>>>>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> do > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> add more overloads what seems to be key > > for > > >>>>>>> this > > >>>>>>>>>>>>>>>>> KIP) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - operators return void: while I agree > > >>>>> that > > >>>>>>> the > > >>>>>>>>>>>>>>>>> "name > > >>>>>>>>>>>>>>>>>>>>>> first" > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> chaining > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> idea is not very intuitive, it might > > still > > >>>>>>> work, > > >>>>>>>> if > > >>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> correctly (again, we would need to > "play" > > >>>>>> with > > >>>>>>>> the > > >>>>>>>>>>>>>>>>> API a > > >>>>>>>>>>>>>>>>>>>>>>> little > > >>>>>>>>>>>>>>>>>>>>>>>>>> bit > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> see) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - for DSL operators that are > translated > > to > > >>>>>>>>>> multiple > > >>>>>>>>>>>>>>>>>> nodes: > > >>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> might > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> make sense to use the specified > operator > > >>>>> name > > >>>>>>> as > > >>>>>>>>>>>>>>>>> prefix > > >>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>> add > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> reasonable suffixes. For example, a > join > > >>>>>>>> translates > > >>>>>>>>>>>>>>>>> into > > >>>>>>>>>>>>>>>>>> 5 > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> operators > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that could be name > > >>>>>> "name-left-store-processor", > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "name-left-join-processor", > > >>>>>>>>>>>>>>>>> "name-right-store-processor", > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "name-right-join-processor", and > > >>>>>>>>>>>>>>>>>>>>>> "name-join-merge-processor" > > >>>>>>>>>>>>>>>>>>>>>>>> (or > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> similar). Maybe just using numbers > might > > >>>>> also > > >>>>>>>> work. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - I think, we should strip the number > > >>>>>> suffixes > > >>>>>>>> if > > >>>>>>>>>>>>>>>>> a user > > >>>>>>>>>>>>>>>>>>>>>>>>>> provides > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> names > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - enforcing upper case seems to be > > tricky: > > >>>>>> for > > >>>>>>>>>>>>>>>>> example, > > >>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>> do > > >>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enforce upper case for store names and > we > > >>>>>>> cannot > > >>>>>>>>>>>>>>>>> easily > > >>>>>>>>>>>>>>>>>>>>>>> change > > >>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would break compatibility -- thus, for > > >>>>>>>> consistency > > >>>>>>>>>>>>>>>>>> reasons > > >>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>> might > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> want to do this > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - for better understand of the impact > of > > >>>>> the > > >>>>>>>> KIP, > > >>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> quite > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> helpful if you would list all method > > names > > >>>>>> that > > >>>>>>>> are > > >>>>>>>>>>>>>>>>>>>>>> affected > > >>>>>>>>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (ie, list all newly added overloads) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 5/31/18 6:40 PM, Guozhang Wang > wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Re 1: I think changing the > KStreamImpl / > > >>>>>>>>>>>>>>>>> KTableImpl to > > >>>>>>>>>>>>>>>>>>>>>> allow > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> modifying > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor name after the operator is > > fine > > >>>>> as > > >>>>>>>> long > > >>>>>>>>>>>>>>>>> as we > > >>>>>>>>>>>>>>>>>> do > > >>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> check > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> again > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> when modifying that. In fact, we are > > >>>>> having > > >>>>>>> some > > >>>>>>>>>>>>>>>>>> topology > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> optimization > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> going on which may modify processor > > names > > >>>>> in > > >>>>>>> the > > >>>>>>>>>>>>>>>>> final > > >>>>>>>>>>>>>>>>>>>>>>>> topology > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> anyways ( > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > https://github.com/apache/kafka/pull/4983 > > >>>>> ). > > >>>>>>>>>>>>>>>>>> Semantically > > >>>>>>>>>>>>>>>>>>>>>> I > > >>>>>>>>>>>>>>>>>>>>>>>>>> think > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> easier to understand to developers > than > > >>>>>>>> "deciding > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the next operator". > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Re 2: Yeah I'm thinking that for > > operators > > >>>>>>> that > > >>>>>>>>>>>>>>>>>> translates > > >>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> multiple > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor names, we can still use the > > >>>>>> provided > > >>>>>>>>>>>>>>>>> "hint" to > > >>>>>>>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> names, e.g. for Joins we can name them > > as > > >>>>>>>>>>>>>>>>>> `join-foo-this` > > >>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `join-foo-that` etc if user calls > > >>>>>> `as("foo")`. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Re 3: The motivation I had about > > removing > > >>>>>> the > > >>>>>>>>>>>>>>>>> suffix is > > >>>>>>>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> has > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> huge > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> restrictions on topology > > compatibilities: > > >>>>>>>> consider > > >>>>>>>>>>>>>>>>> if > > >>>>>>>>>>>>>>>>>> user > > >>>>>>>>>>>>>>>>>>>>>>>> code > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> added a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operator, or library does some > > >>>>> optimization > > >>>>>> to > > >>>>>>>>>>>>>>>>> remove > > >>>>>>>>>>>>>>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operators, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> suffix indexing may be changed for a > > large > > >>>>>>>> amount > > >>>>>>>>>>>>>>>>> of the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> names: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this will in turn change the internal > > >>>>> state > > >>>>>>>> store > > >>>>>>>>>>>>>>>>> names, > > >>>>>>>>>>>>>>>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>>>>>> well > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> internal topic names as well, making > the > > >>>>> new > > >>>>>>>>>>>>>>>>> application > > >>>>>>>>>>>>>>>>>>>>>>>>>> topology > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> incompatible with the ones. One > > rationale > > >>>>> I > > >>>>>>> had > > >>>>>>>>>>>>>>>>> about > > >>>>>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>>>>>> KIP > > >>>>>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> aligned this effort, moving forward we > > can > > >>>>>>> allow > > >>>>>>>>>>>>>>>>> users > > >>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> customize > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> internal names so that they can still > be > > >>>>>>> reused > > >>>>>>>>>>>>>>>>> even > > >>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> topology > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> changes > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (e.g. KIP-230), so I think removing > the > > >>>>>> suffix > > >>>>>>>>>>>>>>>>> index > > >>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> more > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> applicable in the long run. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, May 31, 2018 at 3:08 PM, > Florian > > >>>>>>>>>>>>>>>>> Hussonnois < > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fhussonn...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi , > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thank you very much for your > feedback. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1/ > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I agree that overloading most of the > > >>>>>> methods > > >>>>>>>> with > > >>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>> Processed > > >>>>>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ideal. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I've started modifying the KStream > API > > >>>>> and > > >>>>>> I > > >>>>>>>> got > > >>>>>>>>>>>>>>>>> to the > > >>>>>>>>>>>>>>>>>>>>>>> same > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> conclusion. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Also ading a new method directly to > > >>>>>>> KStreamImpl > > >>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>> KTableImpl > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> classes > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> seems to be a better option. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However a processor name cannot be > > >>>>>> redefined > > >>>>>>>>>> after > > >>>>>>>>>>>>>>>>>>>>>> calling > > >>>>>>>>>>>>>>>>>>>>>>> an > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operator > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (or > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> maybe I miss something in the code). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From my understanding, this will only > > set > > >>>>>> the > > >>>>>>>>>>>>>>>>> KStream > > >>>>>>>>>>>>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> property > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor name previsouly added to > the > > >>>>>>> topology > > >>>>>>>>>>>>>>>>>> builder - > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> leading > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> InvalidTopology exception. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> So the new method should actually > > defines > > >>>>>> the > > >>>>>>>>>>>>>>>>> name of > > >>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>> next > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Below is an example : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *stream.as <http://stream.as > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (Processed.name("MAPPE_TO_UPPERCASE")* > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> * .map( (k, v) -> > > >>>>> KeyValue.pair(k, > > >>>>>>>>>>>>>>>>>>>>>>>> v.toUpperCase()))* > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think this approach could solve the > > >>>>> cases > > >>>>>>> for > > >>>>>>>>>>>>>>>>> methods > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> returning > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> void ? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regarding this new method we have two > > >>>>>>> possible > > >>>>>>>>>>>>>>>>>>>>>>>> implementations > > >>>>>>>>>>>>>>>>>>>>>>>>>> : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Adding a method like : > > >>>>>> withName(String > > >>>>>>>>>>>>>>>>>>>>>> processorName) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. or adding a method accepting an > > >>>>>>> Processed > > >>>>>>>>>>>>>>>>> object > > >>>>>>>>>>>>>>>>>> : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as(Processed). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think solution 2. is preferable as > > the > > >>>>>>>>>> Processed > > >>>>>>>>>>>>>>>>>> class > > >>>>>>>>>>>>>>>>>>>>>>>> could > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enriched > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> further (in futur). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2/ > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> As Guozhang said some operators add > > >>>>>> internal > > >>>>>>>>>>>>>>>>>> processors. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For example the branch() method > create > > >>>>> one > > >>>>>>>>>>>>>>>>>> KStreamBranch > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> route > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> records and one KStreamPassThrough > > >>>>>> processor > > >>>>>>>> for > > >>>>>>>>>>>>>>>>> each > > >>>>>>>>>>>>>>>>>>>>>>> branch. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In that situation only the parent > > >>>>> processor > > >>>>>>> can > > >>>>>>>>>> be > > >>>>>>>>>>>>>>>>>> named. > > >>>>>>>>>>>>>>>>>>>>>>> For > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> children > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processors we could keep the current > > >>>>>>> behaviour > > >>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>> add a > > >>>>>>>>>>>>>>>>>>>>>>>>>> suffix > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (i.e > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KSTREAM-BRANCHCHILD-) > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This also the case for the join() > > method > > >>>>>> that > > >>>>>>>>>>>>>>>>> result to > > >>>>>>>>>>>>>>>>>>>>>>>> adding > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> multiple > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processors to the topology > (windowing, > > >>>>>>>> left/right > > >>>>>>>>>>>>>>>>> joins > > >>>>>>>>>>>>>>>>>>>>>>> and a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> merge > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor). > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think, like for the branch method > > users > > >>>>>>> could > > >>>>>>>>>>>>>>>>> only > > >>>>>>>>>>>>>>>>>>>>>>> define a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name prefix. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3/ > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think we should still added a > suffix > > >>>>>> like > > >>>>>>>>>>>>>>>>>>>>>> "-0000000000" > > >>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name and enforce uppercases as this > > will > > >>>>>> keep > > >>>>>>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>>> consistency > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ones generated by the API. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 4/ > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Yes, the KTable interface should be > > >>>>>> modified > > >>>>>>>> like > > >>>>>>>>>>>>>>>>>> KStream > > >>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> allow > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> custom > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor names definition. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Le jeu. 31 mai 2018 à 19:18, Damian > > Guy < > > >>>>>>>>>>>>>>>>>>>>>>>> damian....@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> écrit > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP. What about > KTable > > >>>>> and > > >>>>>>>> other > > >>>>>>>>>>>>>>>>> DSL > > >>>>>>>>>>>>>>>>>>>>>>>>>> interfaces? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Will > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> they > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not want to be able to do the same > > >>>>> thing? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It would be good to see a complete > set > > >>>>> of > > >>>>>>> the > > >>>>>>>>>>>>>>>>> public > > >>>>>>>>>>>>>>>>>> API > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> changes. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Damian > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, 30 May 2018 at 19:45 > Guozhang > > >>>>>> Wang < > > >>>>>>>>>>>>>>>>>>>>>>>>>> wangg...@gmail.com > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP. I have some > meta > > >>>>>>>> feedbacks > > >>>>>>>>>>>>>>>>> on the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> proposal: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. You mentioned that this > > `Processed` > > >>>>>>> object > > >>>>>>>>>>>>>>>>> will be > > >>>>>>>>>>>>>>>>>>>>>>> added > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> to a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overloaded variant of all the > > stateless > > >>>>>>>>>>>>>>>>> operators, > > >>>>>>>>>>>>>>>>>> what > > >>>>>>>>>>>>>>>>>>>>>>>> about > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stateful > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operators? Would like to hear your > > >>>>>> opinions > > >>>>>>>> if > > >>>>>>>>>>>>>>>>> you > > >>>>>>>>>>>>>>>>>> have > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> thought > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> about > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> note for stateful operators they > will > > >>>>>>> usually > > >>>>>>>>>> be > > >>>>>>>>>>>>>>>>>> mapped > > >>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> multiple > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor node names, so we > probably > > >>>>> need > > >>>>>>> to > > >>>>>>>>>>>>>>>>> come up > > >>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ways > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> define all their names. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. I share the same concern with > Bill > > >>>>> as > > >>>>>>> for > > >>>>>>>>>>>>>>>>> adding > > >>>>>>>>>>>>>>>>>>>>>> lots > > >>>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overload > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> functions into the stateless > > operators, > > >>>>>> as > > >>>>>>> we > > >>>>>>>>>>>>>>>>> have > > >>>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>>>>>>> spent > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> quite > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effort in trimming them since 1.0.0 > > >>>>>>> release. > > >>>>>>>> If > > >>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>> goal > > >>>>>>>>>>>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> provide > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> some "hints" on the generated > > processor > > >>>>>>> node > > >>>>>>>>>>>>>>>>> names, > > >>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> strictly > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enforcing > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the exact names that to be > generated, > > >>>>>> then > > >>>>>>>> how > > >>>>>>>>>>>>>>>>> about > > >>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>> just > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> add a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> function to `KStream` and `KTable` > > >>>>>> classes > > >>>>>>>>>> like: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "as(Processed)", > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> semantics as "the latest operators > > that > > >>>>>>>>>>>>>>>>> generate this > > >>>>>>>>>>>>>>>>>>>>>>>> KStream > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> / > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KTable > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be named accordingly to this hint". > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The only caveat, is that for all > > >>>>>> operators > > >>>>>>>> like > > >>>>>>>>>>>>>>>>>>>>>>>> `KStream#to` > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `KStream#print` that returns void, > > this > > >>>>>>>>>>>>>>>>> alternative > > >>>>>>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> work. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the current operators: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a. KStream#print, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> b. KStream#foreach, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> c. KStream#to, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> d. KStream#process > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I personally felt that except > > >>>>>>>> `KStream#process` > > >>>>>>>>>>>>>>>>> users > > >>>>>>>>>>>>>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> usually > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> bother to override their names, and > > for > > >>>>>>>>>>>>>>>>>>>>>> `KStream#process` > > >>>>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> could > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> add > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overload variant with the > additional > > >>>>>>>> Processed > > >>>>>>>>>>>>>>>>>> object. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. In your example, the processor > > names > > >>>>>> are > > >>>>>>>>>>>>>>>>> still > > >>>>>>>>>>>>>>>>>> added > > >>>>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> suffix > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> like > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> " > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -0000000000", is this intentional? > If > > >>>>>> yes, > > >>>>>>>> why > > >>>>>>>>>>>>>>>>> (I > > >>>>>>>>>>>>>>>>>>>>>> thought > > >>>>>>>>>>>>>>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> user > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specified processor name hints we > > will > > >>>>>> not > > >>>>>>>> add > > >>>>>>>>>>>>>>>>> suffix > > >>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> distinguish > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> different nodes of the same type > any > > >>>>>> more)? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, May 29, 2018 at 6:47 AM, > Bill > > >>>>>>> Bejeck > > >>>>>>>> < > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> bbej...@gmail.com > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Florian, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP. I think being > > >>>>> able > > >>>>>> to > > >>>>>>>> add > > >>>>>>>>>>>>>>>>> more > > >>>>>>>>>>>>>>>>>>>>>>>> context > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> processor names would be useful. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I like the idea of adding a > > >>>>>>>>>>>>>>>>> "withProcessorName" to > > >>>>>>>>>>>>>>>>>>>>>>>> Produced, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Consumed > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Joined. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But instead of adding the > > "Processed" > > >>>>>>>>>>>>>>>>> parameter to a > > >>>>>>>>>>>>>>>>>>>>>>> large > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> percentage > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the methods, which would result in > > >>>>>>>> overloaded > > >>>>>>>>>>>>>>>>>> methods > > >>>>>>>>>>>>>>>>>>>>>>>> (which > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> removed > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> quite a bit with KIP-182) what do > > you > > >>>>>>> think > > >>>>>>>> of > > >>>>>>>>>>>>>>>>>> adding > > >>>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> method > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to the AbstractStream class > > >>>>>>> "withName(String > > >>>>>>>>>>>>>>>>>>>>>>>>>> processorName)"? > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BTW > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I"m > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> married to the method name, it's > the > > >>>>>> best > > >>>>>>> I > > >>>>>>>>>>>>>>>>> can do > > >>>>>>>>>>>>>>>>>> off > > >>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> top > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> my > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> head. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For the methods that return void, > > we'd > > >>>>>>> have > > >>>>>>>> to > > >>>>>>>>>>>>>>>>> add a > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> but > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would at least cut down on the > > number > > >>>>> of > > >>>>>>>>>>>>>>>>> overloaded > > >>>>>>>>>>>>>>>>>>>>>>>> methods > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> API. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just my 2 cents. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Sun, May 27, 2018 at 4:13 PM, > > >>>>> Florian > > >>>>>>>>>>>>>>>>> Hussonnois > > >>>>>>>>>>>>>>>>>> < > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fhussonn...@gmail.com > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would like to start a new > > >>>>> discussion > > >>>>>> on > > >>>>>>>>>>>>>>>>> following > > >>>>>>>>>>>>>>>>>>>>>>> KIP : > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>> > 307%3A+Allow+to+define+custom+processor+names+with+KStreams+DSL > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is still a draft. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Looking forward for your > feedback. > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>> Florian HUSSONNOIS > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>> -- Guozhang > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>>>> > > >>>>> -- > > >>>>> Florian HUSSONNOIS > > >>>>> > > >>>> > > >>>> > > >>> > > >>> > > >> > > > > > > > > -- Florian HUSSONNOIS