private void decodeArrayString(
      int index, Type field, Group pqGroup, String arrayString, char delim) throws IOException {
    //		for parquet, we only have one-dimention array
    //		anotation support: decimal, time, timestamp
    String[] splits = FormatHandlerUtil.getArraySplits(arrayString.toCharArray(), delim);

    for (String elementString : splits) {
      switch (field.asPrimitiveType().getPrimitiveTypeName()) {
        case BOOLEAN:
          pqGroup.add(index, Boolean.parseBoolean(elementString));
          break;

        case INT32:
          if (columnSchemas.get(index).getType() == GPDBWritable.DATE) {
            pqGroup.add(
                index,
                (int)
                    FormatHandlerUtil.getTimeDiff(
                        elementString, "1970-01-01", "yyyy-mm-dd", 24 * 60 * 60 * 1000));
          } else if (columnSchemas.get(index).getType() == GPDBWritable.TIME) {
            pqGroup.add(
                index,
                (int) FormatHandlerUtil.getTimeDiff(elementString, "00:00:00", "mm:hh:ss", 1));
          } else {
            pqGroup.add(index, Integer.parseInt(elementString));
          }
          break;

        case INT64:
          if (columnSchemas.get(index).getType() == GPDBWritable.TIMESTAMP) {
            pqGroup.add(
                index,
                FormatHandlerUtil.getTimeDiff(
                    elementString, "1970-01-01 00:00:00", "yyyy-mm-dd mm:hh:ss", 1));
          } else {
            pqGroup.add(index, Long.parseLong(elementString));
          }
          break;

        case FLOAT:
          pqGroup.add(index, Float.parseFloat(elementString));
          break;

        case DOUBLE:
          pqGroup.add(index, Double.parseDouble(elementString));
          break;

        case INT96:
        case BINARY:
        case FIXED_LEN_BYTE_ARRAY:
          OriginalType type = field.getOriginalType();
          if (type == OriginalType.UTF8 || type == OriginalType.JSON) {
            pqGroup.add(index, elementString);
          } else if (type == OriginalType.DECIMAL) {
            pqGroup.add(index, Binary.fromByteArray(elementString.getBytes()));
          } else if (type == OriginalType.INTERVAL) {
            pqGroup.add(
                index, Binary.fromByteArray(FormatHandlerUtil.getParquetInterval(elementString)));
          } else {
            pqGroup.add(
                index,
                Binary.fromByteArray(FormatHandlerUtil.octString2byteArray(elementString).array()));
          }
          break;

        default:
          throw new IOException(
              "internal error, you should not be here, pqtype:"
                  + field.asPrimitiveType().getPrimitiveTypeName());
      }
    }
  }
  private void fillElement(int index, int colType, Group pqGroup, GPDBWritable gw, Type field)
      throws IOException {
    switch (colType) {
      case GPDBWritable.BPCHAR:
      case GPDBWritable.CHAR:
      case GPDBWritable.DATE:
      case GPDBWritable.NUMERIC:
      case GPDBWritable.TIME:
      case GPDBWritable.TIMESTAMP:
      case GPDBWritable.VARCHAR:
      case GPDBWritable.TEXT:
        //				utf8 or array
        if (field.getRepetition() == Repetition.REPEATED) {
          decodeArrayString(
              index, field, pqGroup, gw.getString(index), columnSchemas.get(index).getDelim());
        } else {
          int gpdbType = columnSchemas.get(index).getType();
          PrimitiveTypeName priType = field.asPrimitiveType().getPrimitiveTypeName();
          OriginalType originalType = field.getOriginalType();

          if (gpdbType == GPDBWritable.NUMERIC && priType == PrimitiveTypeName.INT32) {
            pqGroup.add(index, Integer.parseInt(gw.getString(index)));
          } else if (gpdbType == GPDBWritable.NUMERIC && priType == PrimitiveTypeName.INT64) {
            pqGroup.add(index, Long.parseLong(gw.getString(index)));
          } else if (gpdbType == GPDBWritable.DATE && priType == PrimitiveTypeName.INT32) {
            pqGroup.add(
                index,
                (int)
                    FormatHandlerUtil.getTimeDiff(
                        gw.getString(index), "1970-01-01", "yyyy-mm-dd", 24 * 60 * 60 * 1000));
          } else if (gpdbType == GPDBWritable.TIME && priType == PrimitiveTypeName.INT32) {
            pqGroup.add(
                index,
                (int)
                    FormatHandlerUtil.getTimeDiff(gw.getString(index), "00:00:00", "mm:hh:ss", 1));
          } else if (gpdbType == GPDBWritable.TIMESTAMP && priType == PrimitiveTypeName.INT64) {
            pqGroup.add(
                index,
                FormatHandlerUtil.getTimeDiff(
                    gw.getString(index), "1970-01-01 00:00:00", "yyyy-mm-dd mm:hh:ss", 1));
          } else if (gpdbType == GPDBWritable.INTERVAL && originalType == OriginalType.INTERVAL) {
            //						interval is complex, we just use string, for now, we just support 'postgres'
            // style interval
            //						1 year 2 mons -3 days +04:05:06.00901
            byte[] interval = FormatHandlerUtil.getParquetInterval(gw.getString(index));
            pqGroup.add(index, Binary.fromByteArray(interval));
          } else {
            pqGroup.add(index, gw.getString(index));
          }
        }
        break;

      case GPDBWritable.BYTEA:
        pqGroup.add(index, Binary.fromByteArray(gw.getBytes(index)));
        break;

      case GPDBWritable.REAL:
        pqGroup.add(index, gw.getFloat(index));
        break;

      case GPDBWritable.BIGINT:
        pqGroup.add(index, gw.getLong(index));
        break;

      case GPDBWritable.BOOLEAN:
        pqGroup.add(index, gw.getBoolean(index));
        break;

      case GPDBWritable.FLOAT8:
        pqGroup.add(index, gw.getDouble(index));
        break;

      case GPDBWritable.INTEGER:
        pqGroup.add(index, gw.getInt(index));
        break;

      case GPDBWritable.SMALLINT:
        pqGroup.add(index, gw.getShort(index));
        break;

      default:
        throw new IOException("internal error, not support type, typeId:" + colType);
    }
  }