Kinetica   C#   API  Version 7.2.3.0
SpecificDatumWriter.cs
Go to the documentation of this file.
1 
18 using System;
19 using System.Collections;
20 using Avro.Generic;
22 
23 namespace Avro.Specific
24 {
30  {
31  public SpecificDatumWriter(Schema schema) : base(schema, new SpecificArrayAccess(), new DictionaryMapAccess())
32  {
33  }
34 
35  protected override void WriteRecordFields(object recordObj, RecordFieldWriter[] writers, Encoder encoder)
36  {
37  var record = (ISpecificRecord) recordObj;
38  for (int i = 0; i < writers.Length; i++)
39  {
40  var writer = writers[i];
41  writer.WriteField(record.Get(writer.Field.Pos), encoder);
42  }
43  }
44 
45  protected override void EnsureRecordObject(RecordSchema recordSchema, object value)
46  {
47  if (!(value is ISpecificRecord))
48  throw new AvroTypeException("Record object is not derived from ISpecificRecord");
49  }
50 
51  protected override void WriteField(object record, string fieldName, int fieldPos, WriteItem writer, Encoder encoder)
52  {
53  writer(((ISpecificRecord)record).Get(fieldPos), encoder);
54  }
55 
56  protected override WriteItem ResolveEnum(EnumSchema es)
57  {
58  var type = ObjectCreator.Instance.GetType(es);
59 
60  var enumNames = Enum.GetNames(type);
61  var translator = new int[enumNames.Length];
62  for(int i = 0; i < enumNames.Length; i++)
63  {
64  if(es.Contains(enumNames[i]))
65  {
66  translator[i] = es.Ordinal(enumNames[i]);
67  }
68  else
69  {
70  translator[i] = -1;
71  }
72  }
73 
74  return (v,e) =>
75  {
76  if(v == null)
77  throw new AvroTypeException("value is null in SpecificDefaultWriter.WriteEnum");
78  if(v.GetType() == type)
79  {
80  int translated = translator[(int)v];
81  if (translated == -1)
82  {
83  throw new AvroTypeException("Unknown enum value:" + v.ToString());
84  }
85  else
86  {
87  e.WriteEnum(translated);
88  }
89  }
90  else
91  {
92  e.WriteEnum(es.Ordinal(v.ToString()));
93  }
94  };
95  }
96 
97  protected override void WriteFixed(FixedSchema schema, object value, Encoder encoder)
98  {
99  var fixedrec = value as SpecificFixed;
100  if (fixedrec == null)
101  throw new AvroTypeException("Fixed object is not derived from SpecificFixed");
102 
103  encoder.WriteFixed(fixedrec.Value);
104  }
105 
106  protected override bool UnionBranchMatches( Schema sc, object obj )
107  {
108  if (obj == null && sc.Tag != Avro.Schema.Type.Null) return false;
109  switch (sc.Tag)
110  {
111  case Schema.Type.Null:
112  return obj == null;
113  case Schema.Type.Boolean:
114  return obj is bool;
115  case Schema.Type.Int:
116  return obj is int;
117  case Schema.Type.Long:
118  return obj is long;
119  case Schema.Type.Float:
120  return obj is float;
121  case Schema.Type.Double:
122  return obj is double;
123  case Schema.Type.Bytes:
124  return obj is byte[];
125  case Schema.Type.String:
126  return obj is string;
127  case Schema.Type.Error:
128  case Schema.Type.Record:
129  return obj is ISpecificRecord &&
130  (((obj as ISpecificRecord).Schema) as RecordSchema).SchemaName.Equals((sc as RecordSchema).SchemaName);
131  case Schema.Type.Enumeration:
132  return obj.GetType().IsEnum && (sc as EnumSchema).Symbols.Contains(obj.ToString());
133  case Schema.Type.Array:
134  return obj is System.Collections.IList;
135  case Schema.Type.Map:
136  return obj is System.Collections.IDictionary;
137  case Schema.Type.Union:
138  return false; // Union directly within another union not allowed!
139  case Schema.Type.Fixed:
140  return obj is SpecificFixed &&
141  (((obj as SpecificFixed).Schema) as FixedSchema).SchemaName.Equals((sc as FixedSchema).SchemaName);
142  default:
143  throw new AvroException("Unknown schema type: " + sc.Tag);
144  }
145  }
146 
147  class SpecificArrayAccess : ArrayAccess
148  {
149  public void EnsureArrayObject( object value )
150  {
151  if( !( value is System.Collections.IList ) )
152  {
153  throw new AvroTypeException( "Array does not implement non-generic IList" );
154  }
155  }
156 
157  public long GetArrayLength(object value)
158  {
159  return ((IList)value).Count;
160  }
161 
162  public void WriteArrayValues(object array, WriteItem valueWriter, Encoder encoder)
163  {
164  var list = (IList) array;
165  for (int i = 0; i < list.Count; i++ )
166  {
167  valueWriter(list[i], encoder);
168  }
169  }
170  }
171  }
172 }
override void WriteRecordFields(object recordObj, RecordFieldWriter[] writers, Encoder encoder)
Class for record schemas
Definition: RecordSchema.cs:31
override void WriteField(object record, string fieldName, int fieldPos, WriteItem writer, Encoder encoder)
Extracts the field value from the given object.
Class for enum type schemas
Definition: EnumSchema.cs:28
Base class for all schema types
Definition: Schema.cs:29
override void WriteFixed(FixedSchema schema, object value, Encoder encoder)
Serialized a fixed object.
bool Contains(string symbol)
Checks if given symbol is in the list of enum symbols
Definition: EnumSchema.cs:142
Avro.IO.Encoder Encoder
Class for fixed schemas
Definition: FixedSchema.cs:28
Interface class for generated classes
Type
Enum for schema types
Definition: Schema.cs:34
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
Class to store schema name, namespace and enclosing namespace
Definition: SchemaName.cs:27
Base class for all generated classes
PreresolvingDatumWriter for writing data from ISpecificRecord classes.
override bool Equals(Object obj)
Compares two schema names
Definition: SchemaName.cs:114
Type GetType(Schema schema)
Gets the type for the specified schema
override WriteItem ResolveEnum(EnumSchema es)
Serializes an enumeration.
static ObjectCreator Instance
A general purpose writer of data from avro streams.
Type Tag
Schema type property
Definition: Schema.cs:56
delegate void WriteItem(Object value, Encoder encoder)
override void EnsureRecordObject(RecordSchema recordSchema, object value)
override bool UnionBranchMatches(Schema sc, object obj)