Skip to content

Commit 5b557ff

Browse files
committed
Implemented conversion logic for array of primitives and nested arrays. Tested.
1 parent 8c354f2 commit 5b557ff

File tree

4 files changed

+276
-57
lines changed

4 files changed

+276
-57
lines changed

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/ValueConverters.java

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,115 @@
11
package com.clickhouse.client.api.data_formats.internal;
22

3+
import com.google.common.collect.ImmutableMap;
4+
35
import java.math.BigDecimal;
46
import java.math.BigInteger;
7+
import java.util.Arrays;
8+
import java.util.Collections;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.function.Function;
512

613
public final class ValueConverters {
714

15+
16+
// <source type, <target type, converter>>
17+
private final Map<Class<?>, Map<Class<?>, Function<Object, Object>>> classConverters;
18+
19+
// <target type, converter>
20+
private final ImmutableMap<Class<?>, Function<Object, Object>> numberConverters;
21+
22+
public ValueConverters() {
23+
24+
25+
ImmutableMap.Builder<Class<?>, Function<Object, Object>> numberConvertersBuilder = ImmutableMap.builder();
26+
numberConvertersBuilder.put(String.class, this::convertNumberToString);
27+
numberConvertersBuilder.put(Boolean.class, this::convertNumberToBoolean);
28+
numberConvertersBuilder.put(byte.class, this::convertNumberToByte);
29+
numberConvertersBuilder.put(short.class, this::convertNumberToShort);
30+
numberConvertersBuilder.put(int.class, this::convertNumberToInt);
31+
numberConvertersBuilder.put(long.class, this::convertNumberToLong);
32+
numberConvertersBuilder.put(float.class, this::convertNumberToFloat);
33+
numberConvertersBuilder.put(double.class, this::convertNumberToDouble);
34+
numberConvertersBuilder.put(Byte.class, this::convertNumberToByte);
35+
numberConvertersBuilder.put(Short.class, this::convertNumberToShort);
36+
numberConvertersBuilder.put(Integer.class, this::convertNumberToInt);
37+
numberConvertersBuilder.put(Long.class, this::convertNumberToLong);
38+
numberConvertersBuilder.put(Float.class, this::convertNumberToFloat);
39+
numberConvertersBuilder.put(Double.class, this::convertNumberToDouble);
40+
numberConvertersBuilder.put(BigInteger.class, this::convertNumberToBigInteger);
41+
numberConvertersBuilder.put(BigDecimal.class, this::convertNumberToBigDecimal);
42+
43+
numberConverters = numberConvertersBuilder.build();
44+
45+
46+
ImmutableMap.Builder<Class<?>, Map<Class<?>, Function<Object, Object>>> mapBuilder = ImmutableMap.builder();
47+
48+
mapBuilder.put(byte.class, numberConverters);
49+
mapBuilder.put(short.class, numberConverters);
50+
mapBuilder.put(int.class, numberConverters);
51+
mapBuilder.put(long.class, numberConverters);
52+
mapBuilder.put(float.class, numberConverters);
53+
mapBuilder.put(double.class, numberConverters);
54+
mapBuilder.put(Byte.class, numberConverters);
55+
mapBuilder.put(Short.class, numberConverters);
56+
mapBuilder.put(Integer.class, numberConverters);
57+
mapBuilder.put(Long.class, numberConverters);
58+
mapBuilder.put(Float.class, numberConverters);
59+
mapBuilder.put(Double.class, numberConverters);
60+
mapBuilder.put(BigInteger.class, numberConverters);
61+
mapBuilder.put(BigDecimal.class, numberConverters);
62+
63+
ImmutableMap.Builder<Class<?>, Function<Object, Object>> booleanMapBuilder = ImmutableMap.builder();
64+
booleanMapBuilder.put(byte.class, this::convertBooleanToNumber);
65+
booleanMapBuilder.put(short.class, this::convertBooleanToNumber);
66+
booleanMapBuilder.put(int.class, this::convertBooleanToNumber);
67+
booleanMapBuilder.put(long.class, this::convertBooleanToNumber);
68+
booleanMapBuilder.put(float.class, this::convertBooleanToNumber);
69+
booleanMapBuilder.put(double.class, this::convertBooleanToNumber);
70+
booleanMapBuilder.put(Byte.class, this::convertBooleanToNumber);
71+
booleanMapBuilder.put(Short.class, this::convertBooleanToNumber);
72+
booleanMapBuilder.put(Integer.class, this::convertBooleanToNumber);
73+
booleanMapBuilder.put(Long.class, this::convertBooleanToNumber);
74+
booleanMapBuilder.put(Float.class, this::convertBooleanToNumber);
75+
booleanMapBuilder.put(Double.class, this::convertBooleanToNumber);
76+
booleanMapBuilder.put(BigInteger.class, this::convertBooleanToNumber);
77+
booleanMapBuilder.put(BigDecimal.class, this::convertBooleanToNumber);
78+
booleanMapBuilder.put(String.class, this::convertBooleanToString);
79+
booleanMapBuilder.put(Boolean.class, this::convertBooleanToBoolean);
80+
booleanMapBuilder.put(boolean.class, this::convertBooleanToBoolean);
81+
82+
mapBuilder.put(Boolean.class, booleanMapBuilder.build());
83+
mapBuilder.put(boolean.class, booleanMapBuilder.build());
84+
85+
ImmutableMap.Builder<Class<?>, Function<Object, Object>> stringMapBuilder = ImmutableMap.builder();
86+
stringMapBuilder.put(byte.class, this::convertStringToByte);
87+
stringMapBuilder.put(short.class, this::convertStringToShort);
88+
stringMapBuilder.put(int.class, this::convertStringToInt);
89+
stringMapBuilder.put(long.class, this::convertStringToLong);
90+
stringMapBuilder.put(float.class, this::convertStringToFloat);
91+
stringMapBuilder.put(double.class, this::convertStringToDouble);
92+
stringMapBuilder.put(Byte.class, this::convertStringToByte);
93+
stringMapBuilder.put(Short.class, this::convertStringToShort);
94+
stringMapBuilder.put(Integer.class, this::convertStringToInt);
95+
stringMapBuilder.put(Long.class, this::convertStringToLong);
96+
stringMapBuilder.put(Float.class, this::convertStringToFloat);
97+
stringMapBuilder.put(Double.class, this::convertStringToDouble);
98+
stringMapBuilder.put(Boolean.class, this::convertStringToBoolean);
99+
stringMapBuilder.put(String.class, this::convertStringToString);
100+
stringMapBuilder.put(byte[].class, this::convertStringToBytes);
101+
mapBuilder.put(String.class, stringMapBuilder.build());
102+
103+
classConverters = mapBuilder.build();
104+
}
105+
8106
// Boolean to any
107+
public Boolean convertBooleanToBoolean(Object value) {
108+
return (Boolean) value;
109+
}
110+
9111
public Number convertBooleanToNumber(Object value) {
10-
return ((Boolean)value) ? 1 : 0;
112+
return ((Number) (((Boolean)value) ? 1 : 0)).longValue();
11113
}
12114

13115
public String convertBooleanToString(Object value) {
@@ -91,4 +193,15 @@ public BigInteger convertNumberToBigInteger(Object value) {
91193
public BigDecimal convertNumberToBigDecimal(Object value) {
92194
return BigDecimal.valueOf(((Number) value).doubleValue());
93195
}
196+
197+
/**
198+
* Returns the converter map for the given source type.
199+
* Map contains target type and converter function. For example, if source type is boolean then map will contain all
200+
* converters that support converting boolean to target type.
201+
* @param type - source type
202+
* @return - map of target type and converter function
203+
*/
204+
public Map<Class<?>, Function<Object, Object>> getConvertersForType(Class<?> type) {
205+
return classConverters.getOrDefault(type, Collections.emptyMap());
206+
}
94207
}

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private static Map<SQLType, Class<?>> generateClassMap() {
108108
map.put(JDBCType.INTEGER, Integer.class);
109109
map.put(JDBCType.BIGINT, Long.class);
110110
map.put(JDBCType.REAL, Float.class);
111-
map.put(JDBCType.FLOAT, Double.class);
111+
map.put(JDBCType.FLOAT, Float.class);
112112
map.put(JDBCType.DOUBLE, Double.class);
113113
map.put(JDBCType.BINARY, byte[].class);
114114
map.put(JDBCType.VARBINARY, byte[].class);
@@ -454,7 +454,7 @@ public Object getValue(int i) {
454454
}
455455
}
456456

457-
private static Object[] arrayToObjectArray(Object array) {
457+
public static Object[] arrayToObjectArray(Object array) {
458458
if (array == null) {
459459
return null;
460460
}

0 commit comments

Comments
 (0)