I agree with Eno about the renaming.

@Eno: can you add this to the Wiki Discussion page?


-Matthias


On 4/21/17 1:11 AM, Eno Thereska wrote:
> Hi Guozhang,
> 
> Thanks for the feedback. Comments inline:
> 
>> 1. Regarding the user-facing semantics, I thought we will claim that
>> "KTables generated from functions that do NOT specify a table name will NOT
>> be queryable"; but it seems you're proposing to claim it "may not possible
>> to be queryable", i.e. if users happen to know the internal name if it is
>> materialized, she can still query it. I feel its potential benefits are
>> well overwhelmed by the confusion it may introduce. So I'd suggest we just
>> be strict and say "no store name, not queryable".
> 
> Sure. "No store name, not queryable" sounds fine. If the user is brave and 
> digs deep they will be able to query these stores that are always created 
> (like when we do aggregates), but I agree that there is no reason we need to 
> make a promise to them if they don't provide a name. I'll change the wording.
> 
>>
>> 2. Is there a difference between "calling the overloaded function with
>> store name, but specify the value as null" and "calling the overloaded
>> function without store name"? I thought they will be implemented the same
>> way. But after reading through the wiki I'm not sure. So just clarifying.
>>
> 
> There is no difference. I'll clarify.
> 
> 
>> 3. Personally I'm still a bit preferring renaming "KTable#toStream" to sth.
>> like "KTable#getChangelog()" or "#toChangelog", since to me it feels more
>> understandable from user's point of view. WDPT?
>>
> 
> So I left this out of this KIP, since it's not directly related to the scope. 
> Perhaps we can do it in a cleanup KIP?
> 
> Thanks
> Eno
> 
> 
>>
>> Guozhang
>>
>>
>> On Tue, Apr 11, 2017 at 11:53 AM, Matthias J. Sax <matth...@confluent.io>
>> wrote:
>>
>>> +1
>>>
>>> On 4/11/17 10:34 AM, Eno Thereska wrote:
>>>> Hi Matthias,
>>>>
>>>>
>>>>> On 11 Apr 2017, at 09:41, Matthias J. Sax <matth...@confluent.io>
>>> wrote:
>>>>>
>>>>> Not sure, if we are on the same page already?
>>>>>
>>>>>> "A __store__ can be queryable whether is't materialized or not"
>>>>>
>>>>> This does not make sense -- there is nothing like a non-materialized
>>>>> store -- only non-materialized KTables.
>>>>
>>>> Yes, there are stores that are simple views, i.e., non-materialized.
>>> Damian has such a prototype for Global Tables (it didn't go into trunk).
>>>> It's still a store, e.g., a KeyValueStore, but when you do a get() it
>>> recomputes the result on the fly (e.g., it applies a filter).
>>>>
>>>> Eno
>>>>
>>>>>
>>>>>> "Yes, there is nothing that will prevent users from querying
>>>>> internally generated stores, but they cannot assume a store will
>>>>> necessarily be queryable."
>>>>>
>>>>> That is what I disagree on. Stores should be queryable all the time.
>>>>>
>>>>> Furthermore, we should have all non-materialized KTables to be
>>>>> queryable, too.
>>>>>
>>>>>
>>>>> Or maybe there is just some missunderstand going as, and there is some
>>>>> mix-up between "store" and "KTable"
>>>>>
>>>>>
>>>>>
>>>>> -Matthias
>>>>>
>>>>>
>>>>> On 4/11/17 9:34 AM, Eno Thereska wrote:
>>>>>> Hi Matthias,
>>>>>>
>>>>>> See my note: "A store can be queryable whether it's materialized or
>>> not". I think we're on the same page. Stores with an internal name are also
>>> queryable.
>>>>>>
>>>>>> I'm just pointing out that. although that is the case today and with
>>> this KIP, I don't think we have an obligation to make stores with internal
>>> names queryable in the future. However, that is a discussion for a future
>>> point.
>>>>>>
>>>>>> Eno
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On 11 Apr 2017, at 08:56, Matthias J. Sax <matth...@confluent.io>
>>> wrote:
>>>>>>>
>>>>>>> +1 on including GlobalKTable
>>>>>>>
>>>>>>> But I am not sure about the materialization / queryable question. For
>>>>>>> full consistency, all KTables should be queryable nevertheless if they
>>>>>>> are materialized or not. -- Maybe this is a second step though (even
>>> if
>>>>>>> I would like to get this done right away)
>>>>>>>
>>>>>>> If we don't want all KTables to be queryable, ie, only those KTables
>>>>>>> that are materialized, then we should have a clear definition about
>>>>>>> this, and only allow to query stores, the user did specify a name for.
>>>>>>> This will simply the reasoning for users, what stores are queryable
>>> and
>>>>>>> what not. Otherwise, we still end up confusing user.
>>>>>>>
>>>>>>>
>>>>>>> -Matthias
>>>>>>>
>>>>>>> On 4/11/17 8:23 AM, Damian Guy wrote:
>>>>>>>> Eno, re: GlobalKTable - yeah that seems fine.
>>>>>>>>
>>>>>>>> On Tue, 11 Apr 2017 at 14:18 Eno Thereska <eno.there...@gmail.com>
>>> wrote:
>>>>>>>>
>>>>>>>>> About GlobalKTables, I suppose there is no reason why they cannot
>>> also use
>>>>>>>>> this KIP for consistency, e.g., today you have:
>>>>>>>>>
>>>>>>>>> public <K, V> GlobalKTable<K, V> globalTable(final Serde<K>
>>> keySerde,
>>>>>>>>>                                           final Serde<V> valSerde,
>>>>>>>>>                                           final String topic,
>>>>>>>>>                                           final String storeName)
>>>>>>>>>
>>>>>>>>> For consistency with the KIP you could also have an overload
>>> without the
>>>>>>>>> store name, for people who want to construct a global ktable, but
>>> don't
>>>>>>>>> care about querying it directly:
>>>>>>>>>
>>>>>>>>> public <K, V> GlobalKTable<K, V> globalTable(final Serde<K>
>>> keySerde,
>>>>>>>>>                                           final Serde<V> valSerde,
>>>>>>>>>                                           final String topic)
>>>>>>>>>
>>>>>>>>> Damian, what do you think? I'm thinking of adding this to KIP.
>>> Thanks to
>>>>>>>>> Michael for bringing it up.
>>>>>>>>>
>>>>>>>>> Eno
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> On 11 Apr 2017, at 06:13, Eno Thereska <eno.there...@gmail.com>
>>> wrote:
>>>>>>>>>>
>>>>>>>>>> Hi Michael, comments inline:
>>>>>>>>>>
>>>>>>>>>>> On 11 Apr 2017, at 03:25, Michael Noll <mich...@confluent.io>
>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> Thanks for the updates, Eno!
>>>>>>>>>>>
>>>>>>>>>>> In addition to what has already been said:  We should also
>>> explicitly
>>>>>>>>>>> mention that this KIP is not touching GlobalKTable.  I'm sure
>>> that some
>>>>>>>>>>> users will throw KTable and GlobalKTable into one conceptual
>>> "it's all
>>>>>>>>>>> tables!" bucket and then wonder how the KIP might affect global
>>> tables.
>>>>>>>>>>
>>>>>>>>>> Good point, I'll add.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Damian wrote:
>>>>>>>>>>>> I think if no store name is provided users would still be able
>>> to query
>>>>>>>>>>> the
>>>>>>>>>>>> store, just the store name would be some internally generated
>>> name.
>>>>>>>>> They
>>>>>>>>>>>> would be able to discover those names via the IQ API.
>>>>>>>>>>>
>>>>>>>>>>> I, too, think that users should be able to query a store even if
>>> its
>>>>>>>>> name
>>>>>>>>>>> was internally generated.  After all, the data is already there /
>>>>>>>>>>> materialized.
>>>>>>>>>>
>>>>>>>>>> Yes, there is nothing that will prevent users from querying
>>> internally
>>>>>>>>> generated stores, but they cannot
>>>>>>>>>> assume a store will necessarily be queryable. So if it's there,
>>> they can
>>>>>>>>> query it. If it's not there, and they didn't
>>>>>>>>>> provide a queryable name, they cannot complain and say "hey, where
>>> is my
>>>>>>>>> store". If they must absolutely be certain that
>>>>>>>>>> a store is queryable, then they must provide a queryable name.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Damian wrote:
>>>>>>>>>>>> I think for some stores it will make sense to not create a
>>> physical
>>>>>>>>>>> store, i.e.,
>>>>>>>>>>>> for thinks like `filter`, as this will save the rocksdb
>>> overhead. But i
>>>>>>>>>>> guess that
>>>>>>>>>>>> is more of an implementation detail.
>>>>>>>>>>>
>>>>>>>>>>> I think it would help if the KIP would clarify what we'd do in
>>> such a
>>>>>>>>>>> case.  For example, if the user did not specify a store name for
>>>>>>>>>>> `KTable#filter` -- would it be queryable?  If so, would this
>>> imply we'd
>>>>>>>>>>> always materialize the state store, or...?
>>>>>>>>>>
>>>>>>>>>> I'll clarify in the KIP with some more examples. Materialization
>>> will be
>>>>>>>>> an internal concept. A store can be queryable whether it's
>>> materialized or
>>>>>>>>> not
>>>>>>>>>> (e.g., through advanced implementations that compute the value of a
>>>>>>>>> filter on a fly, rather than materialize the answer).
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Eno
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> -Michael
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Tue, Apr 11, 2017 at 9:14 AM, Damian Guy <damian....@gmail.com
>>>>
>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi Eno,
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks for the update. I agree with what Matthias said. I wonder
>>> if
>>>>>>>>> the KIP
>>>>>>>>>>>> should talk less about materialization and more about querying?
>>> After
>>>>>>>>> all,
>>>>>>>>>>>> that is what is being provided from an end-users perspective.
>>>>>>>>>>>>
>>>>>>>>>>>> I think if no store name is provided users would still be able to
>>>>>>>>> query the
>>>>>>>>>>>> store, just the store name would be some internally generated
>>> name.
>>>>>>>>> They
>>>>>>>>>>>> would be able to discover those names via the IQ API
>>>>>>>>>>>>
>>>>>>>>>>>> I think for some stores it will make sense to not create a
>>> physical
>>>>>>>>> store,
>>>>>>>>>>>> i.e., for thinks like `filter`, as this will save the rocksdb
>>>>>>>>> overhead. But
>>>>>>>>>>>> i guess that is more of an implementation detail.
>>>>>>>>>>>>
>>>>>>>>>>>> Cheers,
>>>>>>>>>>>> Damian
>>>>>>>>>>>>
>>>>>>>>>>>> On Tue, 11 Apr 2017 at 00:36 Eno Thereska <
>>> eno.there...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Matthias,
>>>>>>>>>>>>>
>>>>>>>>>>>>>> However, this still forces users, to provide a name for store
>>> that we
>>>>>>>>>>>>>> must materialize, even if users are not interested in querying
>>> the
>>>>>>>>>>>>>> stores. Thus, I would like to have overloads for all currently
>>>>>>>>> existing
>>>>>>>>>>>>>> methods having mandatory storeName paremeter, with overloads,
>>> that do
>>>>>>>>>>>>>> not require the storeName parameter.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Oh yeah, absolutely, this is part of the KIP. I guess I didn't
>>> make it
>>>>>>>>>>>>> clear, I'll clarify.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> On 10 Apr 2017, at 16:00, Matthias J. Sax <
>>> matth...@confluent.io>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks for pushing this KIP Eno.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The update give a very clear description about the scope, that
>>> is
>>>>>>>>> super
>>>>>>>>>>>>>> helpful for the discussion!
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> - To put it into my own words, the KIP focus is on enable to
>>> query
>>>>>>>>> all
>>>>>>>>>>>>>> KTables.
>>>>>>>>>>>>>> ** The ability to query a store is determined by providing a
>>> name for
>>>>>>>>>>>>>> the store.
>>>>>>>>>>>>>> ** At the same time, providing a name -- and thus making a
>>> store
>>>>>>>>>>>>>> queryable -- does not say anything about an actual
>>> materialization
>>>>>>>>> (ie,
>>>>>>>>>>>>>> being queryable and being materialized are orthogonal).
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I like this overall a lot. However, I would go one step
>>> further.
>>>>>>>>> Right
>>>>>>>>>>>>>> now, you suggest to add new overload methods that allow users
>>> to
>>>>>>>>>>>> specify
>>>>>>>>>>>>>> a storeName -- if `null` is provided and the store is not
>>>>>>>>> materialized,
>>>>>>>>>>>>>> we ignore it completely -- if `null` is provided but the store
>>> must
>>>>>>>>> be
>>>>>>>>>>>>>> materialized we generate a internal name. So far so good.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> However, this still forces users, to provide a name for store
>>> that we
>>>>>>>>>>>>>> must materialize, even if users are not interested in querying
>>> the
>>>>>>>>>>>>>> stores. Thus, I would like to have overloads for all currently
>>>>>>>>> existing
>>>>>>>>>>>>>> methods having mandatory storeName paremeter, with overloads,
>>> that do
>>>>>>>>>>>>>> not require the storeName parameter.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Otherwise, we would still have some methods which optional
>>> storeName
>>>>>>>>>>>>>> parameter and other method with mandatory storeName parameter
>>> --
>>>>>>>>> thus,
>>>>>>>>>>>>>> still some inconsistency.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On 4/9/17 8:35 AM, Eno Thereska wrote:
>>>>>>>>>>>>>>> Hi there,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I've now done a V2 of the KIP, that hopefully addresses the
>>> feedback
>>>>>>>>>>>> in
>>>>>>>>>>>>> this discussion thread:
>>>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>>>>>>>> 114%3A+KTable+materialization+and+improved+semantics
>>>>>>>>>>>>> <
>>>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>>>>>>>> 114:+KTable+materialization+and+improved+semantics>.
>>>>>>>>>>>>> Notable changes:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> - clearly outline what is in the scope of the KIP and what is
>>> not.
>>>>>>>>> We
>>>>>>>>>>>>> ran into the issue where lots of useful, but somewhat tangential
>>>>>>>>>>>>> discussions came up on interactive queries, declarative DSL
>>> etc. The
>>>>>>>>>>>> exact
>>>>>>>>>>>>> scope of this KIP is spelled out.
>>>>>>>>>>>>>>> - decided to go with overloaded methods, not .materialize(),
>>> to stay
>>>>>>>>>>>>> within the spirit of the current declarative DSL.
>>>>>>>>>>>>>>> - clarified the depreciation plan
>>>>>>>>>>>>>>> - listed part of the discussion we had under rejected
>>> alternatives
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If you have any further feedback on this, let's continue on
>>> this
>>>>>>>>>>>> thread.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thank you
>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 1 Feb 2017, at 09:04, Eno Thereska <
>>> eno.there...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks everyone! I think it's time to do a V2 on the KIP so
>>> I'll do
>>>>>>>>>>>>> that and we can see how it looks and continue the discussion
>>> from
>>>>>>>>> there.
>>>>>>>>>>>>> Stay tuned.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On 30 Jan 2017, at 17:23, Matthias J. Sax <
>>> matth...@confluent.io>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I think Eno's separation is very clear and helpful. In
>>> order to
>>>>>>>>>>>>>>>>> streamline this discussion, I would suggest we focus back
>>> on point
>>>>>>>>>>>> (1)
>>>>>>>>>>>>>>>>> only, as this is the original KIP question.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Even if I started to DSL design discussion somehow, because
>>> I
>>>>>>>>>>>> thought
>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> might be helpful to resolve both in a single shot, I feel
>>> that we
>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>> too many options about DSL design and we should split it up
>>> in two
>>>>>>>>>>>>>>>>> steps. This will have the disadvantage that we will change
>>> the API
>>>>>>>>>>>>>>>>> twice, but still, I think it will be a more focused
>>> discussion.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I just had another look at the KIP, an it proposes 3
>>> changes:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 1. add .materialized() -> IIRC it was suggested to name this
>>>>>>>>>>>>>>>>> .materialize() though (can you maybe update the KIP Eno?)
>>>>>>>>>>>>>>>>> 2. remove print(), writeAsText(), and foreach()
>>>>>>>>>>>>>>>>> 3. rename toStream() to toKStream()
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I completely agree with (2) -- not sure about (3) though
>>> because
>>>>>>>>>>>>>>>>> KStreamBuilder also hast .stream() and .table() as methods.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> However, we might want to introduce a KStream#toTable() --
>>> this
>>>>>>>>> was
>>>>>>>>>>>>>>>>> requested multiple times -- might also be part of a
>>> different KIP.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thus, we end up with (1). I would suggest to do a step
>>> backward
>>>>>>>>> here
>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> instead of a discussion how to express the changes in the
>>> DSL (new
>>>>>>>>>>>>>>>>> overload, new methods...) we should discuss what the actual
>>> change
>>>>>>>>>>>>>>>>> should be. Like (1) materialize all KTable all the time (2)
>>> all
>>>>>>>>> the
>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>> to force a materialization to enable querying the KTable
>>> (3) allow
>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>> queryable non-materialized KTable.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On more question is, if we want to allow a user-forced
>>>>>>>>>>>> materialization
>>>>>>>>>>>>>>>>> only as as local store without changelog, or both (together
>>> /
>>>>>>>>>>>>>>>>> independently)? We got some request like this already.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On 1/30/17 3:50 AM, Jan Filipiak wrote:
>>>>>>>>>>>>>>>>>> Hi Eno,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> thanks for putting into different points. I want to put a
>>> few
>>>>>>>>>>>> remarks
>>>>>>>>>>>>>>>>>> inline.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On 30.01.2017 12:19, Eno Thereska wrote:
>>>>>>>>>>>>>>>>>>> So I think there are several important discussion threads
>>> that
>>>>>>>>> are
>>>>>>>>>>>>>>>>>>> emerging here. Let me try to tease them apart:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 1. inconsistency in what is materialized and what is not,
>>> what
>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> queryable and what is not. I think we all agree there is
>>> some
>>>>>>>>>>>>>>>>>>> inconsistency there and this will be addressed with any
>>> of the
>>>>>>>>>>>>>>>>>>> proposed approaches. Addressing the inconsistency is the
>>> point
>>>>>>>>> of
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> original KIP.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 2. the exact API for materializing a KTable. We can
>>> specify 1) a
>>>>>>>>>>>>>>>>>>> "store name" (as we do today) or 2) have a
>>> ".materialize[d]"
>>>>>>>>> call
>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>> 3) get a handle from a KTable ".getQueryHandle" or 4)
>>> have a
>>>>>>>>>>>> builder
>>>>>>>>>>>>>>>>>>> construct. So we have discussed 4 options. It is
>>> important to
>>>>>>>>>>>>> remember
>>>>>>>>>>>>>>>>>>> in this discussion that IQ is not designed for just local
>>>>>>>>> queries,
>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>> also for distributed queries. In all cases an identifying
>>>>>>>>> name/id
>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> needed for the store that the user is interested in
>>> querying. So
>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>> end up with a discussion on who provides the name, the
>>> user (as
>>>>>>>>>>>> done
>>>>>>>>>>>>>>>>>>> today) or if it is generated automatically (as Jan
>>> suggests, as
>>>>>>>>> I
>>>>>>>>>>>>>>>>>>> understand it). If it is generated automatically we need
>>> a way
>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> expose these auto-generated names to the users and link
>>> them to
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> KTables they care to query.
>>>>>>>>>>>>>>>>>> Hi, the last sentence is what I currently arguing against.
>>> The
>>>>>>>>> user
>>>>>>>>>>>>>>>>>> would never see a stringtype indentifier name or anything.
>>> All he
>>>>>>>>>>>>> gets
>>>>>>>>>>>>>>>>>> is the queryHandle if he executes a get(K) that will be an
>>>>>>>>>>>>> interactive
>>>>>>>>>>>>>>>>>> query get. with all the finding the right servers that
>>> currently
>>>>>>>>>>>>> have a
>>>>>>>>>>>>>>>>>> copy of this underlying store stuff going on. The nice
>>> part is
>>>>>>>>> that
>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>> someone retrieves a queryHandle, you know that you have to
>>>>>>>>>>>>> materialized
>>>>>>>>>>>>>>>>>> (if you are not already) as queries will be coming. Taking
>>> away
>>>>>>>>> the
>>>>>>>>>>>>>>>>>> confusion mentioned in point 1 IMO.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 3. The exact boundary between the DSL, that is the
>>> processing
>>>>>>>>>>>>>>>>>>> language, and the storage/IQ queries, and how we jump
>>> from one
>>>>>>>>> to
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> other. This is mostly for how we get a handle on a store
>>> (so
>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>> related to point 2), rather than for how we query the
>>> store. I
>>>>>>>>>>>> think
>>>>>>>>>>>>>>>>>>> we all agree that we don't want to limit ways one can
>>> query a
>>>>>>>>>>>> store
>>>>>>>>>>>>>>>>>>> (e.g., using gets or range queries etc) and the query
>>> APIs are
>>>>>>>>> not
>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>> the scope of the DSL.
>>>>>>>>>>>>>>>>>> Does the IQ work with range currently? The range would
>>> have to be
>>>>>>>>>>>>>>>>>> started on all stores and then merged by maybe the client.
>>> Range
>>>>>>>>>>>>> force a
>>>>>>>>>>>>>>>>>> flush to RocksDB currently so I am sure you would get a
>>>>>>>>> performance
>>>>>>>>>>>>> hit
>>>>>>>>>>>>>>>>>> right there. Time-windows might be okay, but I am not sure
>>> if the
>>>>>>>>>>>>> first
>>>>>>>>>>>>>>>>>> version should offer the user range access.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 4. The nature of the DSL and whether its declarative
>>> enough, or
>>>>>>>>>>>>>>>>>>> flexible enough. Damian made the point that he likes the
>>> builder
>>>>>>>>>>>>>>>>>>> pattern since users can specify, per KTable, things like
>>> caching
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> logging needs. His observation (as I understand it) is
>>> that the
>>>>>>>>>>>>>>>>>>> processor API (PAPI) is flexible but doesn't provide any
>>> help at
>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>> to users. The current DSL provides declarative
>>> abstractions, but
>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>> not fine-grained enough. This point is much broader than
>>> the
>>>>>>>>> KIP,
>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>> discussing it in this KIPs context is ok, since we don't
>>> want to
>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>> small piecemeal changes and then realise we're not in the
>>> spot
>>>>>>>>> we
>>>>>>>>>>>>> want
>>>>>>>>>>>>>>>>>>> to be.
>>>>>>>>>>>>>>>>>> This is indeed much broader. My guess here is that's why
>>> both
>>>>>>>>> API's
>>>>>>>>>>>>>>>>>> exists and helping the users to switch back and forth
>>> might be a
>>>>>>>>>>>>> thing.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Feel free to pitch in if I have misinterpreted something.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On 30 Jan 2017, at 10:22, Jan Filipiak <
>>>>>>>>> jan.filip...@trivago.com
>>>>>>>>>>>>>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hi Eno,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I have a really hard time understanding why we can't.
>>> From my
>>>>>>>>>>>> point
>>>>>>>>>>>>>>>>>>>> of view everything could be super elegant DSL only +
>>> public api
>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> the PAPI-people as already exist.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> The above aproach implementing a .get(K) on KTable is
>>> foolisch
>>>>>>>>> in
>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>> opinion as it would be to late to know that
>>> materialisation
>>>>>>>>> would
>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>> required.
>>>>>>>>>>>>>>>>>>>> But having an API that allows to indicate I want to
>>> query this
>>>>>>>>>>>>> table
>>>>>>>>>>>>>>>>>>>> and then wrapping the say table's processorname can work
>>> out
>>>>>>>>>>>> really
>>>>>>>>>>>>>>>>>>>> really nice. The only obstacle I see is people not
>>> willing to
>>>>>>>>>>>> spend
>>>>>>>>>>>>>>>>>>>> the additional time in implementation and just want a
>>> quick
>>>>>>>>> shot
>>>>>>>>>>>>>>>>>>>> option to make it work.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> For me it would look like this:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> table =  builder.table()
>>>>>>>>>>>>>>>>>>>> filteredTable = table.filter()
>>>>>>>>>>>>>>>>>>>> rawHandle = table.getQueryHandle() // Does the
>>> materialisation,
>>>>>>>>>>>>>>>>>>>> really all names possible but id rather hide the
>>> implication of
>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> materializes
>>>>>>>>>>>>>>>>>>>> filteredTableHandle = filteredTable.getQueryHandle() //
>>> this
>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>> _not_ materialize again of course, the source or the
>>> aggregator
>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>> stay the only materialized processors
>>>>>>>>>>>>>>>>>>>> streams = new streams(builder)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> This middle part is highly flexible I could imagin to
>>> force the
>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>> todo something like this. This implies to the user that
>>> his
>>>>>>>>>>>> streams
>>>>>>>>>>>>>>>>>>>> need to be running
>>>>>>>>>>>>>>>>>>>> instead of propagating the missing initialisation back by
>>>>>>>>>>>>> exceptions.
>>>>>>>>>>>>>>>>>>>> Also if the users is forced to pass the appropriate
>>> streams
>>>>>>>>>>>>> instance
>>>>>>>>>>>>>>>>>>>> back can change.
>>>>>>>>>>>>>>>>>>>> I think its possible to build multiple streams out of
>>> one
>>>>>>>>>>>> topology
>>>>>>>>>>>>>>>>>>>> so it would be easiest to implement aswell. This is just
>>> what I
>>>>>>>>>>>>> maybe
>>>>>>>>>>>>>>>>>>>> had liked the most
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> streams.start();
>>>>>>>>>>>>>>>>>>>> rawHandle.prepare(streams)
>>>>>>>>>>>>>>>>>>>> filteredHandle.prepare(streams)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> later the users can do
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> V value = rawHandle.get(K)
>>>>>>>>>>>>>>>>>>>> V value = filteredHandle.get(K)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> This could free DSL users from anything like storenames
>>> and how
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>> what to materialize. Can someone indicate what the
>>> problem
>>>>>>>>> would
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>> implementing it like this.
>>>>>>>>>>>>>>>>>>>> Yes I am aware that the current IQ API will not support
>>>>>>>>> querying
>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>> KTableProcessorName instread of statestoreName. But I
>>> think
>>>>>>>>> that
>>>>>>>>>>>>> had
>>>>>>>>>>>>>>>>>>>> to change if you want it to be intuitive
>>>>>>>>>>>>>>>>>>>> IMO you gotta apply the filter read time
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Looking forward to your opinions
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> #DeathToIQMoreAndBetterConnectors
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On 30.01.2017 10:42, Eno Thereska wrote:
>>>>>>>>>>>>>>>>>>>>> Hi there,
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> The inconsistency will be resolved, whether with
>>> materialize
>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>> overloaded methods.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> With the discussion on the DSL & stores I feel we've
>>> gone in a
>>>>>>>>>>>>>>>>>>>>> slightly different tangent, which is worth discussing
>>>>>>>>>>>> nonetheless.
>>>>>>>>>>>>>>>>>>>>> We have entered into an argument around the scope of
>>> the DSL.
>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>>> DSL has been designed primarily for processing. The DSL
>>> does
>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>> dictate ways to access state stores or what hind of
>>> queries to
>>>>>>>>>>>>>>>>>>>>> perform on them. Hence, I see the mechanism for
>>> accessing
>>>>>>>>>>>> storage
>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>> decoupled from the DSL.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> We could think of ways to get store handles from part
>>> of the
>>>>>>>>>>>> DSL,
>>>>>>>>>>>>>>>>>>>>> like the KTable abstraction. However, subsequent
>>> queries will
>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>> store-dependent and not rely on the DSL, hence I'm not
>>> sure we
>>>>>>>>>>>> get
>>>>>>>>>>>>>>>>>>>>> any grand-convergence DSL-Store here. So I am arguing
>>> that the
>>>>>>>>>>>>>>>>>>>>> current way of getting a handle on state stores is fine.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On 30 Jan 2017, at 03:56, Guozhang Wang <
>>> wangg...@gmail.com>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thinking loud here about the API options (materialize
>>> v.s.
>>>>>>>>>>>>> overloaded
>>>>>>>>>>>>>>>>>>>>>> functions) and its impact on IQ:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 1. The first issue of the current DSL is that, there is
>>>>>>>>>>>>>>>>>>>>>> inconsistency upon
>>>>>>>>>>>>>>>>>>>>>> whether / how KTables should be materialized:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> a) in many cases the library HAS TO materialize
>>> KTables no
>>>>>>>>>>>>>>>>>>>>>> matter what,
>>>>>>>>>>>>>>>>>>>>>> e.g. KStream / KTable aggregation resulted KTables,
>>> and hence
>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>> enforce
>>>>>>>>>>>>>>>>>>>>>> users to provide store names and throw RTE if it is
>>> null;
>>>>>>>>>>>>>>>>>>>>>> b) in some other cases, the KTable can be materialized
>>> or
>>>>>>>>> not;
>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>> example in KStreamBuilder.table(), store names can be
>>>>>>>>> nullable
>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> in which
>>>>>>>>>>>>>>>>>>>>>> case the KTable would not be materialized;
>>>>>>>>>>>>>>>>>>>>>> c) in some other cases, the KTable will never be
>>>>>>>>> materialized,
>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>> example KTable.filter() resulted KTables, and users
>>> have no
>>>>>>>>>>>>> options to
>>>>>>>>>>>>>>>>>>>>>> enforce them to be materialized;
>>>>>>>>>>>>>>>>>>>>>> d) this is related to a), where some KTables are
>>> required to
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>> materialized, but we do not enforce users to provide a
>>> state
>>>>>>>>>>>>> store
>>>>>>>>>>>>>>>>>>>>>> name,
>>>>>>>>>>>>>>>>>>>>>> e.g. KTables involved in joins; a RTE will be thrown
>>> not
>>>>>>>>>>>>>>>>>>>>>> immediately but
>>>>>>>>>>>>>>>>>>>>>> later in this case.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 2. The second issue is related to IQ, where state
>>> stores are
>>>>>>>>>>>>>>>>>>>>>> accessed by
>>>>>>>>>>>>>>>>>>>>>> their state stores; so only those KTable's that have
>>>>>>>>>>>>> user-specified
>>>>>>>>>>>>>>>>>>>>>> state
>>>>>>>>>>>>>>>>>>>>>> stores will be queryable. But because of 1) above, many
>>>>>>>>> stores
>>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>>>>>>> not be
>>>>>>>>>>>>>>>>>>>>>> interested to users for IQ but they still need to
>>> provide a
>>>>>>>>>>>>>>>>>>>>>> (dummy?) state
>>>>>>>>>>>>>>>>>>>>>> store name for them; while on the other hand users
>>> cannot
>>>>>>>>> query
>>>>>>>>>>>>>>>>>>>>>> some state
>>>>>>>>>>>>>>>>>>>>>> stores, e.g. the ones generated by KTable.filter() as
>>> there
>>>>>>>>> is
>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>>>> APIs for
>>>>>>>>>>>>>>>>>>>>>> them to specify a state store name.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 3. We are aware from user feedbacks that such backend
>>> details
>>>>>>>>>>>>> would be
>>>>>>>>>>>>>>>>>>>>>> better be abstracted away from the DSL layer, where app
>>>>>>>>>>>>> developers
>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>> just focus on processing logic, while state stores
>>> along with
>>>>>>>>>>>>> their
>>>>>>>>>>>>>>>>>>>>>> changelogs etc would better be in a different
>>> mechanism; same
>>>>>>>>>>>>>>>>>>>>>> arguments
>>>>>>>>>>>>>>>>>>>>>> have been discussed for serdes / windowing triggers as
>>> well.
>>>>>>>>>>>> For
>>>>>>>>>>>>>>>>>>>>>> serdes
>>>>>>>>>>>>>>>>>>>>>> specifically, we had a very long discussion about it
>>> and
>>>>>>>>>>>>> concluded
>>>>>>>>>>>>>>>>>>>>>> that, at
>>>>>>>>>>>>>>>>>>>>>> least in Java7, we cannot completely abstract serde
>>> away in
>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> DSL, so we
>>>>>>>>>>>>>>>>>>>>>> choose the other extreme to enforce users to be
>>> completely
>>>>>>>>>>>> aware
>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> serde requirements when some KTables may need to be
>>>>>>>>>>>> materialized
>>>>>>>>>>>>> vis
>>>>>>>>>>>>>>>>>>>>>> overloaded API functions. While for the state store
>>> names, I
>>>>>>>>>>>> feel
>>>>>>>>>>>>>>>>>>>>>> it is a
>>>>>>>>>>>>>>>>>>>>>> different argument than serdes (details below).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> So to me, for either materialize() v.s. overloaded
>>> functions
>>>>>>>>>>>>>>>>>>>>>> directions,
>>>>>>>>>>>>>>>>>>>>>> the first thing I'd like to resolve is the
>>> inconsistency
>>>>>>>>> issue
>>>>>>>>>>>>>>>>>>>>>> mentioned
>>>>>>>>>>>>>>>>>>>>>> above. So in either case: KTable materialization will
>>> not be
>>>>>>>>>>>>> affect
>>>>>>>>>>>>>>>>>>>>>> by user
>>>>>>>>>>>>>>>>>>>>>> providing state store name or not, but will only be
>>> decided
>>>>>>>>> by
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> library
>>>>>>>>>>>>>>>>>>>>>> when it is necessary. More specifically, only join
>>> operator
>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> builder.table() resulted KTables are not always
>>> materialized,
>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>> are still
>>>>>>>>>>>>>>>>>>>>>> likely to be materialized lazily (e.g. when
>>> participated in a
>>>>>>>>>>>>> join
>>>>>>>>>>>>>>>>>>>>>> operator).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> For overloaded functions that would mean:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> a) we have an overloaded function for ALL operators
>>> that
>>>>>>>>> could
>>>>>>>>>>>>>>>>>>>>>> result
>>>>>>>>>>>>>>>>>>>>>> in a KTable, and allow it to be null (i.e. for the
>>> function
>>>>>>>>>>>>> without
>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>> param it is null by default);
>>>>>>>>>>>>>>>>>>>>>> b) null-state-store-name do not indicate that a KTable
>>> would
>>>>>>>>>>>>>>>>>>>>>> not be
>>>>>>>>>>>>>>>>>>>>>> materialized, but that it will not be used for IQ at
>>> all
>>>>>>>>>>>>> (internal
>>>>>>>>>>>>>>>>>>>>>> state
>>>>>>>>>>>>>>>>>>>>>> store names will be generated when necessary).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> For materialize() that would mean:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> a) we will remove state store names from ALL operators
>>> that
>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>>>>>>> result in a KTable.
>>>>>>>>>>>>>>>>>>>>>> b) KTables that not calling materialized do not
>>> indicate that
>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>> KTable
>>>>>>>>>>>>>>>>>>>>>> would not be materialized, but that it will not be
>>> used for
>>>>>>>>> IQ
>>>>>>>>>>>>> at all
>>>>>>>>>>>>>>>>>>>>>> (internal state store names will be generated when
>>>>>>>>> necessary).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Again, in either ways the API itself does not "hint"
>>> about
>>>>>>>>>>>>> anything
>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>> materializing a KTable or not at all; it is still
>>> purely
>>>>>>>>>>>>> determined
>>>>>>>>>>>>>>>>>>>>>> by the
>>>>>>>>>>>>>>>>>>>>>> library when parsing the DSL for now.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Following these thoughts, I feel that 1) we should
>>> probably
>>>>>>>>>>>>> change
>>>>>>>>>>>>>>>>>>>>>> the name
>>>>>>>>>>>>>>>>>>>>>> "materialize" since it may be misleading to users as
>>> what
>>>>>>>>>>>>> actually
>>>>>>>>>>>>>>>>>>>>>> happened
>>>>>>>>>>>>>>>>>>>>>> behind the scene, to e.g. Damian suggested
>>>>>>>>>>>> "queryableStore(String
>>>>>>>>>>>>>>>>>>>>>> storeName)",
>>>>>>>>>>>>>>>>>>>>>> which returns a QueryableStateStore, and can replace
>>> the
>>>>>>>>>>>>>>>>>>>>>> `KafkaStreams.store` function; 2) comparing those two
>>> options
>>>>>>>>>>>>>>>>>>>>>> assuming we
>>>>>>>>>>>>>>>>>>>>>> get rid of the misleading function name, I personally
>>> favor
>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>> adding more
>>>>>>>>>>>>>>>>>>>>>> overloading functions as it keeps the API simpler.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Guozhang
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On Sat, Jan 28, 2017 at 2:32 PM, Jan Filipiak
>>>>>>>>>>>>>>>>>>>>>> <jan.filip...@trivago.com>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> thanks for your mail, felt like this can clarify some
>>>>>>>>> things!
>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>>>>> thread
>>>>>>>>>>>>>>>>>>>>>>> unfortunately split but as all branches close in on
>>> what my
>>>>>>>>>>>>>>>>>>>>>>> suggestion was
>>>>>>>>>>>>>>>>>>>>>>> about Ill pick this to continue
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Of course only the table the user wants to query
>>> would be
>>>>>>>>>>>>>>>>>>>>>>> materialized.
>>>>>>>>>>>>>>>>>>>>>>> (retrieving the queryhandle implies materialisation).
>>> So In
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> example of
>>>>>>>>>>>>>>>>>>>>>>> KTable::filter if you call
>>>>>>>>>>>>>>>>>>>>>>> getIQHandle on both tables only the one source that
>>> is there
>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>> materialize and the QueryHandleabstraction would make
>>> sure
>>>>>>>>> it
>>>>>>>>>>>>> gets
>>>>>>>>>>>>>>>>>>>>>>> mapped
>>>>>>>>>>>>>>>>>>>>>>> and filtered and what not uppon read as usual.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Of Course the Object you would retrieve would maybe
>>> only
>>>>>>>>> wrap
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> storeName / table unique identifier and a way to
>>> access the
>>>>>>>>>>>>> streams
>>>>>>>>>>>>>>>>>>>>>>> instance and then basically uses the same mechanism
>>> that is
>>>>>>>>>>>>>>>>>>>>>>> currently used.
>>>>>>>>>>>>>>>>>>>>>>> From my point of view this is the least confusing way
>>> for
>>>>>>>>> DSL
>>>>>>>>>>>>>>>>>>>>>>> users. If
>>>>>>>>>>>>>>>>>>>>>>> its to tricky to get a hand on the streams instance
>>> one
>>>>>>>>> could
>>>>>>>>>>>>> ask
>>>>>>>>>>>>>>>>>>>>>>> the user
>>>>>>>>>>>>>>>>>>>>>>> to pass it in before executing queries, therefore
>>> making
>>>>>>>>> sure
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> streams
>>>>>>>>>>>>>>>>>>>>>>> instance has been build.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> The effort to implement this is indeed some orders of
>>>>>>>>>>>> magnitude
>>>>>>>>>>>>>>>>>>>>>>> higher
>>>>>>>>>>>>>>>>>>>>>>> than the overloaded materialized call. As long as I
>>> could
>>>>>>>>> help
>>>>>>>>>>>>>>>>>>>>>>> getting a
>>>>>>>>>>>>>>>>>>>>>>> different view I am happy.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> On 28.01.2017 09:36, Eno Thereska wrote:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Hi Jan,
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I understand your concern. One implication of not
>>> passing
>>>>>>>>> any
>>>>>>>>>>>>>>>>>>>>>>>> store name
>>>>>>>>>>>>>>>>>>>>>>>> and just getting an IQ handle is that all KTables
>>> would
>>>>>>>>> need
>>>>>>>>>>>>> to be
>>>>>>>>>>>>>>>>>>>>>>>> materialised. Currently the store name (or proposed
>>>>>>>>>>>>>>>>>>>>>>>> .materialize() call)
>>>>>>>>>>>>>>>>>>>>>>>> act as hints on whether to materialise the KTable or
>>> not.
>>>>>>>>>>>>>>>>>>>>>>>> Materialising
>>>>>>>>>>>>>>>>>>>>>>>> every KTable can be expensive, although there are
>>> some
>>>>>>>>> tricks
>>>>>>>>>>>>> one
>>>>>>>>>>>>>>>>>>>>>>>> can play,
>>>>>>>>>>>>>>>>>>>>>>>> e.g., have a virtual store rather than one backed by
>>> a
>>>>>>>>> Kafka
>>>>>>>>>>>>> topic.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> However, even with the above, after getting an IQ
>>> handle,
>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> user would
>>>>>>>>>>>>>>>>>>>>>>>> still need to use IQ APIs to query the state. As
>>> such, we
>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>>> still
>>>>>>>>>>>>>>>>>>>>>>>> continue to be outside the original DSL so this
>>> wouldn't
>>>>>>>>>>>>> address
>>>>>>>>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>>>>>>>> original concern.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> So I read this suggestion as simplifying the APIs by
>>>>>>>>> removing
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> store
>>>>>>>>>>>>>>>>>>>>>>>> name, at the cost of having to materialise every
>>> KTable.
>>>>>>>>> It's
>>>>>>>>>>>>>>>>>>>>>>>> definitely an
>>>>>>>>>>>>>>>>>>>>>>>> option we'll consider as part of this KIP.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> On 28 Jan 2017, at 06:49, Jan Filipiak <
>>>>>>>>>>>>> jan.filip...@trivago.com>
>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> Hi Exactly
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> I know it works from the Processor API, but my
>>> suggestion
>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>>>> prevent
>>>>>>>>>>>>>>>>>>>>>>>>> DSL users dealing with storenames what so ever.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> In general I am pro switching between DSL and
>>> Processor
>>>>>>>>> API
>>>>>>>>>>>>>>>>>>>>>>>>> easily. (In
>>>>>>>>>>>>>>>>>>>>>>>>> my Stream applications I do this a lot with
>>> reflection and
>>>>>>>>>>>>>>>>>>>>>>>>> instanciating
>>>>>>>>>>>>>>>>>>>>>>>>> KTableImpl) Concerning this KIP all I say is that
>>> there
>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>>> be a DSL
>>>>>>>>>>>>>>>>>>>>>>>>> concept of "I want to expose this __KTable__. This
>>> can be
>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>> Method like
>>>>>>>>>>>>>>>>>>>>>>>>> KTable::retrieveIQHandle():InteractiveQueryHandle,
>>> the
>>>>>>>>>>>> table
>>>>>>>>>>>>>>>>>>>>>>>>> would know
>>>>>>>>>>>>>>>>>>>>>>>>> to materialize, and the user had a reference to the
>>> "store
>>>>>>>>>>>>> and the
>>>>>>>>>>>>>>>>>>>>>>>>> distributed query mechanism by the Interactive Query
>>>>>>>>> Handle"
>>>>>>>>>>>>>>>>>>>>>>>>> under the hood
>>>>>>>>>>>>>>>>>>>>>>>>> it can use the same mechanism as the PIP people
>>> again.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> I hope you see my point J
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> #DeathToIQMoreAndBetterConnectors :)
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> On 27.01.2017 21:59, Matthias J. Sax wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Jan,
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> the IQ feature is not limited to Streams DSL but
>>> can also
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>> used for
>>>>>>>>>>>>>>>>>>>>>>>>>> Stores used in PAPI. Thus, we need a mechanism
>>> that does
>>>>>>>>>>>> work
>>>>>>>>>>>>>>>>>>>>>>>>>> for PAPI
>>>>>>>>>>>>>>>>>>>>>>>>>> and DSL.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Nevertheless I see your point and I think we could
>>>>>>>>> provide
>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>> better API
>>>>>>>>>>>>>>>>>>>>>>>>>> for KTable stores including the discovery of remote
>>>>>>>>> shards
>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>> the same
>>>>>>>>>>>>>>>>>>>>>>>>>> KTable.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> @Michael: Yes, right now we do have a lot of
>>> overloads
>>>>>>>>> and
>>>>>>>>>>>> I
>>>>>>>>>>>>> am
>>>>>>>>>>>>>>>>>>>>>>>>>> not a
>>>>>>>>>>>>>>>>>>>>>>>>>> big fan of those -- I would rather prefer a builder
>>>>>>>>>>>> pattern.
>>>>>>>>>>>>>>>>>>>>>>>>>> But that
>>>>>>>>>>>>>>>>>>>>>>>>>> might be a different discussion (nevertheless, if
>>> we
>>>>>>>>> would
>>>>>>>>>>>>> aim
>>>>>>>>>>>>>>>>>>>>>>>>>> for a API
>>>>>>>>>>>>>>>>>>>>>>>>>> rework, we should get the changes with regard to
>>> stores
>>>>>>>>>>>> right
>>>>>>>>>>>>>>>>>>>>>>>>>> from the
>>>>>>>>>>>>>>>>>>>>>>>>>> beginning on, in order to avoid a redesign later
>>> on.)
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> something like:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> stream.groupyByKey()
>>>>>>>>>>>>>>>>>>>>>>>>>> .window(TimeWindow.of(5000))
>>>>>>>>>>>>>>>>>>>>>>>>>> .aggregate(...)
>>>>>>>>>>>>>>>>>>>>>>>>>> .withAggValueSerde(new CustomTypeSerde())
>>>>>>>>>>>>>>>>>>>>>>>>>> .withStoreName("storeName);
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> (This would also reduce JavaDoc redundancy --
>>> maybe a
>>>>>>>>>>>>> personal
>>>>>>>>>>>>>>>>>>>>>>>>>> pain
>>>>>>>>>>>>>>>>>>>>>>>>>> point right now :))
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> On 1/27/17 11:10 AM, Jan Filipiak wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Yeah,
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Maybe my bad that I refuse to look into IQ as i
>>> don't
>>>>>>>>> find
>>>>>>>>>>>>> them
>>>>>>>>>>>>>>>>>>>>>>>>>>> anywhere
>>>>>>>>>>>>>>>>>>>>>>>>>>> close to being interesting. The Problem IMO is
>>> that
>>>>>>>>> people
>>>>>>>>>>>>>>>>>>>>>>>>>>> need to know
>>>>>>>>>>>>>>>>>>>>>>>>>>> the Store name), so we are working on different
>>> levels
>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> achieve a
>>>>>>>>>>>>>>>>>>>>>>>>>>> single goal.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> What is your peoples opinion on having a method on
>>>>>>>>> KTABLE
>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>> returns
>>>>>>>>>>>>>>>>>>>>>>>>>>> them something like a Keyvalue store. There is of
>>> course
>>>>>>>>>>>>>>>>>>>>>>>>>>> problems like
>>>>>>>>>>>>>>>>>>>>>>>>>>> "it cant be used before the streamthreads are
>>> going and
>>>>>>>>>>>>>>>>>>>>>>>>>>> groupmembership
>>>>>>>>>>>>>>>>>>>>>>>>>>> is established..." but the benefit would be that
>>> for the
>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>>>>>>> there is
>>>>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>> consistent way of saying "Hey I need it
>>> materialized as
>>>>>>>>>>>>>>>>>>>>>>>>>>> querries gonna
>>>>>>>>>>>>>>>>>>>>>>>>>>> be comming" + already get a Thing that he can
>>> execute
>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> querries on
>>>>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>> 1 step.
>>>>>>>>>>>>>>>>>>>>>>>>>>> What I think is unintuitive here is you need to
>>> say
>>>>>>>>>>>>>>>>>>>>>>>>>>> materialize on this
>>>>>>>>>>>>>>>>>>>>>>>>>>> Ktable and then you go somewhere else and find
>>> its store
>>>>>>>>>>>>> name
>>>>>>>>>>>>>>>>>>>>>>>>>>> and then
>>>>>>>>>>>>>>>>>>>>>>>>>>> you go to the kafkastreams instance and ask for
>>> the
>>>>>>>>> store
>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>>>> name.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> So one could the user help to stay in DSL land and
>>>>>>>>>>>> therefore
>>>>>>>>>>>>>>>>>>>>>>>>>>> maybe
>>>>>>>>>>>>>>>>>>>>>>>>>>> confuse him less.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> #DeathToIQMoreAndBetterConnectors :)
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> On 27.01.2017 16:51, Damian Guy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think Jan is saying that they don't always
>>> need to be
>>>>>>>>>>>>>>>>>>>>>>>>>>>> materialized,
>>>>>>>>>>>>>>>>>>>>>>>>>>>> i.e.,
>>>>>>>>>>>>>>>>>>>>>>>>>>>> filter just needs to apply the ValueGetter, it
>>> doesn't
>>>>>>>>>>>>> need yet
>>>>>>>>>>>>>>>>>>>>>>>>>>>> another
>>>>>>>>>>>>>>>>>>>>>>>>>>>> physical state store.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, 27 Jan 2017 at 15:49 Michael Noll <
>>>>>>>>>>>>> mich...@confluent.io>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Like Damian, and for the same reasons, I am more
>>> in
>>>>>>>>> favor
>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overloading
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> methods rather than introducing `materialize()`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FWIW, we already have a similar API setup for
>>> e.g.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `KTable#through(topicName, stateStoreName)`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> A related but slightly different question is
>>> what e.g.
>>>>>>>>>>>> Jan
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Filipiak
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> mentioned earlier in this thread:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think we need to explain more clearly why
>>> KIP-114
>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> propose
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> seemingly simpler solution of always
>>> materializing
>>>>>>>>>>>>> tables/state
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> stores.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Jan 27, 2017 at 4:38 PM, Jan Filipiak <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jan.filip...@trivago.com>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Yeah its confusing, Why shoudn't it be
>>> querable by
>>>>>>>>> IQ?
>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> you uses
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ValueGetter of Filter it will apply the filter
>>> and
>>>>>>>>>>>>> should be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> completely
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> transparent as to if another processor or IQ is
>>>>>>>>>>>> accessing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it? How
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> new method help?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I cannot see the reason for the additional
>>>>>>>>> materialize
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> method being
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> required! Hence I suggest leave it alone.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> regarding removing the others I dont have
>>> strong
>>>>>>>>>>>> opinions
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> seems to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be unrelated.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Jan
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 26.01.2017 20:48, Eno Thereska wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Forwarding this thread to the users list too
>>> in case
>>>>>>>>>>>>> people
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> comment. It is also on the dev list.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Eno
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Begin forwarded message:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From: "Matthias J. Sax" <
>>> matth...@confluent.io>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Subject: Re: [DISCUSS] KIP-114: KTable
>>>>>>>>>>>> materialization
>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> improved
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> semantics
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Date: 24 January 2017 at 19:30:10 GMT
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> To: dev@kafka.apache.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Reply-To: dev@kafka.apache.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> That not what I meant by "huge impact".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I refer to the actions related to
>>> materialize a
>>>>>>>>>>>> KTable:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> creating a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RocksDB store and a changelog topic -- users
>>> should
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> aware about
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> runtime implication and this is better
>>> expressed by
>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> explicit
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> method
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> call, rather than implicitly triggered by
>>> using a
>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overload of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a method.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 1/24/17 1:35 AM, Damian Guy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think your definition of a huge impact and
>>> mine
>>>>>>>>> are
>>>>>>>>>>>>> rather
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;-P
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Overloading a few methods  is not really a
>>> huge
>>>>>>>>>>>> impact
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IMO. It is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> also a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sacrifice worth making for readability,
>>> usability of
>>>>>>>>>>>> the
>>>>>>>>>>>>> API.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, 23 Jan 2017 at 17:55 Matthias J.
>>> Sax <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I understand your argument, but do not
>>> agree with
>>>>>>>>>>>> it.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Your first version (even if the "flow" is
>>> not as
>>>>>>>>>>>>> nice)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is more
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> explicit
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> than the second version. Adding a
>>> stateStoreName
>>>>>>>>>>>>> parameter
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is quite
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implicit but has a huge impact -- thus, I
>>> prefer
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> rather more
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> verbose
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> but explicit version.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 1/23/17 1:39 AM, Damian Guy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm not a fan of materialize. I think it
>>>>>>>>> interrupts
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> flow,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> i.e,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>> table.mapValue(..).materialize().join(..).materialize()
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> compared to:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> table.mapValues(..).join(..)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I know which one i prefer.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> My preference is stil to provide
>>> overloaded
>>>>>>>>>>>> methods
>>>>>>>>>>>>> where
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> people can
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specify the store names if they want,
>>> otherwise
>>>>>>>>> we
>>>>>>>>>>>>> just
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> generate
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> them.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, 23 Jan 2017 at 05:30 Matthias J. Sax
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <matth...@confluent.io
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> thanks for the KIP Eno! Here are my 2
>>> cents:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1) I like Guozhang's proposal about
>>> removing
>>>>>>>>>>>> store
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name from
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KTable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> methods and generate internal names
>>> (however, I
>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> do this
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> overloads). Furthermore, I would not
>>> force
>>>>>>>>> users
>>>>>>>>>>>>> to call
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .materialize()
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if they want to query a store, but add
>>> one more
>>>>>>>>>>>>> method
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .stateStoreName()
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that returns the store name if the
>>> KTable is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> materialized.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thus,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .materialize() must not necessarily have a
>>> parameter
>>>>>>>>>>>>> storeName
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (ie,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> should have some overloads here).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would also not allow to provide a
>>> null store
>>>>>>>>>>>>> name (to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> indicate no
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> materialization if not necessary) but
>>> throw an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exception.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This yields some simplification (see
>>> below).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2) I also like Guozhang's proposal about
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KStream#toTable()
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. What will happen when you call
>>> materialize
>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KTable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> already
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> materialized? Will it create another
>>>>>>>>> StateStore
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (providing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> name
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> different), throw an Exception?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Currently an exception is thrown, but
>>> see
>>>>>>>>> below.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we follow approach (1) from
>>> Guozhang, there
>>>>>>>>>>>> is
>>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> need to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> worry
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a second materialization and also no
>>> exception
>>>>>>>>>>>>> must be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> throws. A
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> call to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .materialize() basically sets a
>>> "materialized
>>>>>>>>>>>>> flag" (ie,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> idempotent
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> operation) and sets a new name.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 4)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Rename toStream() to toKStream() for
>>>>>>>>> consistency.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Not sure whether that is really
>>> required. We
>>>>>>>>>>>> also
>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `KStreamBuilder#stream()` and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `KStreamBuilder#table()`, for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> example,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> don't care about the "K" prefix.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Eno's reply:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think changing it to `toKStream`
>>> would make
>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> absolutely
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> clear
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> what
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we are converting it to.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'd say we should probably change the
>>>>>>>>>>>>> KStreamBuilder
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> methods
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (but
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this KIP).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would keep #toStream(). (see below)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 5) We should not remove any methods but
>>> only
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> deprecate them.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> A general note:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I do not understand your comments
>>> "Rejected
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Alternatives". You
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> say
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "Have
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the KTable be the materialized view" was
>>>>>>>>>>>> rejected.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But your
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> actually
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> does exactly this -- the changelog
>>> abstraction
>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KTable is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> secondary
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> after those changes and the "view" abstraction
>>> is
>>>>>>>>> what
>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KTable is.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> And
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> just to be clear, I like this a lot:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - it aligns with the name KTable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - is aligns with stream-table-duality
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - it aligns with IQ
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would say that a KTable is a "view
>>>>>>>>> abstraction"
>>>>>>>>>>>>> (as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> materialization is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> optional).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 1/22/17 5:05 PM, Guozhang Wang wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP Eno, I have a few
>>> meta
>>>>>>>>>>>> comments
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and a few
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> detailed
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> comments:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. I like the materialize() function in
>>>>>>>>> general,
>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> how other KTable functions should be
>>> updated
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> accordingly. For
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> example,
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>>
>>
>>
>> -- 
>> -- Guozhang
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to