in xtable-core/src/main/java/org/apache/xtable/iceberg/IcebergSchemaExtractor.java [168:255]
Type toIcebergType(InternalField field, AtomicInteger fieldIdTracker) {
switch (field.getSchema().getDataType()) {
case ENUM:
case STRING:
return Types.StringType.get();
case INT:
return Types.IntegerType.get();
case LONG:
return Types.LongType.get();
case BYTES:
return Types.BinaryType.get();
case FIXED:
int size =
(int) field.getSchema().getMetadata().get(InternalSchema.MetadataKey.FIXED_BYTES_SIZE);
return Types.FixedType.ofLength(size);
case BOOLEAN:
return Types.BooleanType.get();
case FLOAT:
return Types.FloatType.get();
case DATE:
return Types.DateType.get();
case TIMESTAMP:
return Types.TimestampType.withZone();
case TIMESTAMP_NTZ:
return Types.TimestampType.withoutZone();
case DOUBLE:
return Types.DoubleType.get();
case DECIMAL:
int precision =
(int) field.getSchema().getMetadata().get(InternalSchema.MetadataKey.DECIMAL_PRECISION);
int scale =
(int) field.getSchema().getMetadata().get(InternalSchema.MetadataKey.DECIMAL_SCALE);
return Types.DecimalType.of(precision, scale);
case RECORD:
return Types.StructType.of(convertFields(field.getSchema(), fieldIdTracker));
case UUID:
return Types.UUIDType.get();
case MAP:
InternalField key =
field.getSchema().getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_KEY_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
InternalField value =
field.getSchema().getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_VALUE_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
int keyId = key.getFieldId() == null ? fieldIdTracker.incrementAndGet() : key.getFieldId();
int valueId =
value.getFieldId() == null ? fieldIdTracker.incrementAndGet() : value.getFieldId();
if (field.getSchema().isNullable()) {
return Types.MapType.ofOptional(
keyId,
valueId,
toIcebergType(key, fieldIdTracker),
toIcebergType(value, fieldIdTracker));
} else {
return Types.MapType.ofRequired(
keyId,
valueId,
toIcebergType(key, fieldIdTracker),
toIcebergType(value, fieldIdTracker));
}
case LIST:
InternalField element =
field.getSchema().getFields().stream()
.filter(
arrayField ->
InternalField.Constants.ARRAY_ELEMENT_FIELD_NAME.equals(
arrayField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid array schema"));
int elementId =
element.getFieldId() == null ? fieldIdTracker.incrementAndGet() : element.getFieldId();
if (field.getSchema().isNullable()) {
return Types.ListType.ofOptional(elementId, toIcebergType(element, fieldIdTracker));
} else {
return Types.ListType.ofRequired(elementId, toIcebergType(element, fieldIdTracker));
}
default:
throw new NotSupportedException("Unsupported type: " + field.getSchema().getDataType());
}
}