in adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java [273:344]
public static Schema jdbcToArrowSchema(ResultSetMetaData rsmd, JdbcToArrowConfig config)
throws SQLException {
Preconditions.checkNotNull(rsmd, "JDBC ResultSetMetaData object can't be null");
Preconditions.checkNotNull(config, "The configuration object must not be null");
List<Field> fields = new ArrayList<>();
int columnCount = rsmd.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
final String columnName = rsmd.getColumnLabel(i);
final Map<String, String> columnMetadata =
config.getColumnMetadataByColumnIndex() != null
? config.getColumnMetadataByColumnIndex().get(i)
: null;
final Map<String, String> metadata;
if (config.shouldIncludeMetadata()) {
metadata = new HashMap<>();
metadata.put(Constants.SQL_CATALOG_NAME_KEY, rsmd.getCatalogName(i));
metadata.put(Constants.SQL_SCHEMA_NAME_KEY, rsmd.getSchemaName(i));
metadata.put(Constants.SQL_TABLE_NAME_KEY, rsmd.getTableName(i));
metadata.put(Constants.SQL_COLUMN_NAME_KEY, columnName);
metadata.put(Constants.SQL_TYPE_KEY, rsmd.getColumnTypeName(i));
if (columnMetadata != null && !columnMetadata.isEmpty()) {
metadata.putAll(columnMetadata);
}
} else {
if (columnMetadata != null && !columnMetadata.isEmpty()) {
metadata = columnMetadata;
} else {
metadata = null;
}
}
final JdbcFieldInfo columnFieldInfo = getJdbcFieldInfoForColumn(rsmd, i, config);
final ArrowType arrowType = config.getJdbcToArrowTypeConverter().apply(columnFieldInfo);
if (arrowType != null) {
final FieldType fieldType =
new FieldType(
isColumnNullable(rsmd, i, columnFieldInfo),
arrowType, /* dictionary encoding */
null,
metadata);
List<Field> children = null;
if (arrowType.getTypeID() == ArrowType.List.TYPE_TYPE) {
final JdbcFieldInfo arrayFieldInfo = getJdbcFieldInfoForArraySubType(rsmd, i, config);
if (arrayFieldInfo == null) {
throw new IllegalArgumentException(
"Configuration does not provide a mapping for array column " + i);
}
children = new ArrayList<Field>();
final ArrowType childType = config.getJdbcToArrowTypeConverter().apply(arrayFieldInfo);
children.add(new Field("child", FieldType.nullable(childType), null));
} else if (arrowType.getTypeID() == ArrowType.ArrowTypeID.Map) {
FieldType mapType = new FieldType(false, ArrowType.Struct.INSTANCE, null, null);
FieldType keyType = new FieldType(false, new ArrowType.Utf8(), null, null);
FieldType valueType = new FieldType(false, new ArrowType.Utf8(), null, null);
children = new ArrayList<>();
children.add(
new Field(
"child",
mapType,
Arrays.asList(
new Field(MapVector.KEY_NAME, keyType, null),
new Field(MapVector.VALUE_NAME, valueType, null))));
}
fields.add(new Field(columnName, fieldType, children));
}
}
return new Schema(fields, config.getSchemaMetadata());
}