Skip to content

Commit 4bc86e6

Browse files
committed
refactor IDataType
1 parent a84ce28 commit 4bc86e6

20 files changed

+128
-106
lines changed

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/IDataType.java

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,40 +21,63 @@
2121
import java.io.IOException;
2222
import java.sql.SQLException;
2323

24-
// It would be nice if we introduce a Generic Type, `IDataType<T>`, then we can avoid using `Object` and type cast.
25-
// Unfortunately Java not support unsigned number, UInt8(u_byte) must be represented by Int16(short), which will
26-
// break the Generic Type constriction and cause compile failed.
27-
public interface IDataType {
24+
/**
25+
* IDataType is responsible for:
26+
* 1. represent data type attributions
27+
* 2. serialize and deserialize
28+
* 3. parse from sql text
29+
* 4. cast between inner type and other types
30+
* 5. format to string
31+
* @param <T> inner data type, 1:1 map to ClickHouse data type
32+
*/
33+
public interface IDataType<T> {
2834

35+
// 1. represent data type attributions
2936
String name();
3037

31-
int sqlTypeId();
38+
default String[] getAliases() {
39+
return new String[0];
40+
}
3241

33-
Object defaultValue();
42+
int sqlTypeId();
3443

35-
Class javaTypeClass();
44+
Class<T> javaTypeClass();
3645

3746
boolean nullable();
3847

3948
int getPrecision();
4049

4150
int getScale();
4251

43-
Object deserializeTextQuoted(SQLLexer lexer) throws SQLException;
52+
T defaultValue();
4453

45-
Object deserializeBinary(BinaryDeserializer deserializer) throws SQLException, IOException;
54+
// 2. serialize and deserialize
55+
void serializeBinary(T data, BinarySerializer serializer) throws SQLException, IOException;
4656

47-
void serializeBinary(Object data, BinarySerializer serializer) throws SQLException, IOException;
48-
49-
default void serializeBinaryBulk(Object[] data, BinarySerializer serializer) throws SQLException, IOException {
50-
for (Object d : data) {
51-
serializeBinary(d, serializer);
57+
default void serializeBinaryBulk(T[] values, BinarySerializer serializer) throws SQLException, IOException {
58+
for (T value : values) {
59+
serializeBinary(value, serializer);
5260
}
5361
}
5462

55-
Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException;
63+
T deserializeBinary(BinaryDeserializer deserializer) throws SQLException, IOException;
5664

57-
default String[] getAliases() {
58-
return new String[0];
65+
T[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException;
66+
67+
// 3. parse from sql text
68+
T deserializeTextQuoted(SQLLexer lexer) throws SQLException;
69+
70+
// 4. cast between inner type and other types
71+
default <O> T castFrom(O other) {
72+
return javaTypeClass().cast(other);
73+
}
74+
75+
default <O> O castTo(T inner, Class<O> castToClazz) {
76+
return castToClazz.cast(inner);
77+
}
78+
79+
// 5. format to string
80+
default <O> String format(O value) {
81+
return castTo(castFrom(value), String.class);
5982
}
6083
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeDate.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws IOExcept
8282
}
8383

8484
@Override
85-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException {
86-
Date[] data = new Date[rows];
87-
for (int row = 0; row < rows; row++) {
85+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException {
86+
Date[] data = new Date[rowCnt];
87+
for (int row = 0; row < rowCnt; row++) {
8888
short daysSinceEpoch = deserializer.readShort();
8989
data[row] = Date.valueOf(LocalDate.ofEpochDay(daysSinceEpoch));
9090
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeFloat32.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws IOExcept
7373
}
7474

7575
@Override
76-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException {
77-
Float[] data = new Float[rows];
78-
for (int row = 0; row < rows; row++) {
79-
data[row] = deserializer.readFloat();
76+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException {
77+
Float[] data = new Float[rowCnt];
78+
for (int i = 0; i < rowCnt; i++) {
79+
data[i] = deserializer.readFloat();
8080
}
8181
return data;
8282
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeFloat64.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ public Double deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
7373
}
7474

7575
@Override
76-
public Double[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException {
77-
Double[] data = new Double[rows];
78-
for (int row = 0; row < rows; row++) {
79-
data[row] = deserializer.readDouble();
76+
public Double[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException {
77+
Double[] data = new Double[rowCnt];
78+
for (int i = 0; i < rowCnt; i++) {
79+
data[i] = deserializer.readDouble();
8080
}
8181
return data;
8282
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeIPv4.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
7373
}
7474

7575
@Override
76-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
77-
Object[] data = new Object[rows];
78-
for (int row = 0; row < rows; row++) {
79-
data[row] = this.deserializeBinary(deserializer);
76+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
77+
Object[] data = new Object[rowCnt];
78+
for (int i = 0; i < rowCnt; i++) {
79+
data[i] = this.deserializeBinary(deserializer);
8080
}
8181
return data;
8282
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeInt16.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
8484
}
8585

8686
@Override
87-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
88-
Object[] data = new Object[rows];
89-
for (int row = 0; row < rows; row++) {
90-
data[row] = this.deserializeBinary(deserializer);
87+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
88+
Object[] data = new Object[rowCnt];
89+
for (int i = 0; i < rowCnt; i++) {
90+
data[i] = this.deserializeBinary(deserializer);
9191
}
9292
return data;
9393
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeInt32.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
8484
}
8585

8686
@Override
87-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer)
87+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer)
8888
throws SQLException, IOException {
89-
Object[] data = new Object[rows];
90-
for (int row = 0; row < rows; row++) {
91-
data[row] = this.deserializeBinary(deserializer);
89+
Object[] data = new Object[rowCnt];
90+
for (int i = 0; i < rowCnt; i++) {
91+
data[i] = this.deserializeBinary(deserializer);
9292
}
9393
return data;
9494
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeInt64.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ public BigInteger parseBigIntegerPositive(String num, int bitlen) {
9696
}
9797

9898
@Override
99-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer)
99+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer)
100100
throws SQLException, IOException {
101-
Object[] data = new Object[rows];
102-
for (int row = 0; row < rows; row++) {
103-
data[row] = this.deserializeBinary(deserializer);
101+
Object[] data = new Object[rowCnt];
102+
for (int i = 0; i < rowCnt; i++) {
103+
data[i] = this.deserializeBinary(deserializer);
104104
}
105105
return data;
106106
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeInt8.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ public Number deserializeBinary(BinaryDeserializer deserializer) throws IOExcept
8484
}
8585

8686
@Override
87-
public Number[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException {
88-
Number[] data = new Number[rows];
89-
for (int row = 0; row < rows; row++) {
90-
data[row] = deserializeBinary(deserializer);
87+
public Number[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException {
88+
Number[] data = new Number[rowCnt];
89+
for (int i = 0; i < rowCnt; i++) {
90+
data[i] = deserializeBinary(deserializer);
9191
}
9292
return data;
9393
}

clickhouse-native-jdbc/src/main/java/com/github/housepower/jdbc/data/type/DataTypeUUID.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
7979
}
8080

8181
@Override
82-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
83-
String[] data = new String[rows];
84-
for (int row = 0; row < rows; row++) {
85-
data[row] = (String) deserializeBinary(deserializer);
82+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
83+
String[] data = new String[rowCnt];
84+
for (int i = 0; i < rowCnt; i++) {
85+
data[i] = (String) deserializeBinary(deserializer);
8686
}
8787
return data;
8888
}

0 commit comments

Comments
 (0)