Skip to content

Commit 4789620

Browse files
committed
refactor IDataType
1 parent b0e2dcb commit 4789620

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
}

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,10 @@ public void serializeBinary(Object data, BinarySerializer serializer) throws SQL
117117
}
118118
}
119119

120-
121120
@Override
122-
public void serializeBinaryBulk(Object[] data, BinarySerializer serializer) throws SQLException, IOException {
123-
offsetIDataType.serializeBinary(data.length, serializer);
124-
getElemDataType().serializeBinaryBulk(data, serializer);
121+
public void serializeBinaryBulk(Object[] values, BinarySerializer serializer) throws SQLException, IOException {
122+
offsetIDataType.serializeBinary(values.length, serializer);
123+
getElemDataType().serializeBinaryBulk(values, serializer);
125124
}
126125

127126
@Override
@@ -131,17 +130,17 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
131130
}
132131

133132
@Override
134-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException, SQLException {
135-
ClickHouseArray[] data = new ClickHouseArray[rows];
136-
if (rows == 0) {
133+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException, SQLException {
134+
ClickHouseArray[] data = new ClickHouseArray[rowCnt];
135+
if (rowCnt == 0) {
137136
return data;
138137
}
139138

140-
Object[] offsets = offsetIDataType.deserializeBinaryBulk(rows, deserializer);
139+
Object[] offsets = offsetIDataType.deserializeBinaryBulk(rowCnt, deserializer);
141140
ClickHouseArray res = new ClickHouseArray(elemDataType,
142-
elemDataType.deserializeBinaryBulk(((BigInteger) offsets[rows - 1]).intValue(), deserializer));
141+
elemDataType.deserializeBinaryBulk(((BigInteger) offsets[rowCnt - 1]).intValue(), deserializer));
143142

144-
for (int row = 0, lastOffset = 0; row < rows; row++) {
143+
for (int row = 0, lastOffset = 0; row < rowCnt; row++) {
145144
BigInteger offset = (BigInteger) offsets[row];
146145
data[row] = res.slice(lastOffset, offset.intValue() - lastOffset);
147146
lastOffset = offset.intValue();

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

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

121121
@Override
122-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
123-
Timestamp[] data = new Timestamp[rows];
124-
for (int row = 0; row < rows; row++) {
125-
data[row] = new Timestamp(deserializer.readInt() * 1000L);
122+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
123+
Timestamp[] data = new Timestamp[rowCnt];
124+
for (int i = 0; i < rowCnt; i++) {
125+
data[i] = new Timestamp(deserializer.readInt() * 1000L);
126126
}
127127
return data;
128128
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ public void serializeBinary(Object data, BinarySerializer serializer) throws IOE
156156
}
157157

158158
@Override
159-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws IOException {
160-
Timestamp[] data = new Timestamp[rows];
161-
for (int row = 0; row < rows; row++) {
162-
data[row] = (Timestamp) deserializeBinary(deserializer);
159+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws IOException {
160+
Timestamp[] data = new Timestamp[rowCnt];
161+
for (int i = 0; i < rowCnt; i++) {
162+
data[i] = (Timestamp) deserializeBinary(deserializer);
163163
}
164164
return data;
165165
}

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

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

206206
@Override
207-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
208-
BigDecimal[] data = new BigDecimal[rows];
209-
for (int row = 0; row < rows; row++) {
210-
data[row] = (BigDecimal) this.deserializeBinary(deserializer);
207+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
208+
BigDecimal[] data = new BigDecimal[rowCnt];
209+
for (int i = 0; i < rowCnt; i++) {
210+
data[i] = (BigDecimal) this.deserializeBinary(deserializer);
211211
}
212212
return data;
213213
}

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

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

141141
@Override
142-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
143-
String[] data = new String[rows];
144-
for (int row = 0; row < rows; row++) {
145-
data[row] = (String) deserializeBinary(deserializer);
142+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
143+
String[] data = new String[rowCnt];
144+
for (int i = 0; i < rowCnt; i++) {
145+
data[i] = (String) deserializeBinary(deserializer);
146146
}
147147
return data;
148148
}

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

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

141141
@Override
142-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
143-
String[] data = new String[rows];
144-
for (int row = 0; row < rows; row++) {
145-
data[row] = (String) deserializeBinary(deserializer);
142+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
143+
String[] data = new String[rowCnt];
144+
for (int i = 0; i < rowCnt; i++) {
145+
data[i] = (String) deserializeBinary(deserializer);
146146
}
147147
return data;
148148
}

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

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

125125
@Override
126-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
127-
String[] data = new String[rows];
128-
for (int row = 0; row < rows; row++) {
129-
data[row] = new String(deserializer.readBytes(n), charset);
126+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
127+
String[] data = new String[rowCnt];
128+
for (int i = 0; i < rowCnt; i++) {
129+
data[i] = new String(deserializer.readBytes(n), charset);
130130
}
131131
return data;
132132
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,21 +114,21 @@ public Object deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
114114
}
115115

116116
@Override
117-
public void serializeBinaryBulk(Object[] data, BinarySerializer serializer) throws SQLException, IOException {
118-
Short[] isNull = new Short[data.length];
119-
for (int i = 0; i < data.length; i++) {
120-
isNull[i] = (data[i] == null ? IS_NULL : NON_NULL);
121-
data[i] = data[i] == null ? nestedDataType.defaultValue() : data[i];
117+
public void serializeBinaryBulk(Object[] values, BinarySerializer serializer) throws SQLException, IOException {
118+
Short[] isNull = new Short[values.length];
119+
for (int i = 0; i < values.length; i++) {
120+
isNull[i] = (values[i] == null ? IS_NULL : NON_NULL);
121+
values[i] = values[i] == null ? nestedDataType.defaultValue() : values[i];
122122
}
123123
nullMapDataType.serializeBinaryBulk(isNull, serializer);
124-
nestedDataType.serializeBinaryBulk(data, serializer);
124+
nestedDataType.serializeBinaryBulk(values, serializer);
125125
}
126126

127127
@Override
128-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
129-
Object[] nullMap = nullMapDataType.deserializeBinaryBulk(rows, deserializer);
128+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
129+
Object[] nullMap = nullMapDataType.deserializeBinaryBulk(rowCnt, deserializer);
130130

131-
Object[] data = nestedDataType.deserializeBinaryBulk(rows, deserializer);
131+
Object[] data = nestedDataType.deserializeBinaryBulk(rowCnt, deserializer);
132132
for (int i = 0; i < nullMap.length; i++) {
133133
if (IS_NULL.equals(nullMap[i])) {
134134
data[i] = null;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ public String deserializeBinary(BinaryDeserializer deserializer) throws SQLExcep
9494
}
9595

9696
@Override
97-
public Object[] deserializeBinaryBulk(int rows, BinaryDeserializer deserializer) throws SQLException, IOException {
98-
String[] data = new String[rows];
99-
for (int row = 0; row < rows; row++) {
97+
public Object[] deserializeBinaryBulk(int rowCnt, BinaryDeserializer deserializer) throws SQLException, IOException {
98+
String[] data = new String[rowCnt];
99+
for (int row = 0; row < rowCnt; row++) {
100100
byte[] bs = deserializer.readBytesBinary();
101101
data[row] = new String(bs, charset);
102102
}

0 commit comments

Comments
 (0)