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

Ryan Blue updated AVRO-1590:
----------------------------
    Attachment: AVRO-1590-3.patch

This patch changes the logic in {{bestBranch}} for records one more time:
1. If there is a full name match for any branch of the union, it is chosen
2. Of the records in the union that can read the written schema, if one matches 
the written schema's short name, it is chosen.
3. Otherwise, the first record that can read the written schema is chosen.

I've added a few tests for the ResolvingGrammarGenerator that verify this 
behavior.

> [java] AllowNull causes unexpected resolution failure
> -----------------------------------------------------
>
>                 Key: AVRO-1590
>                 URL: https://issues.apache.org/jira/browse/AVRO-1590
>             Project: Avro
>          Issue Type: Bug
>    Affects Versions: 1.7.7
>            Reporter: Ryan Blue
>            Assignee: Ryan Blue
>         Attachments: AVRO-1590-1.patch, AVRO-1590-2.patch, AVRO-1590-3.patch
>
>
> If I try to read data serialized with a hand-written schema using a reflected 
> schema generated by AllowNull, even though all of the individual types can be 
> read. Here is a failing test:
> {code:java}
>   public static class Point {
>     double x;
>     double y;
>   }
>   public static class Circle {
>     Point center;
>     double radius;
>   }
>   @Test
>   public void testAllowNull() throws Exception {
>     new SchemaValidatorBuilder()
>         .canBeReadStrategy()
>         .validateLatest().validate(
>         SchemaBuilder.record("Circle").fields()
>             .name("center").type().record("Point").fields()
>             .requiredDouble("x")
>             .requiredDouble("y")
>             .endRecord().noDefault()
>             .requiredDouble("radius")
>             .endRecord(),
>         Arrays.asList(ReflectData.AllowNull.get().getSchema(Circle.class)));
>   }
> {code}
> The problem is that the {{ResolvingGrammarGenerator}} can't resolve a record 
> with a nullable record unless the two have the same [full 
> name|https://github.com/apache/avro/blob/trunk/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java#L439].
> It is more work, but I think the check should be whether there is a readable 
> record in the union. Another alternative is to special case a nullable union 
> and allow the record-level resolution only in that case.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to