in seatunnel-connectors-v2/connector-maxcompute/src/main/java/org/apache/seatunnel/connectors/seatunnel/maxcompute/util/MaxcomputeTypeMapper.java [215:295]
private static Object resolveObject2Maxcompute(Object field, TypeInfo typeInfo) {
if (field == null) {
return null;
}
switch (typeInfo.getOdpsType()) {
case ARRAY:
ArrayList<Object> origArray = new ArrayList<>();
Arrays.stream((Object[]) field).iterator().forEachRemaining(origArray::add);
switch (((ArrayTypeInfo) typeInfo).getElementTypeInfo().getOdpsType()) {
case STRING:
case BOOLEAN:
case INT:
case BIGINT:
case FLOAT:
case DOUBLE:
return origArray;
default:
throw new MaxcomputeConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
String.format(
"Maxcompute type not support this type [%s] now",
typeInfo.getTypeName()));
}
case MAP:
HashMap<Object, Object> dataMap = new HashMap<>();
TypeInfo keyTypeInfo = ((MapTypeInfo) typeInfo).getKeyTypeInfo();
TypeInfo valueTypeInfo = ((MapTypeInfo) typeInfo).getValueTypeInfo();
HashMap<Object, Object> origDataMap = (HashMap<Object, Object>) field;
origDataMap.forEach(
(key, value) ->
dataMap.put(
resolveObject2Maxcompute(key, keyTypeInfo),
resolveObject2Maxcompute(value, valueTypeInfo)));
return origDataMap;
case STRUCT:
Object[] fields = ((SeaTunnelRow) field).getFields();
List<TypeInfo> typeInfos = ((StructTypeInfo) typeInfo).getFieldTypeInfos();
ArrayList<Object> origStruct = new ArrayList<>();
for (int i = 0; i < fields.length; i++) {
origStruct.add(resolveObject2Maxcompute(fields[i], typeInfos.get(i)));
}
return new SimpleStruct((StructTypeInfo) typeInfo, origStruct);
case TINYINT:
case SMALLINT:
case INT:
case FLOAT:
case DOUBLE:
case BIGINT:
case BOOLEAN:
case DECIMAL:
case TIMESTAMP_NTZ:
case DATE:
return field;
case BINARY:
return new Binary((byte[]) field);
case VARCHAR:
return new Varchar((String) field);
case CHAR:
return new Char((String) field);
case STRING:
case JSON:
if (field instanceof byte[]) {
return new String((byte[]) field);
}
if (field instanceof Char) {
return rtrim(String.valueOf(field));
}
return String.valueOf(field);
case TIMESTAMP:
return Timestamp.valueOf((LocalDateTime) field);
case DATETIME:
return Date.from(
((LocalDateTime) field).atZone(ZoneId.systemDefault()).toInstant());
default:
throw new MaxcomputeConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
String.format(
"Maxcompute type not support this type [%s] now",
typeInfo.getTypeName()));
}
}