diff --git a/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/convert/PaimonTypeConvert.java b/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/convert/PaimonTypeConvert.java index 601b1a3a56..9f00210416 100644 --- a/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/convert/PaimonTypeConvert.java +++ b/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/convert/PaimonTypeConvert.java @@ -29,8 +29,11 @@ import org.apache.paimon.data.InternalRow; import org.apache.paimon.types.DataField; import org.apache.paimon.types.DataTypeRoot; +import org.apache.paimon.types.DecimalType; +import org.apache.paimon.types.TimestampType; import java.time.LocalDate; +import java.time.LocalTime; import java.util.Optional; /** @@ -63,7 +66,7 @@ public PaimonTypeConvert() { register("int", ColumnType.INT, ColumnType.INTEGER); } - public static Object SafeGetRowData(DataField fieldType, InternalRow row, int ordinal) { + public static Object getRowDataSafe(DataField fieldType, InternalRow row, int ordinal) { if (row.isNullAt(ordinal)) { return null; } @@ -73,14 +76,17 @@ public static Object SafeGetRowData(DataField fieldType, InternalRow row, int or case VARCHAR: return row.getString(ordinal).toString(); case BOOLEAN: - return row.getBoolean(ordinal); + return String.valueOf(row.getBoolean(ordinal)); case BINARY: case VARBINARY: return ""; - // case DECIMAL: - // return ""; + case DECIMAL: + DecimalType decimalType = (DecimalType) fieldType.type(); + return row.getDecimal(ordinal, decimalType.getPrecision(), decimalType.getScale()) + .toString(); case TINYINT: case SMALLINT: + return row.getShort(ordinal); case INTEGER: return row.getInt(ordinal); case BIGINT: @@ -90,12 +96,15 @@ public static Object SafeGetRowData(DataField fieldType, InternalRow row, int or case DOUBLE: return row.getDouble(ordinal); case DATE: - int timeInt = row.getInt(ordinal); - return LocalDate.of(1970, 1, 1).plusDays(timeInt); + int dateInt = row.getInt(ordinal); + return LocalDate.of(1970, 1, 1).plusDays(dateInt); case TIME_WITHOUT_TIME_ZONE: + int timeInt = row.getInt(ordinal); + return LocalTime.ofSecondOfDay(timeInt / 1000); case TIMESTAMP_WITHOUT_TIME_ZONE: case TIMESTAMP_WITH_LOCAL_TIME_ZONE: - return row.getTimestamp(ordinal, 3).toLocalDateTime(); + TimestampType timestampType = (TimestampType) fieldType.type(); + return row.getTimestamp(ordinal, timestampType.getPrecision()).toLocalDateTime(); case ARRAY: case MULTISET: return row.getArray(ordinal).toString(); diff --git a/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/driver/PaimonDriver.java b/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/driver/PaimonDriver.java index 2a05e8c542..2889a73419 100644 --- a/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/driver/PaimonDriver.java +++ b/dinky-metadata/dinky-metadata-paimon/src/main/java/org/dinky/metadata/driver/PaimonDriver.java @@ -99,7 +99,7 @@ public JdbcSelectResult query(QueryData queryData) { LinkedHashMap rowList = new LinkedHashMap<>(); for (int i = 0; i < row.getFieldCount(); i++) { String name = fieldTypes.get(i).name(); - Object data = PaimonTypeConvert.SafeGetRowData(fieldTypes.get(i), row, i); + Object data = PaimonTypeConvert.getRowDataSafe(fieldTypes.get(i), row, i); rowList.put(name, data); } datas.add(rowList);