Kinetica   C#   API  Version 7.2.3.0
GenericDatumReader.cs
Go to the documentation of this file.
1 
18 using System;
19 using System.Collections.Generic;
20 using Avro.IO;
21 
22 namespace Avro.Generic
23 {
27  {
28  public GenericDatumReader(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.String:
43  case Schema.Type.Null:
44  return false;
45  }
46  return true;
47  }
48 
49  protected override ArrayAccess GetArrayAccess(ArraySchema readerSchema)
50  {
51  return new GenericArrayAccess();
52  }
53 
54  protected override EnumAccess GetEnumAccess(EnumSchema readerSchema)
55  {
56  return new GenericEnumAccess(readerSchema);
57  }
58 
59  protected override MapAccess GetMapAccess(MapSchema readerSchema)
60  {
61  return new GenericMapAccess();
62  }
63 
64  protected override RecordAccess GetRecordAccess(RecordSchema readerSchema)
65  {
66  return new GenericRecordAccess(readerSchema);
67  }
68 
69  protected override FixedAccess GetFixedAccess(FixedSchema readerSchema)
70  {
71  return new GenericFixedAccess(readerSchema);
72  }
73 
74  class GenericEnumAccess : EnumAccess
75  {
76  private EnumSchema schema;
77 
78  public GenericEnumAccess(EnumSchema schema)
79  {
80  this.schema = schema;
81  }
82 
83  public object CreateEnum(object reuse, int ordinal)
84  {
85  if (reuse is GenericEnum)
86  {
87  var ge = (GenericEnum) reuse;
88  if (ge.Schema.Equals(this.schema))
89  {
90  ge.Value = this.schema[ordinal];
91  return ge;
92  }
93  }
94  return new GenericEnum(this.schema, this.schema[ordinal]);
95  }
96  }
97 
98  internal class GenericRecordAccess : RecordAccess
99  {
100  private RecordSchema schema;
101 
102  public GenericRecordAccess(RecordSchema schema)
103  {
104  this.schema = schema;
105  }
106 
107  public object CreateRecord(object reuse)
108  {
109  GenericRecord ru = (reuse == null || !(reuse is GenericRecord) || !(reuse as GenericRecord).Schema.Equals(this.schema)) ?
110  new GenericRecord(this.schema) :
111  reuse as GenericRecord;
112  return ru;
113  }
114 
115  public object GetField(object record, string fieldName, int fieldPos)
116  {
117  object result;
118  if(!((GenericRecord)record).TryGetValue(fieldName, out result))
119  {
120  return null;
121  }
122  return result;
123  }
124 
125  public void AddField(object record, string fieldName, int fieldPos, object fieldValue)
126  {
127  ((GenericRecord)record).Add(fieldName, fieldValue);
128  }
129  }
130 
131  class GenericFixedAccess : FixedAccess
132  {
133  private FixedSchema schema;
134 
135  public GenericFixedAccess(FixedSchema schema)
136  {
137  this.schema = schema;
138  }
139 
140  public object CreateFixed(object reuse)
141  {
142  return (reuse is GenericFixed && (reuse as GenericFixed).Schema.Equals(this.schema)) ?
143  reuse : new GenericFixed(this.schema);
144  }
145 
146  public byte[] GetFixedBuffer( object f )
147  {
148  return ((GenericFixed)f).Value;
149  }
150  }
151 
152  class GenericArrayAccess : ArrayAccess
153  {
154  public object Create(object reuse)
155  {
156  return (reuse is object[]) ? reuse : new object[0];
157  }
158 
159  public void EnsureSize(ref object array, int targetSize)
160  {
161  if (((object[])array).Length < targetSize)
162  SizeTo(ref array, targetSize);
163  }
164 
165  public void Resize(ref object array, int targetSize)
166  {
167  SizeTo(ref array, targetSize);
168  }
169 
170  public void AddElements( object arrayObj, int elements, int index, ReadItem itemReader, Decoder decoder, bool reuse )
171  {
172  var array = (object[]) arrayObj;
173  for (int i = index; i < index + elements; i++)
174  {
175  array[i] = reuse ? itemReader(array[i], decoder) : itemReader(null, decoder);
176  }
177  }
178 
179  private static void SizeTo(ref object array, int targetSize)
180  {
181  var o = (object[]) array;
182  Array.Resize(ref o, targetSize);
183  array = o;
184  }
185  }
186 
187  class GenericMapAccess : MapAccess
188  {
189  public object Create(object reuse)
190  {
191  if (reuse is IDictionary<string, object>)
192  {
193  var result = (IDictionary<string, object>)reuse;
194  result.Clear();
195  return result;
196  }
197  return new Dictionary<string, object>();
198  }
199 
200  public void AddElements(object mapObj, int elements, ReadItem itemReader, Decoder decoder, bool reuse)
201  {
202  var map = ((IDictionary<string, object>)mapObj);
203  for (int i = 0; i < elements; i++)
204  {
205  var key = decoder.ReadString();
206  map[key] = itemReader(null, decoder);
207  }
208  }
209  }
210  }
211 }
Class for record schemas
Definition: RecordSchema.cs:31
override bool IsReusable(Schema.Type tag)
Indicates if it's possible to reuse an object of the specified type.
PreresolvingDatumReader for reading data to GenericRecord classes or primitives.
string ReadString()
Reads a string Avro type
Class for enum type schemas
Definition: EnumSchema.cs:28
Base class for all schema types
Definition: Schema.cs:29
Class for fixed schemas
Definition: FixedSchema.cs:28
Type
Enum for schema types
Definition: Schema.cs:34
override EnumAccess GetEnumAccess(EnumSchema readerSchema)
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
override RecordAccess GetRecordAccess(RecordSchema readerSchema)
A general purpose reader of data from avro streams.
Decoder is used to decode Avro data on a stream.
Definition: Decoder.cs:27
override FixedAccess GetFixedAccess(FixedSchema readerSchema)
Class for array type schemas
Definition: ArraySchema.cs:27
override ArrayAccess GetArrayAccess(ArraySchema readerSchema)
Class for map schemas
Definition: MapSchema.cs:28
GenericDatumReader(Schema writerSchema, Schema readerSchema)
delegate object ReadItem(object reuse, Decoder dec)
override MapAccess GetMapAccess(MapSchema readerSchema)