After reading John's latest response, I agree as well.

+1(binding)

-Bill



On Tue, Feb 26, 2019 at 9:09 PM Matthias J. Sax <matth...@confluent.io>
wrote:

> Florian,
>
> Thanks for updating the KIP.
>
> I missed the missing `static` on `Suppressed#withName()` and I agree
> with John and Guozhang.
>
> Don't have any further comments. And thanks for splitting the PR!
>
>
> @Guozhang: there is already a VOTE thread.
>
>
>
> -Matthias
>
> On 2/26/19 3:26 PM, Guozhang Wang wrote:
> > Bill, John, thanks for your comments.
> >
> > I agree with John that we can leave Suppressed to not have a static
> method
> > `as` for now since it is not useful at the moment. Assuming that is
> agreed
> > on, I think we can move on to the voting process.
> >
> >
> > Guozhang
> >
> > On Tue, Feb 26, 2019 at 2:56 PM John Roesler <j...@confluent.io> wrote:
> >
> >> Thanks for the feedback, Bill.
> >>
> >> It might be a good idea to hold of on adding the static method to
> >> Suppressed for now...
> >>
> >> Unlike the other operator/config-class pairs, `suppress` has no
> "default"
> >> mode. That is, there is no `KTable.suppress()` method with no arguments.
> >> So, when using it, you must either pick `untilWindowCloses` or
> >> `untilTimeLimit`, and you can also only pick one of those.
> >>
> >> The current `withName` method is an optional way to add a name to the
> >> Suppressed config.
> >>
> >> Adding `Suppressed.as(name)` as another static factory method seems to
> have
> >> some real downsides at the moment:
> >> * `suppress(Suppressed.as(name))` is an invalid config, so we can
> either go
> >> to extra lengths with an intermediate builder class just to store the
> name,
> >> or lose the compile-time guarantee that you actually pick one of the
> >> suppression types, and instead just check at run time.
> >> * The two config choices are currently static factory methods, so adding
> >> `as(name)` obligates us to also add chained versions of
> `untilWindowCloses`
> >> and `untilTimeLimit`. This opens up a new can of worms to name the
> chained
> >> methods, and it also creates more ambiguity in the API, since there are
> >> then multiple ways to say the same thing.
> >>
> >> Maybe in the future, if there's some automatic default configuration for
> >> suppression, then we can add `as(name)`, but from where I'm sitting
> right
> >> now, it seems to have no real upside and a few downsides.
> >>
> >> So, to summarize, I would propose to basically leave `Suppressed`'s
> >> interface alone and just extend the new `NamedOperation`.
> >>
> >> WDYT?
> >>
> >> Thanks,
> >> -John
> >>
> >> On Tue, Feb 26, 2019 at 9:18 AM Bill Bejeck <bbej...@gmail.com> wrote:
> >>
> >>> Hi Florian,
> >>>
> >>> Thanks for the update to the KIP.
> >>>
> >>> As for changing the name for "Suppressed#withName", I believe we can
> >> update
> >>> the table in  KIP to say "Suppressed#as" as the KIP states that:
> >>>
> >>>>> In addition, we propose to add a new static method with the following
> >>> signature to each of those class *as(final String processorName).*
> >>>
> >>> where Suppressed is one of the classes listed.
> >>>
> >>> So once we make that minor update to the KIP, we can start the vote.
> >>>
> >>> Thanks!
> >>> Bill
> >>>
> >>>
> >>>
> >>> On Mon, Feb 25, 2019 at 5:24 AM Florian Hussonnois <
> >> fhussonn...@gmail.com>
> >>> wrote:
> >>>
> >>>> 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
> >>>>
> >>>
> >>
> >
> >
>
>

Reply via email to