Sounds good. Thanks. On Fri, Apr 21, 2017 at 10:48 AM, Matthias J. Sax <matth...@confluent.io> wrote:
> 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 > > > > -- -- Guozhang