示例#1
0
        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);
        }
示例#2
0
        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));
        }
示例#3
0
        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++;
            }
        }
示例#4
0
        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);
        }
示例#5
0
        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++;
            }
        }