in seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/SystemFunction.java [93:205]
public static Object castAs(List<Object> args) {
Object v1 = args.get(0);
String v2 = (String) args.get(1);
if (v1 == null) {
return null;
}
if (v1.equals(v2)) {
return null;
}
switch (v2) {
case "VARCHAR":
case "STRING":
return v1.toString();
case "INT":
case "INTEGER":
return Integer.parseInt(v1.toString());
case "BIGINT":
case "LONG":
return Long.parseLong(v1.toString());
case "BYTE":
return Byte.parseByte(v1.toString());
case "BYTES":
case "BINARY":
return v1.toString().getBytes(StandardCharsets.UTF_8);
case "DOUBLE":
return Double.parseDouble(v1.toString());
case "FLOAT":
return Float.parseFloat(v1.toString());
case "TIMESTAMP":
case "DATETIME":
if (v1 instanceof LocalDateTime) {
return v1;
}
if (v1 instanceof LocalDate) {
return LocalDateTime.of((LocalDate) v1, LocalTime.of(0, 0, 0));
}
if (v1 instanceof LocalTime) {
return LocalDateTime.of(LocalDate.now(), (LocalTime) v1);
}
if (v1 instanceof Long) {
Instant instant = Instant.ofEpochMilli(((Long) v1).longValue());
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS type: %s", v2));
case "DATE":
if (v1 instanceof LocalDateTime) {
return ((LocalDateTime) v1).toLocalDate();
}
if (v1 instanceof LocalDate) {
return v1;
}
if (v1 instanceof Integer) {
int dateValue = ((Integer) v1).intValue();
int year = dateValue / 10000;
int month = (dateValue / 100) % 100;
int day = dateValue % 100;
return LocalDate.of(year, month, day);
}
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS type: %s", v2));
case "TIME":
if (v1 instanceof LocalDateTime) {
return ((LocalDateTime) v1).toLocalTime();
}
if (v1 instanceof LocalDate) {
return LocalTime.of(0, 0, 0);
}
if (v1 instanceof LocalTime) {
return v1;
}
if (v1 instanceof Integer) {
int intTime = ((Integer) v1).intValue();
int hour = intTime / 10000;
int minute = (intTime / 100) % 100;
int second = intTime % 100;
return LocalTime.of(hour, minute, second);
}
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS type: %s", v2));
case "DECIMAL":
BigDecimal bigDecimal = new BigDecimal(v1.toString());
Integer scale = (Integer) args.get(3);
return bigDecimal.setScale(scale, RoundingMode.CEILING);
case "BOOLEAN":
if (v1 instanceof Number) {
if (Arrays.asList(1, 0).contains(((Number) v1).intValue())) {
return ((Number) v1).intValue() == 1;
} else {
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS Boolean: %s", v1));
}
} else if (v1 instanceof String) {
if (Arrays.asList("TRUE", "FALSE").contains(v1.toString().toUpperCase())) {
return Boolean.parseBoolean(v1.toString());
} else {
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS Boolean: %s", v1));
}
} else if (v1 instanceof Boolean) {
return v1;
}
}
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported CAST AS type: %s", v2));
}