Skip to content

Commit 765524b

Browse files
committed
fixed tests
1 parent fa9f5a1 commit 765524b

File tree

4 files changed

+96
-80
lines changed

4 files changed

+96
-80
lines changed

client-v2/src/main/java/com/clickhouse/client/api/Client.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -198,25 +198,7 @@ private Client(Set<String> endpoints, Map<String,String> configuration,
198198

199199
this.serverVersion = configuration.getOrDefault(ClientConfigProperties.SERVER_VERSION.getKey(), "unknown");
200200

201-
this.typeHintMapping = translateTypeHintMapping(configuration.get(ClientConfigProperties.TYPE_HINT_MAPPING.getKey()));
202-
}
203-
204-
private Map<ClickHouseDataType, Class<?>> translateTypeHintMapping(String mappingStr) {
205-
if (mappingStr == null || mappingStr.isEmpty()) {
206-
return AbstractBinaryFormatReader.NO_TYPE_HINT_MAPPING;
207-
}
208-
209-
Map<String, String> mapping= ClientConfigProperties.toKeyValuePairs(mappingStr);
210-
Map<ClickHouseDataType, Class<?>> hintMapping = new HashMap<>();
211-
try {
212-
for (Map.Entry<String, String> entry : mapping.entrySet()) {
213-
hintMapping.put(ClickHouseDataType.of(entry.getKey()),
214-
Class.forName(entry.getValue()));
215-
}
216-
} catch (ClassNotFoundException e) {
217-
throw new ClientMisconfigurationException("Failed to translate type-hint mapping", e);
218-
}
219-
return hintMapping;
201+
this.typeHintMapping = (Map<ClickHouseDataType, Class<?>>) this.configuration.get(ClientConfigProperties.TYPE_HINT_MAPPING.getKey());
220202
}
221203

222204
/**

client-v2/src/main/java/com/clickhouse/client/api/ClientConfigProperties.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.clickhouse.client.api;
22

3+
import com.clickhouse.client.api.data_formats.internal.AbstractBinaryFormatReader;
34
import com.clickhouse.client.api.internal.ClickHouseLZ4OutputStream;
5+
import com.clickhouse.data.ClickHouseDataType;
46
import com.clickhouse.data.ClickHouseFormat;
57
import org.slf4j.Logger;
68
import org.slf4j.LoggerFactory;
@@ -286,6 +288,10 @@ public Object parseValue(String value) {
286288
return TimeZone.getTimeZone(value);
287289
}
288290

291+
if (valueType.equals(Map.class)) {
292+
return toKeyValuePairs(value);
293+
}
294+
289295
return null;
290296
}
291297

@@ -309,7 +315,15 @@ public static Map<String, Object> parseConfigMap(Map<String, String> configMap)
309315
for (ClientConfigProperties config : ClientConfigProperties.values()) {
310316
String value = tmpMap.remove(config.getKey());
311317
if (value != null) {
312-
parsedConfig.put(config.getKey(), config.parseValue(value));
318+
Object parsedValue;
319+
switch (config) {
320+
case TYPE_HINT_MAPPING:
321+
parsedValue = translateTypeHintMapping(value);
322+
break;
323+
default:
324+
parsedValue = config.parseValue(value);
325+
}
326+
parsedConfig.put(config.getKey(), parsedValue);
313327
}
314328
}
315329

@@ -388,4 +402,22 @@ public static String mapToString(Map<?,?> map, Function<Object, String> valueCon
388402
}
389403
return sb.toString();
390404
}
405+
406+
public static Map<ClickHouseDataType, Class<?>> translateTypeHintMapping(String mappingStr) {
407+
if (mappingStr == null || mappingStr.isEmpty()) {
408+
return AbstractBinaryFormatReader.NO_TYPE_HINT_MAPPING;
409+
}
410+
411+
Map<String, String> mapping= ClientConfigProperties.toKeyValuePairs(mappingStr);
412+
Map<ClickHouseDataType, Class<?>> hintMapping = new HashMap<>();
413+
try {
414+
for (Map.Entry<String, String> entry : mapping.entrySet()) {
415+
hintMapping.put(ClickHouseDataType.of(entry.getKey()),
416+
Class.forName(entry.getValue()));
417+
}
418+
} catch (ClassNotFoundException e) {
419+
throw new ClientMisconfigurationException("Failed to translate type-hint mapping", e);
420+
}
421+
return hintMapping;
422+
}
391423
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,12 @@ public static Object convert(Object value, Class<?> type, ClickHouseColumn colum
229229
return new Array(convertList(((BinaryStreamReader.ArrayValue) value).asList(), JdbcUtils.convertToJavaClass(column.getArrayBaseColumn().getDataType())), "Object", JDBCType.JAVA_OBJECT.getVendorTypeNumber());
230230
}
231231
return new Array(((BinaryStreamReader.ArrayValue) value).asList(), "Object", JDBCType.JAVA_OBJECT.getVendorTypeNumber());
232+
} else if (type == java.sql.Array.class && value instanceof List<?>) {
233+
System.out.println(value);
234+
if (column != null && column.getArrayBaseColumn() != null) {
235+
return new Array(convertList(((List) value), JdbcUtils.convertToJavaClass(column.getArrayBaseColumn().getDataType())), "Object", JDBCType.JAVA_OBJECT.getVendorTypeNumber());
236+
}
237+
return new Array((List) value, "Object", JDBCType.JAVA_OBJECT.getVendorTypeNumber());
232238
} else if (type == Inet4Address.class && value instanceof Inet6Address) {
233239
// Convert Inet6Address to Inet4Address
234240
return Inet4Address.getByName(value.toString());

jdbc-v2/src/test/java/com/clickhouse/jdbc/DataTypeTests.java

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -762,22 +762,22 @@ public void testArrayTypes() throws SQLException {
762762
Random rand = new Random(seed);
763763
log.info("Random seed was: {}", seed);
764764

765-
Integer[] array = new Integer[rand.nextInt(10)];
765+
Integer[] array = new Integer[10];
766766
for (int i = 0; i < array.length; i++) {
767767
array[i] = rand.nextInt(256) - 128;
768768
}
769769

770-
String[] arraystr = new String[rand.nextInt(10)];
770+
String[] arraystr = new String[10];
771771
for (int i = 0; i < arraystr.length; i++) {
772772
arraystr[i] = "string" + rand.nextInt(1000);
773773
}
774774

775-
Tuple[] arraytuple = new Tuple[rand.nextInt(10) + 1];
775+
Tuple[] arraytuple = new Tuple[10];
776776
for (int i = 0; i < arraytuple.length; i++) {
777777
arraytuple[i] = new Tuple(rand.nextInt(256) - 128, "string" + rand.nextInt(1000));
778778
}
779779

780-
Date[] arraydate = new Date[rand.nextInt(10)];
780+
Date[] arraydate = new Date[10];
781781
for (int i = 0; i < arraydate.length; i++) {
782782
arraydate[i] = Date.valueOf(LocalDate.now().plusDays(rand.nextInt(100)));
783783
}
@@ -795,7 +795,7 @@ public void testArrayTypes() throws SQLException {
795795

796796
// Insert using common java objects
797797
final String INSERT_SQL = "INSERT INTO test_arrays VALUES ( 1, ?, ?, ?, ?)";
798-
try (Connection conn = getConnection()) {
798+
try (Connection conn = getJdbcConnection()) {
799799
try (PreparedStatement stmt = conn.prepareStatement(INSERT_SQL)) {
800800
stmt.setObject(1, array);
801801
stmt.setObject(2, arraystr);
@@ -810,65 +810,60 @@ public void testArrayTypes() throws SQLException {
810810
try (Statement stmt = conn.createStatement()) {
811811
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_arrays ORDER BY order")) {
812812
assertTrue(rs.next());
813-
Object[] arrayResult = (Object[]) rs.getArray("array").getArray();
814-
assertEquals(arrayResult.length, array.length);
815-
for (int i = 0; i < array.length; i++) {
816-
assertEquals(String.valueOf(arrayResult[i]), String.valueOf(array[i]));
817-
}
813+
{
814+
Object[] arrayResult = (Object[]) rs.getArray("array").getArray();
815+
assertEquals(arrayResult.length, array.length);
816+
for (int i = 0; i < array.length; i++) {
817+
assertEquals(String.valueOf(arrayResult[i]), String.valueOf(array[i]));
818+
}
818819

819-
Object[] arraystrResult = (Object[]) rs.getArray("arraystr").getArray();
820-
assertEquals(arraystrResult.length, arraystr.length);
821-
for (int i = 0; i < arraystr.length; i++) {
822-
assertEquals(arraystrResult[i], arraystr[i]);
823-
}
824-
Object[] arraytupleResult = (Object[]) rs.getArray("arraytuple").getArray();
825-
assertEquals(arraytupleResult.length, arraytuple.length);
826-
for (int i = 0; i < arraytuple.length; i++) {
827-
Tuple tuple = arraytuple[i];
828-
Tuple tupleResult = new Tuple(((Object[]) arraytupleResult[i]));
829-
assertEquals(String.valueOf(tupleResult.getValue(0)), String.valueOf(tuple.getValue(0)));
830-
assertEquals(String.valueOf(tupleResult.getValue(1)), String.valueOf(tuple.getValue(1)));
831-
}
820+
Object[] arraystrResult = (Object[]) rs.getArray("arraystr").getArray();
821+
assertEquals(arraystrResult.length, arraystr.length);
822+
for (int i = 0; i < arraystr.length; i++) {
823+
assertEquals(arraystrResult[i], arraystr[i]);
824+
}
825+
Object[] arraytupleResult = (Object[]) rs.getArray("arraytuple").getArray();
826+
assertEquals(arraytupleResult.length, arraytuple.length);
827+
for (int i = 0; i < arraytuple.length; i++) {
828+
Tuple tuple = arraytuple[i];
829+
Tuple tupleResult = new Tuple(((Object[]) arraytupleResult[i]));
830+
assertEquals(String.valueOf(tupleResult.getValue(0)), String.valueOf(tuple.getValue(0)));
831+
assertEquals(String.valueOf(tupleResult.getValue(1)), String.valueOf(tuple.getValue(1)));
832+
}
832833

833-
Object[] arraydateResult = (Object[]) rs.getArray("arraydate").getArray();
834-
assertEquals(arraydateResult.length, arraydate.length);
835-
for (int i = 0; i < arraydate.length; i++) {
836-
assertEquals(String.valueOf(arraydateResult[i]), String.valueOf(arraydate[i]));
834+
Object[] arraydateResult = (Object[]) rs.getArray("arraydate").getArray();
835+
assertEquals(arraydateResult.length, arraydate.length);
836+
for (int i = 0; i < arraydate.length; i++) {
837+
assertEquals(String.valueOf(arraydateResult[i]), String.valueOf(arraydate[i]));
838+
}
837839
}
838-
assertFalse(rs.next());
839-
}
840-
}
841-
}
842-
843-
// Check the results with getObject
844-
try (Connection conn = getJdbcConnection()) {
845-
try (Statement stmt = conn.createStatement()) {
846-
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_arrays ORDER BY order")) {
847840
assertTrue(rs.next());
848-
Object[] arrayResult = (Object[]) ((Array) rs.getObject("array")).getArray();
849-
assertEquals(arrayResult.length, array.length);
850-
for (int i = 0; i < array.length; i++) {
851-
assertEquals(String.valueOf(arrayResult[i]), String.valueOf(array[i]));
852-
}
841+
{
842+
Object[] arrayResult = (Object[]) ((Array) rs.getObject("array")).getArray();
843+
assertEquals(arrayResult.length, array.length);
844+
for (int i = 0; i < array.length; i++) {
845+
assertEquals(String.valueOf(arrayResult[i]), String.valueOf(array[i]));
846+
}
853847

854-
Object[] arraystrResult = (Object[]) ((Array) rs.getObject("arraystr")).getArray();
855-
assertEquals(arraystrResult.length, arraystr.length);
856-
for (int i = 0; i < arraystr.length; i++) {
857-
assertEquals(arraystrResult[i], arraystr[i]);
858-
}
859-
Object[] arraytupleResult = (Object[]) ((Array) rs.getObject("arraytuple")).getArray();
860-
assertEquals(arraytupleResult.length, arraytuple.length);
861-
for (int i = 0; i < arraytuple.length; i++) {
862-
Tuple tuple = arraytuple[i];
863-
Tuple tupleResult = new Tuple(((Object[]) arraytupleResult[i]));
864-
assertEquals(String.valueOf(tupleResult.getValue(0)), String.valueOf(tuple.getValue(0)));
865-
assertEquals(String.valueOf(tupleResult.getValue(1)), String.valueOf(tuple.getValue(1)));
866-
}
848+
Object[] arraystrResult = (Object[]) ((Array) rs.getObject("arraystr")).getArray();
849+
assertEquals(arraystrResult.length, arraystr.length);
850+
for (int i = 0; i < arraystr.length; i++) {
851+
assertEquals(arraystrResult[i], arraystr[i]);
852+
}
853+
Object[] arraytupleResult = (Object[]) ((Array) rs.getObject("arraytuple")).getArray();
854+
assertEquals(arraytupleResult.length, arraytuple.length);
855+
for (int i = 0; i < arraytuple.length; i++) {
856+
Tuple tuple = arraytuple[i];
857+
Tuple tupleResult = new Tuple(((Object[]) arraytupleResult[i]));
858+
assertEquals(String.valueOf(tupleResult.getValue(0)), String.valueOf(tuple.getValue(0)));
859+
assertEquals(String.valueOf(tupleResult.getValue(1)), String.valueOf(tuple.getValue(1)));
860+
}
867861

868-
Object[] arraydateResult = (Object[]) ((Array) rs.getObject("arraydate")).getArray();
869-
assertEquals(arraydateResult.length, arraydate.length);
870-
for (int i = 0; i < arraydate.length; i++) {
871-
assertEquals(arraydateResult[i], arraydate[i]);
862+
Object[] arraydateResult = (Object[]) ((Array) rs.getObject("arraydate")).getArray();
863+
assertEquals(arraydateResult.length, arraydate.length);
864+
for (int i = 0; i < arraydate.length; i++) {
865+
assertEquals(arraydateResult[i], arraydate[i]);
866+
}
872867
}
873868
assertFalse(rs.next());
874869
}
@@ -931,6 +926,7 @@ public void testMapTypes() throws SQLException {
931926

932927
@Test(groups = { "integration" })
933928
public void testMapTypesWithArrayValues() throws SQLException {
929+
runQuery("DROP TABLE test_maps;");
934930
runQuery("CREATE TABLE test_maps (order Int8, "
935931
+ "map Map(String, Array(Int32)), "
936932
+ "map2 Map(String, Array(Int32))"
@@ -956,7 +952,7 @@ public void testMapTypesWithArrayValues() throws SQLException {
956952
}
957953

958954
// Insert random (valid) values
959-
try (Connection conn = getConnection()) {
955+
try (Connection conn = getJdbcConnection()) {
960956
try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO test_maps VALUES ( 1, ?, ?)")) {
961957
stmt.setObject(1, integerMap);
962958
stmt.setObject(2, integerMap2);
@@ -965,7 +961,7 @@ public void testMapTypesWithArrayValues() throws SQLException {
965961
}
966962

967963
// Check the results
968-
try (Connection conn = getConnection()) {
964+
try (Connection conn = getJdbcConnection()) {
969965
try (Statement stmt = conn.createStatement()) {
970966
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_maps ORDER BY order")) {
971967
assertTrue(rs.next());

0 commit comments

Comments
 (0)