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

Reply via email to