Kinetica   C#   API  Version 7.2.3.0
SpecificReader.cs
Go to the documentation of this file.
1 
18 using System;
19 using System.Collections.Generic;
20 using System.Linq;
21 using System.Reflection;
22 using System.IO;
23 using Avro;
24 using Avro.IO;
25 using Avro.Generic;
26 
27 namespace Avro.Specific
28 {
33  public class SpecificReader<T> : DatumReader<T>
34  {
38  private readonly SpecificDefaultReader reader;
39 
43  public Schema WriterSchema { get { return reader.WriterSchema; } }
44 
48  public Schema ReaderSchema { get { return reader.ReaderSchema; } }
49 
56  public SpecificReader(Schema writerSchema, Schema readerSchema)
57  {
58  reader = new SpecificDefaultReader(writerSchema, readerSchema);
59  }
60 
62  {
63  this.reader = reader;
64  }
65 
72  public T Read(T reuse, Decoder dec)
73  {
74  return reader.Read(reuse, dec);
75  }
76  }
77 
82  {
87  private static IDictionary<string, Type> TypeName = new Dictionary<string, Type>();
88 
94  public SpecificDefaultReader(Schema writerSchema, Schema readerSchema) : base(writerSchema,readerSchema)
95  {
96  }
97 
106  protected override object ReadRecord(object reuse, RecordSchema writerSchema, Schema readerSchema, Decoder dec)
107  {
108  RecordSchema rs = (RecordSchema)readerSchema;
109 
110  if (rs.Name == null)
111  return base.ReadRecord(reuse, writerSchema, readerSchema, dec);
112 
113  ISpecificRecord rec = (reuse != null ? reuse : ObjectCreator.Instance.New(rs.Fullname, Schema.Type.Record)) as ISpecificRecord;
114  object obj;
115  foreach (Field wf in writerSchema)
116  {
117  try
118  {
119  Field rf;
120  if (rs.TryGetField(wf.Name, out rf))
121  {
122  obj = rec.Get(rf.Pos);
123  rec.Put(rf.Pos, Read(obj, wf.Schema, rf.Schema, dec));
124  }
125  else
126  Skip(wf.Schema, dec);
127  }
128  catch (Exception ex)
129  {
130  throw new AvroException(ex.Message + " in field " + wf.Name);
131  }
132  }
133 
134  var defaultStream = new MemoryStream();
135  var defaultEncoder = new BinaryEncoder(defaultStream);
136  var defaultDecoder = new BinaryDecoder(defaultStream);
137  foreach (Field rf in rs)
138  {
139  if (writerSchema.Contains(rf.Name)) continue;
140 
141  defaultStream.Position = 0; // reset for writing
142  Resolver.EncodeDefaultValue(defaultEncoder, rf.Schema, rf.DefaultValue);
143  defaultStream.Flush();
144  defaultStream.Position = 0; // reset for reading
145 
146  obj = rec.Get(rf.Pos);
147  rec.Put(rf.Pos, Read(obj, rf.Schema, rf.Schema, defaultDecoder));
148  }
149 
150  return rec;
151  }
152 
163  protected override object ReadFixed(object reuse, FixedSchema writerSchema, Schema readerSchema, Decoder d)
164  {
165  FixedSchema rs = readerSchema as FixedSchema;
166  if (rs.Size != writerSchema.Size)
167  {
168  throw new AvroException("Size mismatch between reader and writer fixed schemas. Writer: " + writerSchema +
169  ", reader: " + readerSchema);
170  }
171 
172  SpecificFixed fixedrec = (reuse != null ? reuse : ObjectCreator.Instance.New(rs.Fullname, Schema.Type.Fixed)) as SpecificFixed;
173  d.ReadFixed(fixedrec.Value);
174  return fixedrec;
175  }
176 
185  protected override object ReadEnum(object reuse, EnumSchema writerSchema, Schema readerSchema, Decoder dec)
186  {
187  EnumSchema rs = readerSchema as EnumSchema;
188  return rs.Ordinal(writerSchema[dec.ReadEnum()]);
189  }
190 
199  protected override object ReadArray(object reuse, ArraySchema writerSchema, Schema readerSchema, Decoder dec)
200  {
201  ArraySchema rs = readerSchema as ArraySchema;
202  System.Collections.IList array;
203  if (reuse != null)
204  {
205  array = reuse as System.Collections.IList;
206  if (array == null)
207  throw new AvroException("array object does not implement non-generic IList");
208 
209  array.Clear();
210  }
211  else
212  array = ObjectCreator.Instance.New(getTargetType(readerSchema), Schema.Type.Array) as System.Collections.IList;
213 
214  int i = 0;
215  for (int n = (int)dec.ReadArrayStart(); n != 0; n = (int)dec.ReadArrayNext())
216  {
217  for (int j = 0; j < n; j++, i++)
218  array.Add(Read(null, writerSchema.ItemSchema, rs.ItemSchema, dec));
219  }
220  return array;
221  }
222 
232  protected override object ReadMap(object reuse, MapSchema writerSchema, Schema readerSchema, Decoder d)
233  {
234  MapSchema rs = readerSchema as MapSchema;
235  System.Collections.IDictionary map;
236  if (reuse != null)
237  {
238  map = reuse as System.Collections.IDictionary;
239  if (map == null)
240  throw new AvroException("map object does not implement non-generic IList");
241 
242  map.Clear();
243  }
244  else
245  map = ObjectCreator.Instance.New(getTargetType(readerSchema), Schema.Type.Map) as System.Collections.IDictionary;
246 
247  for (int n = (int)d.ReadMapStart(); n != 0; n = (int)d.ReadMapNext())
248  {
249  for (int j = 0; j < n; j++)
250  {
251  string k = d.ReadString();
252  map[k] = Read(null, writerSchema.ValueSchema, rs.ValueSchema, d); // always create new map item
253  }
254  }
255  return map;
256  }
257 
264  protected virtual string getTargetType(Schema schema)
265  {
266  bool nEnum = false;
267  string type = Avro.CodeGen.getType(schema, false, ref nEnum);
268  if (schema.Tag == Schema.Type.Array)
269  {
270  type = type.Remove(0, 6); // remove IList<
271  type = type.Remove(type.Length - 1); // remove >
272  }
273  else if (schema.Tag == Schema.Type.Map)
274  {
275  type = type.Remove(0, 19); // remove IDictionary<string,
276  type = type.Remove(type.Length - 1); // remove >
277  }
278  return type;
279  }
280  }
281 }
virtual void Skip(Schema writerSchema, Decoder d)
Reader wrapper class for reading data and storing into specific classes
override object ReadRecord(object reuse, RecordSchema writerSchema, Schema readerSchema, Decoder dec)
Deserializes a record from the stream.
int ReadEnum()
Reads an enum AvroType
Class for record schemas
Definition: RecordSchema.cs:31
Schema Schema
Field type's schema
Definition: Field.cs:75
Class for fields defined in a record
Definition: Field.cs:30
SpecificDefaultReader(Schema writerSchema, Schema readerSchema)
Constructor
override object ReadEnum(object reuse, EnumSchema writerSchema, Schema readerSchema, Decoder dec)
Reads an enum from the given decoder
string ReadString()
Reads a string Avro type
Class for enum type schemas
Definition: EnumSchema.cs:28
Schema ValueSchema
Schema for map values type
Definition: MapSchema.cs:33
The default implementation for the generic reader.
int Pos
Position of the field within its record.
Definition: Field.cs:55
T Read(T reuse, Decoder dec)
Generic read function
Base class for all schema types
Definition: Schema.cs:29
override string Name
Name of the schema
Definition: NamedSchema.cs:40
readonly string Name
Name of the field.
Definition: Field.cs:45
Class for fixed schemas
Definition: FixedSchema.cs:28
Interface class for generated classes
Reader class for reading data and storing into specific classes
Type
Enum for schema types
Definition: Schema.cs:34
int Size
Fixed size for the bytes
Definition: FixedSchema.cs:33
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
int Ordinal(string symbol)
Returns the position of the given symbol within this enum.
Definition: EnumSchema.cs:116
long ReadArrayStart()
Starts reading the array Avro type.
Write leaf values.
long ReadArrayNext()
See ReadArrayStart().
object Read(object reuse, Schema writerSchema, Schema readerSchema, Decoder d)
Decoder is used to decode Avro data on a stream.
Definition: Decoder.cs:27
Base class for all generated classes
Class for array type schemas
Definition: ArraySchema.cs:27
SpecificReader(Schema writerSchema, Schema readerSchema)
Constructs a generic reader for the given schemas using the DefaultReader.
static void EncodeDefaultValue(Encoder enc, Schema schema, JToken jtok)
Reads the passed JToken default value field and writes it in the specified encoder
Definition: Resolver.cs:33
JToken DefaultValue
The default value for the field stored as JSON object, if defined.
Definition: Field.cs:65
Class for map schemas
Definition: MapSchema.cs:28
override object ReadArray(object reuse, ArraySchema writerSchema, Schema readerSchema, Decoder dec)
Reads an array from the given decoder
object New(string name, Schema.Type schemaType)
Creates new instance of the given type
void ReadFixed(byte[] buffer)
A convenience method for ReadFixed(buffer, 0, buffer.Length);
Schema(Type type, PropertyMap props)
Constructor for schema class
Definition: Schema.cs:67
virtual string getTargetType(Schema schema)
Gets the target type name in the given schema
static ObjectCreator Instance
long ReadMapNext()
See ReadMapStart().
override object ReadMap(object reuse, MapSchema writerSchema, Schema readerSchema, Decoder d)
Deserialized an avro map.
long ReadMapStart()
Starts reading the map Avro type.
Schema ItemSchema
Schema for the array 'type' attribute
Definition: ArraySchema.cs:32
string Fullname
Namespace.Name of the schema
Definition: NamedSchema.cs:56
Type Tag
Schema type property
Definition: Schema.cs:56
override object ReadFixed(object reuse, FixedSchema writerSchema, Schema readerSchema, Decoder d)
Deserializes a fixed object and returns the object.
Schema WriterSchema
Schema for the writer class
Schema ReaderSchema
Schema for the reader class
SpecificReader(SpecificDefaultReader reader)
Decoder for Avro binary format