in core/src/main/java/org/apache/iceberg/SingleValueParser.java [240:393]
public static void toJson(Type type, Object defaultValue, JsonGenerator generator)
throws IOException {
if (defaultValue == null) {
generator.writeNull();
return;
}
switch (type.typeId()) {
case BOOLEAN:
Preconditions.checkArgument(
defaultValue instanceof Boolean, "Invalid default %s value: %s", type, defaultValue);
generator.writeBoolean((Boolean) defaultValue);
break;
case INTEGER:
Preconditions.checkArgument(
defaultValue instanceof Integer, "Invalid default %s value: %s", type, defaultValue);
generator.writeNumber((Integer) defaultValue);
break;
case LONG:
Preconditions.checkArgument(
defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
generator.writeNumber((Long) defaultValue);
break;
case FLOAT:
Preconditions.checkArgument(
defaultValue instanceof Float, "Invalid default %s value: %s", type, defaultValue);
generator.writeNumber((Float) defaultValue);
break;
case DOUBLE:
Preconditions.checkArgument(
defaultValue instanceof Double, "Invalid default %s value: %s", type, defaultValue);
generator.writeNumber((Double) defaultValue);
break;
case DATE:
Preconditions.checkArgument(
defaultValue instanceof Integer, "Invalid default %s value: %s", type, defaultValue);
generator.writeString(DateTimeUtil.daysToIsoDate((Integer) defaultValue));
break;
case TIME:
Preconditions.checkArgument(
defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
generator.writeString(DateTimeUtil.microsToIsoTime((Long) defaultValue));
break;
case TIMESTAMP:
Preconditions.checkArgument(
defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
if (((Types.TimestampType) type).shouldAdjustToUTC()) {
generator.writeString(DateTimeUtil.microsToIsoTimestamptz((Long) defaultValue));
} else {
generator.writeString(DateTimeUtil.microsToIsoTimestamp((Long) defaultValue));
}
break;
case STRING:
Preconditions.checkArgument(
defaultValue instanceof CharSequence,
"Invalid default %s value: %s",
type,
defaultValue);
generator.writeString(((CharSequence) defaultValue).toString());
break;
case UUID:
Preconditions.checkArgument(
defaultValue instanceof UUID, "Invalid default %s value: %s", type, defaultValue);
generator.writeString(defaultValue.toString());
break;
case FIXED:
Preconditions.checkArgument(
defaultValue instanceof ByteBuffer, "Invalid default %s value: %s", type, defaultValue);
ByteBuffer byteBufferValue = (ByteBuffer) defaultValue;
int expectedLength = ((Types.FixedType) type).length();
Preconditions.checkArgument(
byteBufferValue.remaining() == expectedLength,
"Invalid default %s value, incorrect length: %s",
type,
byteBufferValue.remaining());
generator.writeString(
BaseEncoding.base16().encode(ByteBuffers.toByteArray(byteBufferValue)));
break;
case BINARY:
Preconditions.checkArgument(
defaultValue instanceof ByteBuffer, "Invalid default %s value: %s", type, defaultValue);
generator.writeString(
BaseEncoding.base16().encode(ByteBuffers.toByteArray((ByteBuffer) defaultValue)));
break;
case DECIMAL:
Preconditions.checkArgument(
defaultValue instanceof BigDecimal
&& ((BigDecimal) defaultValue).scale() == ((Types.DecimalType) type).scale(),
"Invalid default %s value: %s",
type,
defaultValue);
BigDecimal decimalValue = (BigDecimal) defaultValue;
if (decimalValue.scale() >= 0) {
generator.writeString(decimalValue.toPlainString());
} else {
generator.writeString(decimalValue.toString());
}
break;
case LIST:
Preconditions.checkArgument(
defaultValue instanceof List, "Invalid default %s value: %s", type, defaultValue);
List<Object> defaultList = (List<Object>) defaultValue;
Type elementType = type.asListType().elementType();
generator.writeStartArray();
for (Object element : defaultList) {
toJson(elementType, element, generator);
}
generator.writeEndArray();
break;
case MAP:
Preconditions.checkArgument(
defaultValue instanceof Map, "Invalid default %s value: %s", type, defaultValue);
Map<Object, Object> defaultMap = (Map<Object, Object>) defaultValue;
Type keyType = type.asMapType().keyType();
Type valueType = type.asMapType().valueType();
List<Object> valueList = Lists.newArrayListWithExpectedSize(defaultMap.size());
generator.writeStartObject();
generator.writeArrayFieldStart(KEYS);
for (Map.Entry<Object, Object> entry : defaultMap.entrySet()) {
toJson(keyType, entry.getKey(), generator);
valueList.add(entry.getValue());
}
generator.writeEndArray();
generator.writeArrayFieldStart(VALUES);
for (Object value : valueList) {
toJson(valueType, value, generator);
}
generator.writeEndArray();
generator.writeEndObject();
break;
case STRUCT:
Preconditions.checkArgument(
defaultValue instanceof StructLike, "Invalid default %s value: %s", type, defaultValue);
Types.StructType structType = type.asStructType();
List<Types.NestedField> fields = structType.fields();
StructLike defaultStruct = (StructLike) defaultValue;
generator.writeStartObject();
for (int i = 0; i < defaultStruct.size(); i++) {
Types.NestedField field = fields.get(i);
int fieldId = field.fieldId();
Object fieldDefaultValue = defaultStruct.get(i, Object.class);
if (fieldDefaultValue != null) {
generator.writeFieldName(String.valueOf(fieldId));
toJson(field.type(), fieldDefaultValue, generator);
}
}
generator.writeEndObject();
break;
default:
throw new UnsupportedOperationException(String.format("Type: %s is not supported", type));
}
}