Good observation, Daniyar.

Maybe we should just not implement support for serdeFrom.

We can always add it later, but I think you're right, we need some
kind of more sophisticated support, or at least a second argument for
the inner class.

For now, it seems like most use cases would be satisfied without
serdeFrom(...List...)

-John

On Fri, May 10, 2019 at 8:57 AM Development <d...@yeralin.net> wrote:
>
> Hi,
>
> I was trying to add some test cases for the list serde, and it led me to this 
> class `org.apache.kafka.common.serialization.SerializationTest`. I saw that 
> it relies on method `org.apache.kafka.common.serialization.serdeFrom(Class<T> 
> type)`
>
> Now, I’m not sure how to adapt List<T> serde for this method, since it will 
> be a “nested class”. What is the best approach in this case?
>
> I remember that in Jackson for example, one uses a TypeFactory, and 
> constructs “collectionType” of two classes. For example, 
> `constructCollectionType(List.class, String.class).getClass()`. I don’t think 
> it applies here.
>
> Any ideas?
>
> Best,
> Daniyar Yeralin
>
> > On May 9, 2019, at 2:10 PM, Development <d...@yeralin.net> wrote:
> >
> > Hey Sophie,
> >
> > Thank you for your input. I think I’d rather finish this KIP as is, and 
> > then open a new one for the Collections (if everyone agrees). I don’t want 
> > to extend the current KIP-466, since most of the work is already done for 
> > it.
> >
> > Meanwhile, I’ll start adding some test cases for this new list serde since 
> > this discussion seems to be approaching its logical end.
> >
> > Best,
> > Daniyar Yeralin
> >
> >> On May 9, 2019, at 1:35 PM, Sophie Blee-Goldman <sop...@confluent.io> 
> >> wrote:
> >>
> >> Good point about serdes for other Collections. On the one hand I'd guess
> >> that non-List Collections are probably relatively rare in practice (if
> >> anyone disagrees please correct me!) but on the other hand, a) even if just
> >> a small number of people benefit I think it's worth the extra effort and b)
> >> if we do end up needing/wanting them in the future it would save us a KIP
> >> to just add them now. Personally I feel it would make sense to expand the
> >> scope of this KIP a bit to include all Collections as a logical unit, but
> >> the ROI could be low..
> >>
> >> (I know of at least one instance in the unit tests where a Set serde could
> >> be useful, and there may be more)
> >>
> >> On Thu, May 9, 2019 at 7:27 AM Development <d...@yeralin.net> wrote:
> >>
> >>> Hey,
> >>>
> >>> I don’t see any replies. Seems like this proposal can be finalized and
> >>> called for a vote?
> >>>
> >>> Also I’ve been thinking. Do we need more serdes for other Collections?
> >>> Like queue or set for example
> >>>
> >>> Best,
> >>> Daniyar Yeralin
> >>>
> >>>> On May 8, 2019, at 2:28 PM, John Roesler <j...@confluent.io> wrote:
> >>>>
> >>>> Hi Daniyar,
> >>>>
> >>>> No worries about the procedural stuff. Prior experience with KIPs is
> >>>> not required :)
> >>>>
> >>>> I was just trying to help you propose this stuff in a way that the
> >>>> others will find easy to review.
> >>>>
> >>>> Thanks for updating the KIP. Thanks to the others for helping out with
> >>>> the syntax.
> >>>>
> >>>> Given these updates, I'm curious if anyone else has feedback about
> >>>> this proposal. Personally, I think it sounds fine!
> >>>>
> >>>> -John
> >>>>
> >>>> On Wed, May 8, 2019 at 1:01 PM Development <d...@yeralin.net> wrote:
> >>>>>
> >>>>> Hey,
> >>>>>
> >>>>> That worked! I certainly lack Java generics knowledge. Thanks for the
> >>> snippet. I’ll update KIP again.
> >>>>>
> >>>>> Best,
> >>>>> Daniyar Yeralin
> >>>>>
> >>>>>> On May 8, 2019, at 1:39 PM, Chris Egerton <chr...@confluent.io> wrote:
> >>>>>>
> >>>>>> Hi Daniyar,
> >>>>>>
> >>>>>> I think you may want to tweak your syntax a little:
> >>>>>>
> >>>>>> public static <T> Serde<List<T>> List(Serde<T> innerSerde) {
> >>>>>> return new ListSerde<T>(innerSerde);
> >>>>>> }
> >>>>>>
> >>>>>> Does that work?
> >>>>>>
> >>>>>> Cheers,
> >>>>>>
> >>>>>> Chris
> >>>>>>
> >>>>>> On Wed, May 8, 2019 at 10:29 AM Development <d...@yeralin.net <mailto:
> >>> d...@yeralin.net>> wrote:
> >>>>>> Hi John,
> >>>>>>
> >>>>>> I updated JIRA and KIP.
> >>>>>>
> >>>>>> I didn’t know about the process, and created PR before I knew about
> >>> KIPs :)
> >>>>>>
> >>>>>> As per static declaration, I don’t think Java allows that:
> >>>>>>
> >>>>>>
> >>>>>> Best,
> >>>>>> Daniyar Yeralin
> >>>>>>
> >>>>>>> On May 7, 2019, at 2:22 PM, John Roesler <j...@confluent.io <mailto:
> >>> j...@confluent.io>> wrote:
> >>>>>>>
> >>>>>>> Thanks for that update. Do you mind making changes primarily on the
> >>>>>>> KIP document ? (
> >>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization
> >>> <
> >>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization
> >>>> )
> >>>>>>>
> >>>>>>> This is the design document that we have to agree on and vote for, the
> >>>>>>> PR comes later. It can be nice to have an implementation to look at,
> >>>>>>> but the KIP is the main artifact for this discussion.
> >>>>>>>
> >>>>>>> With this in mind, it will help get more reviewers to look at it if
> >>>>>>> you can tidy up the KIP document so that it stands on its own. People
> >>>>>>> shouldn't have to look at any other document to understand the
> >>>>>>> motivation of the proposal, and they shouldn't have to look at a PR to
> >>>>>>> see what the public API will look like. If it helps, you can take a
> >>>>>>> look at some other recent KIPs.
> >>>>>>>
> >>>>>>> Given that the list serde needs an inner serde, I agree you can't have
> >>>>>>> a zero-argument static factory method for it, but it seems you could
> >>>>>>> still have a static method:
> >>>>>>> `public static Serde<List<T>> List(Serde<T> innerSerde)`.
> >>>>>>>
> >>>>>>> Thoughts?
> >>>>>>>
> >>>>>>> On Tue, May 7, 2019 at 12:18 PM Development <d...@yeralin.net <mailto:
> >>> d...@yeralin.net>> wrote:
> >>>>>>>>
> >>>>>>>> Absolutely agree. Already pushed another commit to remove comparator
> >>> argument: https://github.com/apache/kafka/pull/6592 <
> >>> https://github.com/apache/kafka/pull/6592> <
> >>> https://github.com/apache/kafka/pull/6592 <
> >>> https://github.com/apache/kafka/pull/6592>>
> >>>>>>>>
> >>>>>>>> Thank you for your input John! I really appreciate it.
> >>>>>>>>
> >>>>>>>> What about this point I made:
> >>>>>>>>
> >>>>>>>> 1. Since type for List serde needs to be declared before hand, I
> >>> could not create a static method for List Serde under
> >>> org.apache.kafka.common.serialization.Serdes. I addressed it in the KIP:
> >>>>>>>> P.S. Static method corresponding to ListSerde under
> >>> org.apache.kafka.common.serialization.Serdes (something like static public
> >>> Serde<List<T>> List() {...} 
> >>> inorg.apache.kafka.common.serialization.Serdes)
> >>> class cannot be added because type needs to be defined beforehand. That's
> >>> why one needs to create List Serde in the following fashion:
> >>>>>>>> new Serdes.ListSerde<String>(Serdes.String(),
> >>> Comparator.comparing(String::length));
> >>>>>>>> (can possibly be simplified by declaring import static
> >>> org.apache.kafka.common.serialization.Serdes.ListSerde)
> >>>>>>>>
> >>>>>>>>> On May 7, 2019, at 11:50 AM, John Roesler <j...@confluent.io
> >>> <mailto:j...@confluent.io>> wrote:
> >>>>>>>>>
> >>>>>>>>> Thanks for the reply Daniyar,
> >>>>>>>>>
> >>>>>>>>> That makes much more sense! I thought I must be missing something,
> >>> but I
> >>>>>>>>> couldn't for the life of me figure it out.
> >>>>>>>>>
> >>>>>>>>> What do you think about just taking an argument, instead of for a
> >>>>>>>>> Comparator, for the Serde of the inner type? That way, the user can
> >>> control
> >>>>>>>>> how exactly the inner data gets serialized, while also bounding the
> >>> generic
> >>>>>>>>> parameter properly. As for the order, since the list is already in a
> >>>>>>>>> specific order, which the user themselves controls, it doesn't seem
> >>>>>>>>> strictly necessary to offer an option to sort the data during
> >>> serialization.
> >>>>>>>>>
> >>>>>>>>> Thanks,
> >>>>>>>>> -John
> >>>>>>>>>
> >>>>>>>>> On Mon, May 6, 2019 at 8:47 PM Development <d...@yeralin.net
> >>> <mailto:d...@yeralin.net>> wrote:
> >>>>>>>>>
> >>>>>>>>>> Hi John,
> >>>>>>>>>>
> >>>>>>>>>> I’m really sorry for the confusion. I cloned that JIRA ticket from
> >>> an old
> >>>>>>>>>> one about introducing UUID Serde, and I guess was too hasty while
> >>> editing
> >>>>>>>>>> the copy to notice the mistake. Just edited the ticket. Sorry for
> >>> any
> >>>>>>>>>> inconvenience .
> >>>>>>>>>>
> >>>>>>>>>> As per comparator, I agree. Let’s make user be responsible for
> >>>>>>>>>> implementing comparable interface. I was just thinking to make the
> >>> serde a
> >>>>>>>>>> little more flexible (i.e. let user decide in which order records
> >>> is going
> >>>>>>>>>> to be inserted into a change log topic).
> >>>>>>>>>>
> >>>>>>>>>> Thank you!
> >>>>>>>>>>
> >>>>>>>>>> Best,
> >>>>>>>>>> Daniyar Yeralin
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>> On May 6, 2019, at 5:37 PM, John Roesler <j...@confluent.io
> >>> <mailto:j...@confluent.io>> wrote:
> >>>>>>>>>>>
> >>>>>>>>>>> Hi Daniyar,
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks for the proposal!
> >>>>>>>>>>>
> >>>>>>>>>>> If I understand the point about the comparator, is it just to
> >>> capture the
> >>>>>>>>>>> generic type parameter? If so, then anything that implements a
> >>> known
> >>>>>>>>>>> interface would work just as well, right? I've been considering
> >>> adding
> >>>>>>>>>>> something like the Jackson TypeReference (or similar classes in
> >>> many
> >>>>>>>>>> other
> >>>>>>>>>>> projects). Would this be a good time to do it?
> >>>>>>>>>>>
> >>>>>>>>>>> Note that it's not necessary to actually require that the
> >>> captured type
> >>>>>>>>>> is
> >>>>>>>>>>> Comparable (as this proposal currently does), it's just a way to
> >>> make
> >>>>>>>>>> sure
> >>>>>>>>>>> there is some method that makes use of the generic type
> >>> parameter, to
> >>>>>>>>>> force
> >>>>>>>>>>> the compiler to capture the type.
> >>>>>>>>>>>
> >>>>>>>>>>> Just to make sure I understand the motivation... You expressed a
> >>> desire
> >>>>>>>>>> to
> >>>>>>>>>>> be able to serialize UUIDs, which I didn't follow, since there is
> >>> a
> >>>>>>>>>>> built-in UUID serde:
> >>> org.apache.kafka.common.serialization.Serdes#UUID,
> >>>>>>>>>> and
> >>>>>>>>>>> also, a UUID isn't a List. Did you mean that you need to use
> >>> *lists of*
> >>>>>>>>>>> UUIDs?
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks,
> >>>>>>>>>>> -John
> >>>>>>>>>>>
> >>>>>>>>>>> On Mon, May 6, 2019 at 11:49 AM Development <d...@yeralin.net
> >>> <mailto:d...@yeralin.net>> wrote:
> >>>>>>>>>>>
> >>>>>>>>>>>> Hello,
> >>>>>>>>>>>>
> >>>>>>>>>>>> Starting a discussion for KIP-466 adding support for List Serde.
> >>> PR is
> >>>>>>>>>>>> created under https://github.com/apache/kafka/pull/6592 <
> >>> https://github.com/apache/kafka/pull/6592> <
> >>>>>>>>>>>> https://github.com/apache/kafka/pull/6592 <
> >>> https://github.com/apache/kafka/pull/6592>>
> >>>>>>>>>>>>
> >>>>>>>>>>>> There are two topics I would like to discuss:
> >>>>>>>>>>>> 1. Since type for List serve needs to be declared before hand, I
> >>> could
> >>>>>>>>>> not
> >>>>>>>>>>>> create a static method for List Serde under
> >>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes. I addressed it in
> >>> the KIP:
> >>>>>>>>>>>> P.S. Static method corresponding to ListSerde under
> >>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes (something like
> >>> static
> >>>>>>>>>> public
> >>>>>>>>>>>> Serde<List<T>> List() {...}
> >>>>>>>>>> inorg.apache.kafka.common.serialization.Serdes)
> >>>>>>>>>>>> class cannot be added because type needs to be defined
> >>> beforehand.
> >>>>>>>>>> That's
> >>>>>>>>>>>> why one needs to create List Serde in the following fashion:
> >>>>>>>>>>>> new Serdes.ListSerde<String>(Serdes.String(),
> >>>>>>>>>>>> Comparator.comparing(String::length));
> >>>>>>>>>>>> (can possibly be simplified by declaring import static
> >>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes.ListSerde)
> >>>>>>>>>>>>
> >>>>>>>>>>>> 2. @miguno Michael G. Noll <https://github.com/miguno <
> >>> https://github.com/miguno>> is questioning
> >>>>>>>>>>>> whether I need to pass a comparator to ListDeserializer. This
> >>> certainly
> >>>>>>>>>> is
> >>>>>>>>>>>> not required. Feel free to add your input:
> >>>>>>>>>>>> https://github.com/apache/kafka/pull/6592#discussion_r281152067
> >>> <https://github.com/apache/kafka/pull/6592#discussion_r281152067>
> >>>>>>>>>>>>
> >>>>>>>>>>>> Thank you!
> >>>>>>>>>>>>
> >>>>>>>>>>>> Best,
> >>>>>>>>>>>> Daniyar Yeralin
> >>>>>>>>>>>>
> >>>>>>>>>>>>> On May 6, 2019, at 11:59 AM, Daniyar Yeralin (JIRA) <
> >>> j...@apache.org <mailto:j...@apache.org>>
> >>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Daniyar Yeralin created KAFKA-8326:
> >>>>>>>>>>>>> --------------------------------------
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>       Summary: Add List<T> Serde
> >>>>>>>>>>>>>           Key: KAFKA-8326
> >>>>>>>>>>>>>           URL:
> >>> https://issues.apache.org/jira/browse/KAFKA-8326 <
> >>> https://issues.apache.org/jira/browse/KAFKA-8326>
> >>>>>>>>>>>>>       Project: Kafka
> >>>>>>>>>>>>>    Issue Type: Improvement
> >>>>>>>>>>>>>    Components: clients, streams
> >>>>>>>>>>>>>      Reporter: Daniyar Yeralin
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I propose adding serializers and deserializers for the
> >>> java.util.List
> >>>>>>>>>>>> class.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I have many use cases where I want to set the key of a Kafka
> >>> message to
> >>>>>>>>>>>> be a UUID. Currently, I need to turn UUIDs into strings or byte
> >>> arrays
> >>>>>>>>>> and
> >>>>>>>>>>>> use their associated Serdes, but it would be more convenient to
> >>>>>>>>>> serialize
> >>>>>>>>>>>> and deserialize UUIDs directly.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I believe there are many use cases where one would want to have
> >>> a List
> >>>>>>>>>>>> serde. Ex. [
> >>>>>>>>>>>>
> >>>>>>>>>>
> >>> https://stackoverflow.com/questions/41427174/aggregate-java-objects-in-a-list-with-kafka-streams-dsl-windows
> >>> <
> >>> https://stackoverflow.com/questions/41427174/aggregate-java-objects-in-a-list-with-kafka-streams-dsl-windows
> >>>>
> >>>>>>>>>> ],
> >>>>>>>>>>>> [
> >>>>>>>>>>>>
> >>>>>>>>>>
> >>> https://stackoverflow.com/questions/46365884/issue-with-arraylist-serde-in-kafka-streams-api
> >>> <
> >>> https://stackoverflow.com/questions/46365884/issue-with-arraylist-serde-in-kafka-streams-api
> >>>>
> >>>>>>>>>>>> ]
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> KIP Link: [
> >>>>>>>>>>>>
> >>>>>>>>>>
> >>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization
> >>> <
> >>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization
> >>>>
> >>>>>>>>>>>> ]
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> --
> >>>>>>>>>>>>> This message was sent by Atlassian JIRA
> >>>>>>>>>>>>> (v7.6.3#76005)
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>
> >>>
> >>>
> >
>

Reply via email to