in core/src/main/java/org/apache/iceberg/SingleValueParser.java [49:172]
public static Object fromJson(Type type, JsonNode defaultValue) {
if (defaultValue == null || defaultValue.isNull()) {
return null;
}
switch (type.typeId()) {
case BOOLEAN:
Preconditions.checkArgument(
defaultValue.isBoolean(), "Cannot parse default as a %s value: %s", type, defaultValue);
return defaultValue.booleanValue();
case INTEGER:
Preconditions.checkArgument(
defaultValue.isIntegralNumber() && defaultValue.canConvertToInt(),
"Cannot parse default as a %s value: %s",
type,
defaultValue);
return defaultValue.intValue();
case LONG:
Preconditions.checkArgument(
defaultValue.isIntegralNumber() && defaultValue.canConvertToLong(),
"Cannot parse default as a %s value: %s",
type,
defaultValue);
return defaultValue.longValue();
case FLOAT:
Preconditions.checkArgument(
defaultValue.isFloatingPointNumber(),
"Cannot parse default as a %s value: %s",
type,
defaultValue);
return defaultValue.floatValue();
case DOUBLE:
Preconditions.checkArgument(
defaultValue.isFloatingPointNumber(),
"Cannot parse default as a %s value: %s",
type,
defaultValue);
return defaultValue.doubleValue();
case DECIMAL:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
BigDecimal retDecimal;
try {
retDecimal = new BigDecimal(defaultValue.textValue());
} catch (NumberFormatException e) {
throw new IllegalArgumentException(
String.format("Cannot parse default as a %s value: %s", type, defaultValue), e);
}
Preconditions.checkArgument(
retDecimal.scale() == ((Types.DecimalType) type).scale(),
"Cannot parse default as a %s value: %s, the scale doesn't match",
type,
defaultValue);
return retDecimal;
case STRING:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
return defaultValue.textValue();
case UUID:
Preconditions.checkArgument(
defaultValue.isTextual() && defaultValue.textValue().length() == 36,
"Cannot parse default as a %s value: %s",
type,
defaultValue);
UUID uuid;
try {
uuid = UUID.fromString(defaultValue.textValue());
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException(
String.format("Cannot parse default as a %s value: %s", type, defaultValue), e);
}
return uuid;
case DATE:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
return DateTimeUtil.isoDateToDays(defaultValue.textValue());
case TIME:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
return DateTimeUtil.isoTimeToMicros(defaultValue.textValue());
case TIMESTAMP:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
if (((Types.TimestampType) type).shouldAdjustToUTC()) {
String timestampTz = defaultValue.textValue();
Preconditions.checkArgument(
DateTimeUtil.isUTCTimestamptz(timestampTz),
"Cannot parse default as a %s value: %s, offset must be +00:00",
type,
defaultValue);
return DateTimeUtil.isoTimestamptzToMicros(timestampTz);
} else {
return DateTimeUtil.isoTimestampToMicros(defaultValue.textValue());
}
case FIXED:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
int defaultLength = defaultValue.textValue().length();
int fixedLength = ((Types.FixedType) type).length();
Preconditions.checkArgument(
defaultLength == fixedLength * 2,
"Cannot parse default %s value: %s, incorrect length: %s",
type,
defaultValue,
defaultLength);
byte[] fixedBytes =
BaseEncoding.base16().decode(defaultValue.textValue().toUpperCase(Locale.ROOT));
return ByteBuffer.wrap(fixedBytes);
case BINARY:
Preconditions.checkArgument(
defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
byte[] binaryBytes =
BaseEncoding.base16().decode(defaultValue.textValue().toUpperCase(Locale.ROOT));
return ByteBuffer.wrap(binaryBytes);
case LIST:
return listFromJson(type, defaultValue);
case MAP:
return mapFromJson(type, defaultValue);
case STRUCT:
return structFromJson(type, defaultValue);
default:
throw new UnsupportedOperationException(String.format("Type: %s is not supported", type));
}
}