Kinetica   C#   API  Version 7.2.3.0
SpecificDatumReader.cs
Go to the documentation of this file.
1 
18 using System.Collections;
19 using Avro.Generic;
20 using Avro.IO;
21 
22 namespace Avro.Specific
23 {
27  {
28  public SpecificDatumReader(Schema writerSchema, Schema readerSchema) : base(writerSchema, readerSchema)
29  {
30  }
31 
32  protected override bool IsReusable(Schema.Type tag)
33  {
34  switch (tag)
35  {
36  case Schema.Type.Double:
37  case Schema.Type.Boolean:
38  case Schema.Type.Int:
39  case Schema.Type.Long:
40  case Schema.Type.Float:
41  case Schema.Type.Bytes:
42  case Schema.Type.Enumeration:
43  case Schema.Type.String:
44  case Schema.Type.Null:
45  return false;
46  }
47  return true;
48  }
49 
50  protected override ArrayAccess GetArrayAccess(ArraySchema readerSchema)
51  {
52  return new SpecificArrayAccess(readerSchema);
53  }
54 
55  protected override EnumAccess GetEnumAccess(EnumSchema readerSchema)
56  {
57  return new SpecificEnumAccess();
58  }
59 
60  protected override MapAccess GetMapAccess(MapSchema readerSchema)
61  {
62  return new SpecificMapAccess(readerSchema);
63  }
64 
65  protected override RecordAccess GetRecordAccess(RecordSchema readerSchema)
66  {
67  if (readerSchema.Name == null)
68  {
69  // ipc support
70  return new GenericDatumReader<T>.GenericRecordAccess(readerSchema);
71  }
72  return new SpecificRecordAccess(readerSchema);
73  }
74 
75  protected override FixedAccess GetFixedAccess(FixedSchema readerSchema)
76  {
77  return new SpecificFixedAccess(readerSchema);
78  }
79 
80  private static ObjectCreator.CtorDelegate GetConstructor(string name, Schema.Type schemaType)
81  {
82  var creator = ObjectCreator.Instance;
83  return creator.GetConstructor(name, schemaType, creator.GetType(name, schemaType));
84  }
85 
86  private class SpecificEnumAccess : EnumAccess
87  {
88  public object CreateEnum(object reuse, int ordinal)
89  {
90  return ordinal;
91  }
92  }
93 
94  private class SpecificRecordAccess : RecordAccess
95  {
96  private ObjectCreator.CtorDelegate objCreator;
97 
98  public SpecificRecordAccess(RecordSchema readerSchema)
99  {
100  objCreator = GetConstructor(readerSchema.Fullname, Schema.Type.Record);
101  }
102 
103  public object CreateRecord(object reuse)
104  {
105  return reuse ?? objCreator();
106  }
107 
108  public object GetField(object record, string fieldName, int fieldPos)
109  {
110  return ((ISpecificRecord)record).Get(fieldPos);
111  }
112 
113  public void AddField(object record, string fieldName, int fieldPos, object fieldValue)
114  {
115  ((ISpecificRecord)record).Put(fieldPos, fieldValue);
116  }
117  }
118 
119  private class SpecificFixedAccess : FixedAccess
120  {
121  private ObjectCreator.CtorDelegate objCreator;
122 
123  public SpecificFixedAccess(FixedSchema readerSchema)
124  {
125  objCreator = GetConstructor(readerSchema.Fullname, Schema.Type.Fixed);
126  }
127 
128  public object CreateFixed(object reuse)
129  {
130  return reuse ?? objCreator();
131  }
132 
133  public byte[] GetFixedBuffer(object rec)
134  {
135  return ((SpecificFixed) rec).Value;
136  }
137  }
138 
139  private class SpecificArrayAccess : ArrayAccess
140  {
141  private ObjectCreator.CtorDelegate objCreator;
142 
143  public SpecificArrayAccess(ArraySchema readerSchema)
144  {
145  bool nEnum = false;
146  string type = Avro.CodeGen.getType(readerSchema, false, ref nEnum);
147  type = type.Remove(0, 6); // remove IList<
148  type = type.Remove(type.Length - 1); // remove >
149 
150  objCreator = GetConstructor(type, Schema.Type.Array);
151  }
152 
153  public object Create(object reuse)
154  {
155  IList array;
156 
157  if( reuse != null )
158  {
159  array = reuse as IList;
160  if( array == null )
161  throw new AvroException( "array object does not implement non-generic IList" );
162  // retaining existing behavior where array contents aren't reused
163  // TODO: try to reuse contents?
164  array.Clear();
165  }
166  else
167  array = objCreator() as IList;
168  return array;
169  }
170 
171  public void EnsureSize(ref object array, int targetSize)
172  {
173  // no action needed
174  }
175 
176  public void Resize(ref object array, int targetSize)
177  {
178  // no action needed
179  }
180 
181  public void AddElements( object array, int elements, int index, ReadItem itemReader, Decoder decoder, bool reuse )
182  {
183  var list = (IList)array;
184  for (int i=0; i < elements; i++)
185  {
186  list.Add( itemReader( null, decoder ) );
187  }
188  }
189  }
190 
191  private class SpecificMapAccess : MapAccess
192  {
193  private ObjectCreator.CtorDelegate objCreator;
194 
195  public SpecificMapAccess(MapSchema readerSchema)
196  {
197  bool nEnum = false;
198  string type = Avro.CodeGen.getType(readerSchema, false, ref nEnum);
199  type = type.Remove(0, 19); // remove IDictionary<string,
200  type = type.Remove(type.Length - 1); // remove >
201 
202  objCreator = GetConstructor(type, Schema.Type.Map);
203  }
204 
205  public object Create(object reuse)
206  {
207  IDictionary map;
208  if (reuse != null)
209  {
210  map = reuse as IDictionary;
211  if (map == null)
212  throw new AvroException("map object does not implement non-generic IList");
213 
214  map.Clear();
215  }
216  else
217  map = objCreator() as System.Collections.IDictionary;
218  return map;
219  }
220 
221  public void AddElements(object mapObj, int elements, ReadItem itemReader, Decoder decoder, bool reuse)
222  {
223  var map = ((IDictionary)mapObj);
224  for (int i = 0; i < elements; i++)
225  {
226  var key = decoder.ReadString();
227  map[key] = itemReader(null, decoder);
228  }
229  }
230  }
231  }
232 }
CtorDelegate GetConstructor(string name, Schema.Type schemaType, Type type)
Gets the default constructor for the specified type
Class for record schemas
Definition: RecordSchema.cs:31
PreresolvingDatumReader for reading data to GenericRecord classes or primitives.
Class for enum type schemas
Definition: EnumSchema.cs:28
Base class for all schema types
Definition: Schema.cs:29
SpecificDatumReader(Schema writerSchema, Schema readerSchema)
override string Name
Name of the schema
Definition: NamedSchema.cs:40
Class for fixed schemas
Definition: FixedSchema.cs:28
Type
Enum for schema types
Definition: Schema.cs:34
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
A general purpose reader of data from avro streams.
PreresolvingDatumReader for reading data to ISpecificRecord classes.
Decoder is used to decode Avro data on a stream.
Definition: Decoder.cs:27
override RecordAccess GetRecordAccess(RecordSchema readerSchema)
delegate object CtorDelegate()
Class for array type schemas
Definition: ArraySchema.cs:27
override bool IsReusable(Schema.Type tag)
Indicates if it's possible to reuse an object of the specified type.
override FixedAccess GetFixedAccess(FixedSchema readerSchema)
override MapAccess GetMapAccess(MapSchema readerSchema)
Class for map schemas
Definition: MapSchema.cs:28
static ObjectCreator Instance
delegate object ReadItem(object reuse, Decoder dec)
override ArrayAccess GetArrayAccess(ArraySchema readerSchema)
override EnumAccess GetEnumAccess(EnumSchema readerSchema)