in seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/reader/OrcReadStrategy.java [242:353]
private SeaTunnelDataType<?> orcDataType2SeaTunnelDataType(
TypeDescription typeDescription, SeaTunnelDataType<?> configType) {
switch (typeDescription.getCategory()) {
case BOOLEAN:
return getFinalType(BasicType.BOOLEAN_TYPE, configType);
case INT:
return getFinalType(BasicType.INT_TYPE, configType);
case BYTE:
return getFinalType(BasicType.BYTE_TYPE, configType);
case SHORT:
return getFinalType(BasicType.SHORT_TYPE, configType);
case LONG:
return getFinalType(BasicType.LONG_TYPE, configType);
case FLOAT:
return getFinalType(BasicType.FLOAT_TYPE, configType);
case DOUBLE:
return getFinalType(BasicType.DOUBLE_TYPE, configType);
case BINARY:
return getFinalType(PrimitiveByteArrayType.INSTANCE, configType);
case STRING:
case VARCHAR:
case CHAR:
return getFinalType(BasicType.STRING_TYPE, configType);
case DATE:
return getFinalType(LocalTimeType.LOCAL_DATE_TYPE, configType);
case TIMESTAMP:
// Support only return time when the type is timestamps
if (configType != null && configType.getSqlType().equals(SqlType.TIME)) {
return LocalTimeType.LOCAL_TIME_TYPE;
}
return getFinalType(LocalTimeType.LOCAL_DATE_TIME_TYPE, configType);
case DECIMAL:
int precision = typeDescription.getPrecision();
int scale = typeDescription.getScale();
return getFinalType(new DecimalType(precision, scale), configType);
case LIST:
TypeDescription listType = typeDescription.getChildren().get(0);
SeaTunnelDataType<?> seaTunnelDataType =
orcDataType2SeaTunnelDataType(listType, null);
if (configType instanceof ArrayType) {
SeaTunnelDataType<?> elementType = ((ArrayType) configType).getElementType();
seaTunnelDataType = orcDataType2SeaTunnelDataType(listType, elementType);
}
switch (seaTunnelDataType.getSqlType()) {
case STRING:
return ArrayType.STRING_ARRAY_TYPE;
case BOOLEAN:
return ArrayType.BOOLEAN_ARRAY_TYPE;
case TINYINT:
return ArrayType.BYTE_ARRAY_TYPE;
case SMALLINT:
return ArrayType.SHORT_ARRAY_TYPE;
case INT:
return ArrayType.INT_ARRAY_TYPE;
case BIGINT:
return ArrayType.LONG_ARRAY_TYPE;
case FLOAT:
return ArrayType.FLOAT_ARRAY_TYPE;
case DOUBLE:
return ArrayType.DOUBLE_ARRAY_TYPE;
default:
String errorMsg =
String.format(
"SeaTunnel array type not supported this genericType [%s] yet",
seaTunnelDataType);
throw new FileConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE, errorMsg);
}
case MAP:
TypeDescription keyType = typeDescription.getChildren().get(0);
TypeDescription valueType = typeDescription.getChildren().get(1);
if (configType instanceof MapType) {
SeaTunnelDataType<?> keyDataType = ((MapType<?, ?>) configType).getKeyType();
SeaTunnelDataType<?> valueDataType =
((MapType<?, ?>) configType).getValueType();
keyDataType = orcDataType2SeaTunnelDataType(keyType, keyDataType);
valueDataType = orcDataType2SeaTunnelDataType(valueType, valueDataType);
return new MapType<>(keyDataType, valueDataType);
} else {
return new MapType<>(
orcDataType2SeaTunnelDataType(keyType, null),
orcDataType2SeaTunnelDataType(valueType, null));
}
case STRUCT:
List<TypeDescription> children = typeDescription.getChildren();
String[] fieldNames = typeDescription.getFieldNames().toArray(TYPE_ARRAY_STRING);
SeaTunnelDataType<?>[] fieldTypes = new SeaTunnelDataType[children.size()];
if (configType instanceof SeaTunnelRowType) {
for (int i = 0; i < children.size(); i++) {
fieldTypes[i] =
orcDataType2SeaTunnelDataType(
children.get(i),
((SeaTunnelRowType) configType).getFieldType(i));
}
} else {
fieldTypes =
children.stream()
.map(f -> orcDataType2SeaTunnelDataType(f, null))
.toArray(SeaTunnelDataType<?>[]::new);
}
return new SeaTunnelRowType(fieldNames, fieldTypes);
default:
// do nothing
// never get in there
String errorMsg =
String.format(
"SeaTunnel file connector not supported this orc type [%s] yet",
typeDescription.getCategory());
throw new FileConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE, errorMsg);
}
}