in sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/schema/BeamTableUtils.java [109:178]
public static Object autoCastField(Schema.Field field, Object rawObj) {
if (rawObj == null) {
if (!field.getType().getNullable()) {
throw new IllegalArgumentException(String.format("Field %s not nullable", field.getName()));
}
return null;
}
FieldType type = field.getType();
if (CalciteUtils.isStringType(type)) {
if (rawObj instanceof NlsString) {
return ((NlsString) rawObj).getValue();
} else {
return rawObj;
}
} else if (CalciteUtils.DATE.typesEqual(type) || CalciteUtils.NULLABLE_DATE.typesEqual(type)) {
if (rawObj instanceof GregorianCalendar) { // used by the SQL CLI
GregorianCalendar calendar = (GregorianCalendar) rawObj;
return Instant.ofEpochMilli(calendar.getTimeInMillis())
.atZone(calendar.getTimeZone().toZoneId())
.toLocalDate();
} else {
return LocalDate.ofEpochDay((Integer) rawObj);
}
} else if (CalciteUtils.TIME.typesEqual(type) || CalciteUtils.NULLABLE_TIME.typesEqual(type)) {
if (rawObj instanceof GregorianCalendar) { // used by the SQL CLI
GregorianCalendar calendar = (GregorianCalendar) rawObj;
return Instant.ofEpochMilli(calendar.getTimeInMillis())
.atZone(calendar.getTimeZone().toZoneId())
.toLocalTime();
} else {
return LocalTime.ofNanoOfDay((Long) rawObj);
}
} else if (CalciteUtils.isDateTimeType(type)) {
// Internal representation of Date in Calcite is convertible to Joda's Datetime.
return new DateTime(rawObj);
} else if (type.getTypeName().isNumericType()
&& ((rawObj instanceof String)
|| (rawObj instanceof BigDecimal && type.getTypeName() != TypeName.DECIMAL))) {
String raw = rawObj.toString();
switch (type.getTypeName()) {
case BYTE:
return Byte.valueOf(raw);
case INT16:
return Short.valueOf(raw);
case INT32:
return Integer.valueOf(raw);
case INT64:
if (raw.equals("")) {
return null;
}
return Long.valueOf(raw);
case FLOAT:
return Float.valueOf(raw);
case DOUBLE:
if (raw.equals("")) {
return null;
}
return Double.valueOf(raw);
default:
throw new UnsupportedOperationException(
String.format("Column type %s is not supported yet!", type));
}
} else if (type.getTypeName().isPrimitiveType()) {
if (TypeName.BYTES.equals(type.getTypeName()) && rawObj instanceof ByteString) {
return ((ByteString) rawObj).getBytes();
}
}
return rawObj;
}