Made a slight change to the wiki since I had forgotten to state the fact that some APIs don’t take a store name, but a StateStoreSupplier (that contains the name). That’s already the case in the code but thought of making that explicit. FYI, no action needed.
Thanks Eno > On Apr 21, 2017, at 7:47 PM, Eno Thereska <eno.there...@gmail.com> wrote: > > Added the .tostream() discussion in the Wiki. > > Thanks > Eno >> On 21 Apr 2017, at 18:48, 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 >>> >> >