in v2/spanner-to-sourcedb/src/main/java/com/google/cloud/teleport/v2/templates/dbutils/dml/CassandraTypeHandler.java [337:450]
private static PreparedStatementValueObject<?> parseAndCastToCassandraType(
String columnType, Object colValue) {
if (colValue == null) {
return null;
}
if (columnType.startsWith("frozen<")) {
return parseAndCastToCassandraType(extractInnerType(columnType), colValue);
}
// Handle collection types
if (columnType.startsWith("list<")) {
return safeHandle(
() -> {
JSONArray parsedJSONArray =
colValue instanceof JSONArray
? (JSONArray) colValue
: new JSONArray((String) colValue);
return PreparedStatementValueObject.create(
columnType, parseCassandraList(columnType, parsedJSONArray));
});
} else if (columnType.startsWith("set<")) {
return safeHandle(
() -> {
JSONArray parsedJSONArray =
colValue instanceof JSONArray
? (JSONArray) colValue
: new JSONArray((String) colValue);
return PreparedStatementValueObject.create(
columnType, parseCassandraSet(columnType, parsedJSONArray));
});
} else if (columnType.startsWith("map<")) {
return safeHandle(
() -> {
JSONObject parsedJSON =
colValue instanceof JSONObject
? (JSONObject) colValue
: new JSONObject((String) colValue);
return PreparedStatementValueObject.create(
columnType, parseCassandraMap(columnType, parsedJSON));
});
}
// Handle primitive and standard types
switch (columnType) {
case "ascii":
case "text":
case "varchar":
return PreparedStatementValueObject.create(columnType, (String) colValue);
case "bigint":
case "int":
case "smallint":
case "tinyint":
return safeHandle(
() ->
PreparedStatementValueObject.create(
columnType, parseNumericType(columnType, colValue.toString())));
case "boolean":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> parseBoolean(colValue.toString())));
case "decimal":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> parseDecimal(colValue.toString())));
case "double":
case "float":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> parseFloatingPoint(columnType, colValue.toString())));
case "inet":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> handleCassandraInetAddressType(colValue.toString())));
case "time":
return PreparedStatementValueObject.create(
columnType,
safeHandle(
() ->
handleCassandraTimestampType(colValue.toString())
.atZone(ZoneId.systemDefault())
.toLocalTime()));
case "timestamp":
case "datetime":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> handleCassandraTimestampType(colValue.toString())));
case "date":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> parseDate(colValue.toString())));
case "timeuuid":
case "uuid":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> handleCassandraUuidType(colValue.toString())));
case "varint":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> handleCassandraVarintType(colValue)));
case "duration":
return PreparedStatementValueObject.create(
columnType, safeHandle(() -> handleCassandraDurationType(colValue.toString())));
case "blob":
return safeHandle(
() -> PreparedStatementValueObject.create(columnType, parseBlobType(colValue)));
default:
return PreparedStatementValueObject.create(columnType, colValue);
}
}