No, it should not initialize the field to the default.

Default values are for readers, not writers.   The intended use case is schema 
evolution.   A reader on version N+1 has field foo with default 'quux', but 
reads data that was written without that field.  The reader will see foo = 
'quux'.

A writer must always correctly provide data for all of the fields in the schema 
it declared it is writing.

The specific API does make this a bit more difficult than it needs to be, it is 
something I would like to address at a later time.  In the meantime I use 
wrapper classes around the SpecificRecord objects that provide restricted 
getters and restrictive constructors or factory methods to prevent other users 
from forgetting to set a field.

-Scott

On Jun 7, 2010, at 1:53 PM, Bill de hOra wrote:

> Hi,
> 
> I.m wondering if I'm missing an incantation for 'compile 
> schema/protocol' in Avro tools to handle defaults. Given this schema,
> 
> [[[
> {
>     "name": "avro.Message",
>     "type": "record",
>     "fields": [
>         {
>             "name": "foo",
>             "type": "string",
>             "default":"quux"
>         },
>         {
>             "name": "bar",
>             "type": "string"
>         }
>     ]
> 
> }
> ]]]
> 
> and running it through 'avro-tools-1.3.2.jar compile schema', I get this 
> object
> 
> [[[
> package avro;
> 
> @SuppressWarnings("all")
> public class Message extends org.apache.avro.specific.SpecificRecordBase 
> implements org.apache.avro.specific.SpecificRecord {
>   public static final org.apache.avro.Schema SCHEMA$ = 
> org.apache.avro.Schema.parse("{\"type\":\"record\",\"name\":\"Message\",\"namespace\":\"avro\",\"fields\":[{\"name\":\"foo\",\"type\":\"string\",\"default\":\"quux\"},{\"name\":\"bar\",\"type\":\"string\"}]}");
>   public org.apache.avro.util.Utf8 foo = new Utf8("quux");
>   public org.apache.avro.util.Utf8 bar;
>   public org.apache.avro.Schema getSchema() { return SCHEMA$; }
>   public java.lang.Object get(int field$) {
>     switch (field$) {
>     case 0: return foo;
>     case 1: return bar;
>     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
>     }
>   }
>   @SuppressWarnings(value="unchecked")
>   public void put(int field$, java.lang.Object value$) {
>     switch (field$) {
>     case 0: foo = (org.apache.avro.util.Utf8)value$; break;
>     case 1: bar = (org.apache.avro.util.Utf8)value$; break;
>     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
>     }
>   }
> }
> ]]]
> 
> Should this line,
> 
> [[[
>   public org.apache.avro.util.Utf8 foo;
> ]]]
> 
> be,
> 
> [[[
>   public org.apache.avro.util.Utf8 foo
>     = new org.apache.avro.util.Utf8("quux");
> ]]]
> 
> ?
> 
> Fwiw, changing the object's 'foo' field above to have the default stops 
> the IPC server from barfing with an NPE (@ 
> org.apache.avro.io.BinaryEncoder.writeString(BinaryEncoder.java:133)) 
> when a client creates a message object only sets 'bar', and then sends 
> the Message to the server via .
> 
> Bill
> 
> 
> 

Reply via email to