diff --git a/client-v2/pom.xml b/client-v2/pom.xml index 09668cf1f..f01d9a361 100644 --- a/client-v2/pom.xml +++ b/client-v2/pom.xml @@ -131,6 +131,11 @@ 2.35.2 test + + org.roaringbitmap + RoaringBitmap + test + diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/SerializerUtils.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/SerializerUtils.java index 43ca83132..148ff8c1d 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/SerializerUtils.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/SerializerUtils.java @@ -4,9 +4,12 @@ import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader; import com.clickhouse.client.api.query.POJOSetter; +import com.clickhouse.data.ClickHouseAggregateFunction; import com.clickhouse.data.ClickHouseColumn; import com.clickhouse.data.ClickHouseDataType; import com.clickhouse.data.format.BinaryStreamUtils; +import com.clickhouse.data.value.ClickHouseBitmap; + import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -60,6 +63,9 @@ public static void serializeData(OutputStream stream, Object value, ClickHouseCo case Map: serializeMapData(stream, value, column); break; + case AggregateFunction: + serializeAggregateFunction(stream, value, column); + break; default: serializePrimitiveData(stream, value, column); break; @@ -194,6 +200,13 @@ private static void serializePrimitiveData(OutputStream stream, Object value, Cl } } + private static void serializeAggregateFunction(OutputStream stream, Object value, ClickHouseColumn column) throws IOException { + if (column.getAggregateFunction() == ClickHouseAggregateFunction.groupBitmap) { + BinaryStreamUtils.writeBitmap(stream, (ClickHouseBitmap) value); + } else { + throw new UnsupportedOperationException("Unsupported aggregate function: " + column.getAggregateFunction()); + } + } public static Integer convertToInteger(Object value) { if (value instanceof Integer) { diff --git a/client-v2/src/test/java/com/clickhouse/client/insert/SamplePOJO.java b/client-v2/src/test/java/com/clickhouse/client/insert/SamplePOJO.java index 9e7ad1611..e55caaf7b 100644 --- a/client-v2/src/test/java/com/clickhouse/client/insert/SamplePOJO.java +++ b/client-v2/src/test/java/com/clickhouse/client/insert/SamplePOJO.java @@ -1,8 +1,7 @@ package com.clickhouse.client.insert; -import com.clickhouse.client.api.metadata.TableSchema; -import com.clickhouse.data.ClickHouseColumn; -import com.clickhouse.data.ClickHouseEnum; +import com.clickhouse.data.value.ClickHouseBitmap; + import org.apache.commons.lang3.RandomStringUtils; import java.math.BigDecimal; @@ -14,13 +13,11 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.UUID; -import java.util.stream.IntStream; public class SamplePOJO { private int int8; @@ -76,6 +73,9 @@ public class SamplePOJO { private List nestedInnerInt; private List nestedInnerString; + private ClickHouseBitmap groupBitmapUint32; + private ClickHouseBitmap groupBitmapUint64; + public SamplePOJO() { final Random random = new Random(); int8 = random.nextInt(128); @@ -154,6 +154,9 @@ public SamplePOJO() { List innerString = new ArrayList<>(); innerString.add(RandomStringUtils.randomAlphabetic(1, 256)); nestedInnerString = innerString; + + groupBitmapUint32 = ClickHouseBitmap.wrap(random.ints(5, Integer.MAX_VALUE - 100, Integer.MAX_VALUE).toArray()); + groupBitmapUint64 = ClickHouseBitmap.wrap(random.longs(5, Long.MAX_VALUE - 100, Long.MAX_VALUE).toArray()); } public int getInt8() { @@ -460,6 +463,22 @@ public void setNestedInnerString(List nestedInnerString) { this.nestedInnerString = nestedInnerString; } + public ClickHouseBitmap getGroupBitmapUint32() { + return groupBitmapUint32; + } + + public void setGroupBitmapUint32(ClickHouseBitmap groupBitmapUint32) { + this.groupBitmapUint32 = groupBitmapUint32; + } + + public ClickHouseBitmap getGroupBitmapUint64() { + return groupBitmapUint64; + } + + public void setGroupBitmapUint64(ClickHouseBitmap groupBitmapUint64) { + this.groupBitmapUint64 = groupBitmapUint64; + } + public static String generateTableCreateSQL(String tableName) { return "CREATE TABLE " + tableName + " (" + "int8 Int8, " + @@ -501,7 +520,9 @@ public static String generateTableCreateSQL(String tableName) { "array Array(String), " + "tuple Tuple(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32), " + "map Map(String, Int32), " + - "nested Nested (innerInt Int32, innerString String)" + + "nested Nested (innerInt Int32, innerString String)," + + "groupBitmapUint32 AggregateFunction(groupBitmap, UInt32)," + + "groupBitmapUint64 AggregateFunction(groupBitmap, UInt64)" + ") ENGINE = Memory"; } }