/// <summary> /// Traverses the type hierarchy up until a type information factory can be found. /// </summary> /// <typeparam name="TOutput"></typeparam> /// <param name="typeHierarchy"></param> /// <param name="type">type for which a factory needs to be found</param> /// <returns>closest type information factory or null if there is no factory in the type hierarchy</returns> private static TypeInfoFactory <TOutput> GetClosestFactory <TOutput>(IList <Type> typeHierarchy, Type type) { TypeInfoFactory <TOutput> factory = null; while (factory == null && type.IsClass && type != typeof(object)) { typeHierarchy.Add(type); factory = GetTypeInfoFactory <TOutput>(type); type = type.BaseType; if (type == null) { break; } } return(factory); }
/// <summary> /// Returns the type information factory for a type using the factory registry or annotations. /// </summary> /// <typeparam name="TOutput"></typeparam> /// <param name="t"></param> /// <returns></returns> public static TypeInfoFactory <TOutput> GetTypeInfoFactory <TOutput>(Type t) { TypeInfoFactory <TOutput> factoryClass = null; if (RegisteredTypeInfoFactories.ContainsKey(t)) { factoryClass = RegisteredTypeInfoFactories[t] as TypeInfoFactory <TOutput>; } else { if (t.IsClass && typeof(ITypeInfo).IsAssignableFrom(t)) { if (Activator.CreateInstance(t) is ITypeInfo typeInfo) { factoryClass = typeInfo.Value <TOutput>(); } } } return(factoryClass); }
public static ObjectInspector createObjectInspector(int columnId, IList <OrcProto.Type> types) { OrcProto.Type type = types[columnId]; switch (type.Kind) { case OrcProto.Type.Types.Kind.FLOAT: return(PrimitiveObjectInspectorFactory.writableFloatObjectInspector); case OrcProto.Type.Types.Kind.DOUBLE: return(PrimitiveObjectInspectorFactory.writableDoubleObjectInspector); case OrcProto.Type.Types.Kind.BOOLEAN: return(PrimitiveObjectInspectorFactory.writableBooleanObjectInspector); case OrcProto.Type.Types.Kind.BYTE: return(PrimitiveObjectInspectorFactory.writableByteObjectInspector); case OrcProto.Type.Types.Kind.SHORT: return(PrimitiveObjectInspectorFactory.writableShortObjectInspector); case OrcProto.Type.Types.Kind.INT: return(PrimitiveObjectInspectorFactory.writableIntObjectInspector); case OrcProto.Type.Types.Kind.LONG: return(PrimitiveObjectInspectorFactory.writableLongObjectInspector); case OrcProto.Type.Types.Kind.BINARY: return(PrimitiveObjectInspectorFactory.writableBinaryObjectInspector); case OrcProto.Type.Types.Kind.STRING: return(PrimitiveObjectInspectorFactory.writableStringObjectInspector); case OrcProto.Type.Types.Kind.CHAR: if (!type.HasMaximumLength) { throw new NotSupportedException( "Illegal use of char type without length in ORC type definition."); } return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( TypeInfoFactory.getCharTypeInfo((int)type.MaximumLength))); case OrcProto.Type.Types.Kind.VARCHAR: if (!type.HasMaximumLength) { throw new NotSupportedException( "Illegal use of varchar type without length in ORC type definition."); } return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( TypeInfoFactory.getVarcharTypeInfo((int)type.MaximumLength))); case OrcProto.Type.Types.Kind.TIMESTAMP: return(PrimitiveObjectInspectorFactory.writableTimestampObjectInspector); case OrcProto.Type.Types.Kind.DATE: return(PrimitiveObjectInspectorFactory.writableDateObjectInspector); case OrcProto.Type.Types.Kind.DECIMAL: int precision = type.HasPrecision ? (int)type.Precision : HiveDecimal.SYSTEM_DEFAULT_PRECISION; int scale = type.HasScale ? (int)type.Scale : HiveDecimal.SYSTEM_DEFAULT_SCALE; return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( TypeInfoFactory.getDecimalTypeInfo(precision, scale))); case OrcProto.Type.Types.Kind.STRUCT: return(new OrcStructInspector(columnId, types)); case OrcProto.Type.Types.Kind.UNION: return(new OrcUnion.OrcUnionObjectInspector(columnId, types)); case OrcProto.Type.Types.Kind.MAP: return(new OrcMapObjectInspector(columnId, types)); case OrcProto.Type.Types.Kind.LIST: return(new OrcListObjectInspector(columnId, types)); default: throw new NotSupportedException("Unknown type " + type.Kind); } }