Hi Tony,

If you change the order of elements in the author field, it is fine:

@Test
public void testUnion() {
  Schema schema = SchemaBuilder
    .unionOf()
    .record("Author")
    .fields()
    .name("name").type().stringType().noDefault()
    .name("birthday").type().longType().noDefault()
    .endRecord().and()
    .record("Book")
    .fields()
    .name("title").type().stringType().noDefault()
    .name("author").type().unionOf()
    .stringType().and()
    .type("Author")
    .endUnion()
    .noDefault()
    .endRecord().endUnion();
}

The specification doesn't say anything about the order of types in a union,
so I guess it shouldn't limit it, I think you're right, your code should
compile. Maybe this is a bug in the SchemaBuilder?

Nandor

On Thu, Jul 6, 2017 at 10:14 AM, Tony Imbault <timba...@talend.com> wrote:

> Hi everybody,
>
>
>
> i am trying to build the followong JSON schema:
>
>
>
> [{
>
>      "type": "record",
>
>      "name": "Author",
>
>      "fields": [{
>
>           "name": "name",
>
>           "type": "string"
>
>      },
>
>      {
>
>           "name": "birthday",
>
>           "type": "long"
>
>      }]
>
> },
>
> {
>
>      "type": "record",
>
>      "name": "Book",
>
>      "fields": [{
>
>           "name": "title",
>
>           "type": "string"
>
>      },
>
>      {
>
>           "name": "author",
>
>           "type": ["Author", "string"]
>
>      }]
>
> }]
>
>
>
> In my humble opinion this JSON schema is valid.
>
>
>
> But it seems that the SchemaBuilder API does not permit to build this
> schema.
>
> The corresponding code should be something like that:
>
>
>
> Schema schema = SchemaBuilder
>
>                      .unionOf()
>
>                      .record("Author")
>
>                      .fields()
>
>                      .name("name").type().stringType().noDefault()
>
>                      .name("birthday").type().
> longType().noDefault()
>
>                      .endRecord().and()
>
>                      .record("Book")
>
>                      .fields()
>
>                      .name("title").type().stringType().noDefault()
>
>                      .name("author").type().unionOf()
>
>                      .type("Author").and()
>
>                      .stringType().endUnion()
>
>                      .noDefault()
>
>                      .endRecord().endUnion();
>
>
>
> But after a call to unionOf() the type(name) method is not available.
>
>
>
> Is there any reason for this limitation?
>
>
>
> Thank you very much
>
>
>
> Tony Imbault
>

Reply via email to