[
https://issues.apache.org/jira/browse/AVRO-695?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14030919#comment-14030919
]
Sachin Goyal commented on AVRO-695:
-----------------------------------
For other applications to read, they must set in the field-name used for
circular reference:
{code}
GenericDatumReader<GenericRecord> datumReader = new
GenericDatumReader<GenericRecord> ();
GenericData gdata = datumReader.getData();
gdata.setCircularRefIdPrefix("__crefId");
{code}
If they use the above for the reader, then the output would be:
{code:JavaScript}
{
"__crefId":"0",
"name":"John Sr",
"child":{
"__crefId":"1",
"name":"John Jr",
"parent":{
"__crefId":"__crefId0",
"name":null,
"child":null
}
}
}
{code}
And if they set the flag:
{code}
datumReader.setResolveCircularRefs (true);
{code}
Then the reference to parent is actually replaced with the reference to the
actual parent.
The reason I have made the actual reference optional is because some tools
might not be prepared to handle circular reference yet.
For example, GenericRecord.toString() fails with StackOverflow if the reference
is replaced with an actual one.
Default value for datumReader.setResolveCircularRefs is false, so the output
record's type is consistent with the schema and it has enough information for
clients to help them deduce circular reference.
As per this fix, the first field in a record must be a string to support
circularity.
> Cycle Reference Support
> -----------------------
>
> Key: AVRO-695
> URL: https://issues.apache.org/jira/browse/AVRO-695
> Project: Avro
> Issue Type: New Feature
> Components: spec
> Affects Versions: 1.7.6
> Reporter: Moustapha Cherri
> Attachments: avro-1.4.1-cycle.patch.gz, avro-1.4.1-cycle.patch.gz,
> avro_circular_references.zip
>
> Original Estimate: 672h
> Remaining Estimate: 672h
>
> This is a proposed implementation to add cycle reference support to Avro. It
> basically introduce a new type named Cycle. Cycles contains a string
> representing the path to the other reference.
> For example if we have an object of type Message that have a member named
> previous with type Message too. If we have have this hierarchy:
> message
> previous : message2
> message2
> previous : message2
> When serializing the cycle path for "message2.previous" will be "previous".
> The implementation depend on ANTLR to evaluate those cycle at read time to
> resolve them. I used ANTLR 3.2. This dependency is not mandated; I just used
> ANTLR to speed thing up. I kept in this implementation the generated code
> from ANTLR though this should not be the case as this should be generated
> during the build. I only updated the Java code.
> I did not make full unit testing but you can find "avrotest.Main" class that
> can be used a preliminary test.
> Please do not hesitate to contact me for further clarification if this seems
> interresting.
> Best regards,
> Moustapha Cherri
--
This message was sent by Atlassian JIRA
(v6.2#6252)