private void setStringByType()

in odps-sdk/odps-sdk-core/src/main/java/com/aliyun/odps/data/DefaultRecordReader.java [120:224]


  private void setStringByType(ArrayRecord ret, int idx, String st) throws ParseException {
    if (st == null) {
      ret.set(idx, null);
      return;
    }
    switch (ret.getColumns()[idx].getTypeInfo().getOdpsType()) {
      case BIGINT:
        ret.setBigint(idx, Long.valueOf(st));
        break;
      case DOUBLE:
        if ("nan".equals(st)) {
          ret.setDouble(idx, Double.NaN);
        } else if ("inf".equals(st)) {
          ret.setDouble(idx, Double.POSITIVE_INFINITY);
        } else if ("-inf".equals(st)) {
          ret.setDouble(idx, Double.NEGATIVE_INFINITY);
        } else {
          ret.setDouble(idx, Double.valueOf(st));
        }
        break;
      case BOOLEAN:
        ret.setBoolean(idx, Boolean.valueOf(st));
        break;
      case DATETIME:
        ret.setDatetime(idx, dateTimeFormat.parse(st));
        break;
      case STRING:
        ret.setString(idx, st);
        break;
      case DECIMAL:
        ret.setDecimal(idx, new BigDecimal(st));
        break;
      case MAP:
        // TODO: support MAP
        ret.set(idx, null);
        break;
      case ARRAY:
        // TODO: support ARRAY
        ret.set(idx, null);
        break;
      case VOID:
        ret.set(idx, null);
        break;
      case TINYINT:
        ret.set(idx, Byte.valueOf(st));
        break;
      case SMALLINT:
        ret.set(idx, Short.valueOf(st));
        break;
      case INT:
        ret.set(idx, Integer.valueOf(st));
        break;
      case FLOAT:
        ret.set(idx, Float.valueOf(st));
        break;
      case CHAR:
        ret.set(idx, new Char(st));
        break;
      case VARCHAR:
        ret.set(idx, new Varchar(st));
        break;
      case DATE:
        ret.setDate(idx, new java.sql.Date(dateFormat.parse(st).getTime()));
        break;
      case TIMESTAMP:
        String[] splits = st.split("\\.");
        if (splits.length > 2) {
          throw new ParseException("Invalid timestamp value", st.lastIndexOf("."));
        }
        java.sql.Timestamp timestamp =
            new java.sql.Timestamp(dateTimeFormat.parse(splits[0]).getTime());
        if (splits.length == 2 && !splits[1].isEmpty()) {
          String nanoValueStr = splits[1];
          // 9 is the max number of digits allowed for a nano value
          if (nanoValueStr.length() > 9) {
            nanoValueStr = nanoValueStr.substring(0, 9);
          } else if (nanoValueStr.length() < 9) {
            StringBuilder nanoValueStrBuilder = new StringBuilder();
            nanoValueStrBuilder.append(nanoValueStr);
            while (nanoValueStrBuilder.length() < 9) {
              nanoValueStrBuilder.append("0");
            }
            nanoValueStr = nanoValueStrBuilder.toString();
          }
          timestamp.setNanos(Integer.parseInt(nanoValueStr));
        }
        ret.setTimestamp(idx, timestamp);
        break;
      case BINARY:
        ret.set(idx, new Binary(st.getBytes()));
        break;
      case INTERVAL_DAY_TIME:
        ret.set(idx, null);
        break;
      case INTERVAL_YEAR_MONTH:
        ret.set(idx, null);
        break;
      case STRUCT:
        // TODO: support STRUCT
        ret.set(idx, null);
        break;
      default:
        throw new RuntimeException("Unsupported type " + ret.getColumns()[idx].getType());
    }
  }