in lang/csharp/src/apache/main/Generic/PreresolvingDatumReader.cs [456:521]
private DecoderSkip GetSkip(Schema writerSchema)
{
switch (writerSchema.Tag)
{
case Schema.Type.Null:
return d => d.SkipNull();
case Schema.Type.Boolean:
return d => d.SkipBoolean();
case Schema.Type.Int:
return d => d.SkipInt();
case Schema.Type.Long:
return d => d.SkipLong();
case Schema.Type.Float:
return d => d.SkipFloat();
case Schema.Type.Double:
return d => d.SkipDouble();
case Schema.Type.String:
return d => d.SkipString();
case Schema.Type.Bytes:
return d => d.SkipBytes();
case Schema.Type.Error:
case Schema.Type.Record:
var recordSkips = new List<DecoderSkip>();
var recSchema = (RecordSchema)writerSchema;
recSchema.Fields.ForEach(r => recordSkips.Add(GetSkip(r.Schema)));
return d => recordSkips.ForEach(s=>s(d));
case Schema.Type.Enumeration:
return d => d.SkipEnum();
case Schema.Type.Fixed:
var size = ((FixedSchema)writerSchema).Size;
return d => d.SkipFixed(size);
case Schema.Type.Array:
var itemSkip = GetSkip(((ArraySchema)writerSchema).ItemSchema);
return d =>
{
for (long n = d.ReadArrayStart(); n != 0; n = d.ReadArrayNext())
{
for (long i = 0; i < n; i++) itemSkip(d);
}
};
case Schema.Type.Map:
{
var valueSkip = GetSkip(((MapSchema)writerSchema).ValueSchema);
return d =>
{
for (long n = d.ReadMapStart(); n != 0; n = d.ReadMapNext())
{
for (long i = 0; i < n; i++) { d.SkipString(); valueSkip(d); }
}
};
}
case Schema.Type.Union:
var unionSchema = (UnionSchema)writerSchema;
var lookup = new DecoderSkip[unionSchema.Count];
for (int i = 0; i < unionSchema.Count; i++)
{
lookup[i] = GetSkip( unionSchema[i] );
}
return d => lookup[d.ReadUnionIndex()](d);
case Schema.Type.Logical:
var logicalSchema = (LogicalSchema)writerSchema;
return GetSkip(logicalSchema.BaseSchema);
default:
throw new AvroException("Unknown schema type: " + writerSchema);
}
}