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