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

Reply via email to