[ 
https://issues.apache.org/jira/browse/AVRO-3946?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated AVRO-3946:
---------------------------------
    Labels: pull-request-available  (was: )

> Support single-element unions for Java code generation
> ------------------------------------------------------
>
>                 Key: AVRO-3946
>                 URL: https://issues.apache.org/jira/browse/AVRO-3946
>             Project: Apache Avro
>          Issue Type: Improvement
>          Components: java, tools
>    Affects Versions: 1.11.3
>         Environment: [Avro 
> specification|https://avro.apache.org/docs/1.11.1/specification/#unions]
>            Reporter: M. Justin
>            Priority: Minor
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> I am writing code to integrate with existing Avro-based data created by 
> someone else.  Their schema currently has one-element unions for their types, 
> rather than just the specific types.  For example:
> {code:json}
> {
>   "type": "record",
>   "name": "Issue",
>   "namespace": "invalid.example",
>   "fields": [
>     {
>       "name": "myField",
>       "type": ["long"]
>     }
>   ]
> }
> {code}
> instead of:
> {code:json}
> {
>   "type": "record",
>   "name": "Issue",
>   "namespace": "invalid.example",
>   "fields": [
>     {
>       "name": "myField",
>       "type": "long"
>     }
>   ]
> }
> {code}
> While this isn't idiomatic, looking at the [Avro 
> Specification|https://avro.apache.org/docs/1.11.1/specification/#unions], it 
> does appear to be valid.  It should also be logically equivalent to the 
> non-union version of this.
> The Java code generator, however, generates this field as an {{Object}}, not 
> as a {{long}} like it would with the non-union type (or the {{Long}} if it 
> were the {{["null", "long"]}} or {{["long", "null"]}} union).
> {code}
> java -jar avro-tools-1.11.3.jar compile schema issue.avsc .
> {code}
> produces
> {code:java}
>   private java.lang.Object myField;
> {code}
> instead of
> {code:java}
>   private long myField;
> {code}
> For my case, I'm going to work with the other project's developers to change 
> their schema type to be the primitive type.
> However, I'm raising this issue in case you want to improve the handling of 
> this case to have a single-element union generate the same code as it would 
> if just as if it were instead just that single element.  i.e. {{\{"name": 
> myField", "type": ["long"]\}}} would generate the same code as {{\{"name": 
> myField", "type": "long"\}}} currently does, which is as a {{long}} value in 
> the Java code.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to