@Override
public Type array(Schema array, Type elementType) {
if (array.getLogicalType() instanceof LogicalMap) {
Schema keyValueSchema = array.getElementType();
Preconditions.checkArgument(AvroSchemaUtil.isKeyValueSchema(keyValueSchema),
"Invalid key-value pair schema: {}", keyValueSchema);
Types.StructType keyValueType = elementType.asStructType();
Types.NestedField keyField = keyValueType.field("key");
Types.NestedField valueField = keyValueType.field("value");
if (keyValueType.field("value").isOptional()) {
return Types.MapType.ofOptional(
keyField.fieldId(), valueField.fieldId(), keyField.type(), valueField.type());
} else {
return Types.MapType.ofRequired(
keyField.fieldId(), valueField.fieldId(), keyField.type(), valueField.type());
}
} else {
Schema elementSchema = array.getElementType();
int id = getElementId(array);
if (AvroSchemaUtil.isOptionSchema(elementSchema)) {
return Types.ListType.ofOptional(id, elementType);
} else {
return Types.ListType.ofRequired(id, elementType);
}
}
}