public static Type PropertyType( Schema fieldSchema, Property property) { var desc = AvroFieldUtil.FieldForProperty(fieldSchema, property); if (desc == null) { return null; } if (desc.IsDynamic) { return typeof(object); } Schema typeSchema = desc.Field.Schema; if (desc.IsAccessedByIndex) { if (desc.Field.Schema is ArraySchema arraySchema) { typeSchema = arraySchema.ItemSchema; } else if (desc.Field.Schema is PrimitiveSchema primitiveSchema) { // Only happens for strings return typeof(char); } } else if (desc.IsAccessedByKey) { typeSchema = desc.Field.Schema.AsMapSchema().ValueSchema; } return AvroTypeUtil.PropertyType(typeSchema); }
public static Type PropertyType(Schema fieldSchema, Property property) { var desc = AvroFieldUtil.FieldForProperty(fieldSchema, property); if (desc == null) { return(null); } if (desc.IsDynamic) { return(typeof(Object)); } Schema typeSchema = desc.Field.Schema; if (desc.IsAccessedByIndex) { if (desc.Field.Schema.Tag == Schema.Type.Array) { typeSchema = desc.Field.Schema.GetElementType(); } else if (desc.Field.Schema.Tag == Schema.Type.String) { return(typeof(char)); } } else if (desc.IsAccessedByKey) { typeSchema = desc.Field.Schema.GetValueType(); } return(AvroTypeUtil.PropertyType(typeSchema)); }
private void Init() { _propertyNames = new string[_avroSchema.GetFields().Count]; _propertyDescriptors = new EventPropertyDescriptor[_propertyNames.Length]; int fieldNum = 0; foreach (Field field in _avroSchema.GetFields()) { _propertyNames[fieldNum] = field.Name; Type propertyType = AvroTypeUtil.PropertyType(field.Schema); Type componentType = null; bool indexed = false; bool mapped = false; FragmentEventType fragmentEventType = null; if (field.Schema.Tag == global::Avro.Schema.Type.Array) { componentType = AvroTypeUtil.PropertyType(field.Schema.GetElementType()); indexed = true; if (field.Schema.GetElementType().Tag == global::Avro.Schema.Type.Record) { fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField(field.Schema, _eventAdapterService); } } else if (field.Schema.Tag == global::Avro.Schema.Type.Map) { mapped = true; componentType = AvroTypeUtil.PropertyType(field.Schema.GetValueType()); } else if (field.Schema.Tag == global::Avro.Schema.Type.String) { indexed = true; componentType = typeof(char); fragmentEventType = null; } else { fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField(field.Schema, _eventAdapterService); } var getter = new AvroEventBeanGetterSimple( field, fragmentEventType == null ? null : fragmentEventType.FragmentType, _eventAdapterService); var descriptor = new EventPropertyDescriptor( field.Name, propertyType, componentType, false, false, indexed, mapped, fragmentEventType != null); var item = new PropertySetDescriptorItem(descriptor, propertyType, getter, fragmentEventType); _propertyItems.Put(field.Name, item); _propertyDescriptors[fieldNum] = descriptor; fieldNum++; } }
private static EventPropertyGetterSPI PropertyGetterNested( GetterNestedFactory factory, Schema fieldSchema, Property property, string moduleName, EventBeanTypedEventFactory eventAdapterService, EventTypeAvroHandler eventTypeAvroHandler, AvroEventTypeFragmentTypeCache fragmentTypeCache) { if (property is SimpleProperty) { Field fieldNested = fieldSchema.GetField(property.PropertyNameAtomic); if (fieldNested == null) { return null; } var fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( fieldNested.Schema, moduleName, eventAdapterService, eventTypeAvroHandler, fragmentTypeCache); return factory.MakeSimple( fieldNested, fragmentEventType?.FragmentType, AvroTypeUtil.PropertyType(fieldNested.Schema)); } if (property is IndexedProperty indexedProperty) { var fieldNested = fieldSchema.GetField(indexedProperty.PropertyNameAtomic); if (fieldNested == null) { return null; } if ((fieldNested.Schema.Tag != Schema.Type.Array) && (fieldNested.Schema.Tag != Schema.Type.String)) { return null; } var fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( fieldNested.Schema, moduleName, eventAdapterService, eventTypeAvroHandler, fragmentTypeCache); return factory.MakeIndexed(fieldNested, indexedProperty.Index, fragmentEventType?.FragmentType); } if (property is MappedProperty mappedProperty) { Field fieldNested = fieldSchema.GetField(mappedProperty.PropertyNameAtomic); if (fieldNested == null || fieldNested.Schema.Tag != Schema.Type.Map) { return null; } return factory.MakeMapped(fieldNested, mappedProperty.Key); } if (property is DynamicProperty) { if (property is DynamicSimpleProperty) { return factory.MakeDynamicSimple(property.PropertyNameAtomic); } throw new NotSupportedException(); } var nested = (NestedProperty) property; var allSimple = true; foreach (var levelProperty in nested.Properties) { if (!(levelProperty is SimpleProperty)) { allSimple = false; break; } } if (allSimple) { var currentSchema = fieldSchema; var count = 0; var path = new Field[nested.Properties.Count]; var types = new Type[nested.Properties.Count]; foreach (var levelProperty in nested.Properties) { if (currentSchema.Tag != Schema.Type.Record) { return null; } Field fieldNested = currentSchema.GetField(levelProperty.PropertyNameAtomic); if (fieldNested == null) { return null; } currentSchema = fieldNested.Schema; path[count] = fieldNested; types[count] = AvroTypeUtil.PropertyType(currentSchema); count++; } var fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( currentSchema, moduleName, eventAdapterService, eventTypeAvroHandler, fragmentTypeCache); return factory.MakeNestedSimpleMultiLevel(path, types, fragmentEventType?.FragmentType); } var getters = new AvroEventPropertyGetter[nested.Properties.Count]; var countX = 0; var currentSchemaX = fieldSchema; foreach (var levelProperty in nested.Properties) { if (currentSchemaX == null) { return null; } if (levelProperty is SimpleProperty) { Field fieldNested = currentSchemaX.GetField(levelProperty.PropertyNameAtomic); if (fieldNested == null) { return null; } var fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( fieldNested.Schema, moduleName, eventAdapterService, eventTypeAvroHandler, fragmentTypeCache); var propertyType = AvroTypeUtil.PropertyType(fieldNested.Schema); getters[countX] = new AvroEventBeanGetterSimple( fieldNested, fragmentEventType?.FragmentType, eventAdapterService, propertyType); currentSchemaX = fieldNested.Schema; } else if (levelProperty is IndexedProperty indexed) { var fieldIndexed = currentSchemaX.GetField(indexed.PropertyNameAtomic); if (fieldIndexed == null) { return null; } if ((fieldIndexed.Schema.Tag != Schema.Type.Array) && (fieldIndexed.Schema.Tag != Schema.Type.String)) { return null; } var fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( fieldIndexed.Schema, moduleName, eventAdapterService, eventTypeAvroHandler, fragmentTypeCache); getters[countX] = new AvroEventBeanGetterIndexed( fieldIndexed, indexed.Index, fragmentEventType?.FragmentType, eventAdapterService); currentSchemaX = fieldIndexed.Schema.AsArraySchema().ItemSchema; } else if (levelProperty is MappedProperty mapped) { Field fieldMapped = currentSchemaX.GetField(mapped.PropertyNameAtomic); if (fieldMapped == null || fieldMapped.Schema.Tag != Schema.Type.Map) { return null; } getters[countX] = new AvroEventBeanGetterMapped(fieldMapped, mapped.Key); currentSchemaX = fieldMapped.Schema; } else if (levelProperty is DynamicSimpleProperty) { if (currentSchemaX.Tag != Schema.Type.Record) { return null; } Field fieldDynamic = currentSchemaX.GetField(levelProperty.PropertyNameAtomic); getters[countX] = new AvroEventBeanGetterSimpleDynamic(levelProperty.PropertyNameAtomic); if (fieldDynamic.Schema.Tag == Schema.Type.Record) { currentSchemaX = fieldDynamic.Schema; } else if (fieldDynamic.Schema.Tag == Schema.Type.Union) { currentSchemaX = AvroSchemaUtil.FindUnionRecordSchemaSingle(fieldDynamic.Schema); } } else { throw new NotSupportedException(); } countX++; } return factory.MakeNestedPolyMultiLevel(getters); }
private void Init() { var avroFields = _avroSchema.GetFields(); _propertyNames = new string[avroFields.Count]; _propertyDescriptors = new EventPropertyDescriptor[_propertyNames.Length]; var fieldNum = 0; foreach (var field in avroFields) { _propertyNames[fieldNum] = field.Name; var propertyType = AvroTypeUtil.PropertyType(field.Schema).GetBoxedType(); Type componentType = null; var indexed = false; var mapped = false; FragmentEventType fragmentEventType = null; if (field.Schema.Tag == global::Avro.Schema.Type.Array) { componentType = AvroTypeUtil.PropertyType(field.Schema.AsArraySchema().ItemSchema); indexed = true; if (field.Schema.AsArraySchema().ItemSchema.Tag == global::Avro.Schema.Type.Record) { fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( field.Schema, Metadata.ModuleName, _eventBeanTypedEventFactory, _eventTypeAvroHandler, _fragmentTypeCache); } } else if (field.Schema.Tag == global::Avro.Schema.Type.Map) { mapped = true; componentType = AvroTypeUtil.PropertyType(field.Schema.AsMapSchema().ValueSchema); } else if (field.Schema.Tag == global::Avro.Schema.Type.String) { componentType = typeof(char); indexed = true; } else { fragmentEventType = AvroFragmentTypeUtil.GetFragmentEventTypeForField( field.Schema, Metadata.ModuleName, _eventBeanTypedEventFactory, _eventTypeAvroHandler, _fragmentTypeCache); } var getter = new AvroEventBeanGetterSimple( field, fragmentEventType?.FragmentType, _eventBeanTypedEventFactory, propertyType); var descriptor = new EventPropertyDescriptor( field.Name, propertyType, componentType, false, false, indexed, mapped, fragmentEventType != null); var item = new PropertySetDescriptorItem(descriptor, propertyType, getter, fragmentEventType); _propertyItems.Put(field.Name, item); _propertyDescriptors[fieldNum] = descriptor; fieldNum++; } }