[ 
https://issues.apache.org/jira/browse/AVRO-997?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13474548#comment-13474548
 ] 

Sean Busbey commented on AVRO-997:
----------------------------------

Scott, I could write a patch that maintains the current behavior for unions of 
"things that look like enum members when toString is called" and enums, which 
is to say the non-enum type gets picked if it is present. eg ["string", "long", 
{"type":"enum", "symbols":["ONE", "TWO", "42"]}] says that "ONE" is a string 
and 42 is a long. Since it would be consistent with current behavior, a warning 
in the API about the coercion might be sufficient. It would be less efficient 
than picking the enum member, but doing that would be just as breaking as 
reworking the generic api to be strict.

The only time I've seen this come up is when someone has a union field and then 
wants to mark it as optional so they move it to a union with null. While their 
original use of Java String for field values was incorrect, the generic api as 
is would have worked fine up until the addition of the union. In general I'm a 
fan of "just works" behavior from APIs, but I can understand Doug's desire to 
favor consistent strict application as a way of steering users away from 
behavior that will lead to confusing non-roundtrip-able edge cases.
                
> Union of enum and null cannot be serialized
> -------------------------------------------
>
>                 Key: AVRO-997
>                 URL: https://issues.apache.org/jira/browse/AVRO-997
>             Project: Avro
>          Issue Type: Bug
>    Affects Versions: 1.5.1
>            Reporter: Aaron Kimball
>            Assignee: Sean Busbey
>             Fix For: 1.8.0
>
>         Attachments: AVRO-997.patch, AVRO-997.patch
>
>
> I have a schema like:
> {code}
> [
> {
>   "type": "enum",
>   "name": "Gender",
>   "symbols": ["M", "F"]
> },
> {
>   "type" : "record",
>   "name" : "Foo",
>   "fields" : [
>     { "type" : ["Gender", "null"], "name" : "gender" },
>     ...
>   ]
> }
> ]
> {code}
> I build a record like {{Foo foo = new Foo(); foo.gender = Gender.M;}}
> When I go to serialize this, I get:
> {code}Not in union 
> [{"type":"enum","name":"Gender","symbols":["M","F"]},"null"]: M
>       at 
> org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:482)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:70)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:57)
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to