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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to