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
> > >
> >
>


-- 
-- Guozhang

Reply via email to