def createColumnVectorAccessor()

in hologres-connector-spark-base/src/main/scala/com/alibaba/hologres/spark/source/copy/arrow/SparkArrowVectorAccessorUtil.scala [30:73]


  def createColumnVectorAccessor(vector: FieldVector, column: Column): AbstractArrowVectorAccessor = column.getType match {
    case Types.INTEGER =>
      new BaseArrowIntAccessor(vector.asInstanceOf[IntVector])
    case Types.BIGINT =>
      new BaseArrowBigIntAccessor(vector.asInstanceOf[BigIntVector])
    case Types.SMALLINT =>
      new BaseArrowSmallIntAccessor(vector.asInstanceOf[SmallIntVector])
    case Types.FLOAT | Types.REAL =>
      new BaseArrowFloat4Accessor(vector.asInstanceOf[Float4Vector])
    case Types.DOUBLE =>
      new BaseArrowFloat8Accessor(vector.asInstanceOf[Float8Vector])
    case Types.DECIMAL | Types.NUMERIC =>
      new SparkArrowDecimalAccessor(vector.asInstanceOf[DecimalVector], column.getScale)
    case Types.BOOLEAN | Types.BIT =>
      new BaseArrowUInt1Accessor(vector.asInstanceOf[UInt1Vector])
    case Types.CHAR =>
      new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector], column.getPrecision)
    case Types.VARCHAR =>
      new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector])
    case Types.BINARY | Types.VARBINARY =>
      new BaseArrowVarBinaryAccessor(vector.asInstanceOf[VarBinaryVector])
    case Types.TIMESTAMP | Types.TIME_WITH_TIMEZONE =>
      if (column.getTypeName == "timestamptz") new SparkArrowDateMilliAccessor(vector.asInstanceOf[DateMilliVector])
      else new SparkArrowTimeStampMicroAccessor(vector.asInstanceOf[TimeStampMicroVector])
    case Types.TIME =>
      if (column.getTypeName == "timetz") new BaseArrowFixedSizeBinaryAccessor(vector.asInstanceOf[FixedSizeBinaryVector])
      else new BaseArrowTimeMicroAccessor(vector.asInstanceOf[TimeMicroVector])
    case Types.DATE =>
      new SparkArrowDateDayAccessor(vector.asInstanceOf[DateDayVector])
    case Types.ARRAY =>
      val elementAccessor: AbstractArrowVectorAccessor =
        createArrayElementVectorAccessor(vector.asInstanceOf[ListVector].getDataVector, column.getArrayElementType);
      new SparkArrowArrayAccessor(vector.asInstanceOf[ListVector], column.getArrayElementType, elementAccessor)
    case Types.OTHER =>
      if (column.getTypeName == "jsonb") {
        throw new IllegalArgumentException(s"copy out with arrow format unsupported column type ${column.getTypeName} now.")
      } else if (column.getTypeName == "roaringbitmap") {
        new BaseArrowVarBinaryAccessor(vector.asInstanceOf[VarBinaryVector])
      } else {
        new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector])
      }
    case _ =>
      throw new IllegalArgumentException("Unsupported column type: " + column.getTypeName)
  }