in baremaps-calcite/src/main/java/org/apache/baremaps/calcite/geopackage/GeoPackageTable.java [107:151]
private RelDataType createRowType(RelDataTypeFactory typeFactory) {
List<RelDataType> types = new ArrayList<>();
List<String> names = new ArrayList<>();
for (FeatureColumn column : featureDao.getColumns()) {
String columnName = column.getName();
RelDataType sqlType;
if (column.isGeometry()) {
// For geometry columns, use a proper geometry type
sqlType = typeFactory.createJavaType(org.locationtech.jts.geom.Geometry.class);
} else {
// Map Java types to SQL types
Class<?> javaType = column.getDataType().getClassType();
if (javaType == String.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.VARCHAR);
} else if (javaType == Integer.class || javaType == int.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.INTEGER);
} else if (javaType == Long.class || javaType == long.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.BIGINT);
} else if (javaType == Double.class || javaType == double.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.DOUBLE);
} else if (javaType == Float.class || javaType == float.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.FLOAT);
} else if (javaType == Boolean.class || javaType == boolean.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.BOOLEAN);
} else if (javaType == Date.class) {
sqlType = typeFactory.createSqlType(SqlTypeName.TIMESTAMP);
} else {
// Default to VARCHAR for unknown types
sqlType = typeFactory.createSqlType(SqlTypeName.VARCHAR);
}
}
// Handle nullability
if (!column.isNotNull()) {
sqlType = typeFactory.createTypeWithNullability(sqlType, true);
}
types.add(sqlType);
names.add(columnName);
}
return typeFactory.createStructType(types, names);
}