From 812dcbb4bbe12e65d30d6e94670ecc4434f38d8a Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 20 Mar 2019 23:13:50 +1300 Subject: [PATCH] #1653 - ENH: Add support for ClickHouse database With array type conversion for primitive arrays --- .../clickhouse/ClickHousePlatform.java | 6 +++ .../server/type/ScalarTypeArrayBase.java | 42 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java b/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java index 1a1d45a79..17ee210bf 100644 --- a/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java @@ -49,4 +49,10 @@ public class ClickHousePlatform extends DatabasePlatform { dbTypeMap.put(DbType.INET, new DbPlatformType("String", false)); dbTypeMap.put(DbType.CDIR, new DbPlatformType("String", false)); } + + @Override + public boolean isNativeArrayType() { + return true; + } + } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java index 783793c72..8a08772ad 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java @@ -18,13 +18,53 @@ abstract class ScalarTypeArrayBase extends ScalarTypeJsonCollection { return null; } else { try { - return fromArray((Object[]) array.getArray()); + return fromArray(convertArray(array.getArray())); } finally { array.free(); } } } + private Object[] convertArray(Object array) { + if (array instanceof Object[]) { + return (Object[]) array; + } + if (array instanceof long[]) { + return convertLongs((long[]) array); + } + if (array instanceof int[]) { + return convertInts((int[]) array); + } + if (array instanceof double[]) { + return convertDoubles((double[]) array); + } + throw new IllegalArgumentException("Unable to convert array " + array); + } + + private Object[] convertLongs(long[] o) { + Long[] list = new Long[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + + private Object[] convertInts(int[] o) { + Integer[] list = new Integer[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + + private Object[] convertDoubles(double[] o) { + Double[] list = new Double[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + protected abstract T fromArray(Object[] array1); }