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);
            }
        }
        static public ObjectInspector createObjectInspector(TypeInfo info)
        {
            switch (info.getCategory())
            {
            case ObjectInspectorCategory.PRIMITIVE:
                switch (((PrimitiveTypeInfo)info).getPrimitiveCategory())
                {
                case PrimitiveCategory.FLOAT:
                    return(PrimitiveObjectInspectorFactory.writableFloatObjectInspector);

                case PrimitiveCategory.DOUBLE:
                    return(PrimitiveObjectInspectorFactory.writableDoubleObjectInspector);

                case PrimitiveCategory.BOOLEAN:
                    return(PrimitiveObjectInspectorFactory.writableBooleanObjectInspector);

                case PrimitiveCategory.BYTE:
                    return(PrimitiveObjectInspectorFactory.writableByteObjectInspector);

                case PrimitiveCategory.SHORT:
                    return(PrimitiveObjectInspectorFactory.writableShortObjectInspector);

                case PrimitiveCategory.INT:
                    return(PrimitiveObjectInspectorFactory.writableIntObjectInspector);

                case PrimitiveCategory.LONG:
                    return(PrimitiveObjectInspectorFactory.writableLongObjectInspector);

                case PrimitiveCategory.BINARY:
                    return(PrimitiveObjectInspectorFactory.writableBinaryObjectInspector);

                case PrimitiveCategory.STRING:
                    return(PrimitiveObjectInspectorFactory.writableStringObjectInspector);

                case PrimitiveCategory.CHAR:
                    return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
                               (PrimitiveTypeInfo)info));

                case PrimitiveCategory.VARCHAR:
                    return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
                               (PrimitiveTypeInfo)info));

                case PrimitiveCategory.TIMESTAMP:
                    return(PrimitiveObjectInspectorFactory.writableTimestampObjectInspector);

                case PrimitiveCategory.DATE:
                    return(PrimitiveObjectInspectorFactory.writableDateObjectInspector);

                case PrimitiveCategory.DECIMAL:
                    return(PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
                               (PrimitiveTypeInfo)info));

                default:
                    throw new ArgumentException("Unknown primitive type " +
                                                ((PrimitiveTypeInfo)info).getPrimitiveCategory());
                }

            case ObjectInspectorCategory.STRUCT:
                return(new OrcStructInspector((StructTypeInfo)info));

            case ObjectInspectorCategory.UNION:
                return(new OrcUnion.OrcUnionObjectInspector((UnionTypeInfo)info));

            case ObjectInspectorCategory.MAP:
                return(new OrcMapObjectInspector((MapTypeInfo)info));

            case ObjectInspectorCategory.LIST:
                return(new OrcListObjectInspector((ListTypeInfo)info));

            default:
                throw new ArgumentException("Unknown type " +
                                            info.getCategory());
            }
        }