Skip to content

Commit daedbda

Browse files
committed
fixed deserialization of ClickHouseBitmap
1 parent e072039 commit daedbda

File tree

10 files changed

+140
-6
lines changed

10 files changed

+140
-6
lines changed

clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseBitmap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ public static ClickHouseBitmap deserialize(DataInputStream in, ClickHouseDataTyp
354354
byte[] bytes = new byte[2 + byteLen * cardinality];
355355
bytes[0] = (byte) flag;
356356
bytes[1] = cardinality;
357-
in.read(bytes, 2, bytes.length - 2);
357+
in.readFully(bytes, 2, bytes.length - 2);
358358

359359
rb = ClickHouseBitmap.deserialize(bytes, innerType);
360360
} else {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.clickhouse.client.api.data_formats;
22

33
import com.clickhouse.client.api.metadata.TableSchema;
4+
import com.clickhouse.data.value.ClickHouseBitmap;
45
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
56
import com.clickhouse.data.value.ClickHouseGeoPointValue;
67
import com.clickhouse.data.value.ClickHouseGeoPolygonValue;
@@ -519,4 +520,8 @@ public interface ClickHouseBinaryFormatReader extends AutoCloseable {
519520
LocalDateTime getLocalDateTime(int index);
520521

521522
TableSchema getSchema();
523+
524+
ClickHouseBitmap getClickHouseBitmap(String colName);
525+
526+
ClickHouseBitmap getClickHouseBitmap(int index);
522527
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.clickhouse.client.api.query.QuerySettings;
99
import com.clickhouse.client.config.ClickHouseClientOption;
1010
import com.clickhouse.data.ClickHouseColumn;
11+
import com.clickhouse.data.value.ClickHouseBitmap;
1112
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
1213
import com.clickhouse.data.value.ClickHouseGeoPointValue;
1314
import com.clickhouse.data.value.ClickHouseGeoPolygonValue;
@@ -661,6 +662,16 @@ public LocalDateTime getLocalDateTime(int index) {
661662
return (LocalDateTime) value;
662663
}
663664

665+
@Override
666+
public ClickHouseBitmap getClickHouseBitmap(String colName) {
667+
return readValue(colName);
668+
}
669+
670+
@Override
671+
public ClickHouseBitmap getClickHouseBitmap(int index) {
672+
return readValue(index);
673+
}
674+
664675
@Override
665676
public void close() throws Exception {
666677
input.close();

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
44
import com.clickhouse.client.api.query.GenericRecord;
5+
import com.clickhouse.data.value.ClickHouseBitmap;
56
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
67
import com.clickhouse.data.value.ClickHouseGeoPointValue;
78
import com.clickhouse.data.value.ClickHouseGeoPolygonValue;
@@ -356,4 +357,14 @@ public Object getObject(String colName) {
356357
public Object getObject(int index) {
357358
return reader.readValue(index);
358359
}
360+
361+
@Override
362+
public ClickHouseBitmap getClickHouseBitmap(String colName) {
363+
return reader.readValue(colName);
364+
}
365+
366+
@Override
367+
public ClickHouseBitmap getClickHouseBitmap(int index) {
368+
return reader.readValue(index);
369+
}
359370
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public <T> T readValue(ClickHouseColumn column, Class<?> typeHint) throws IOExce
216216
return null;
217217
// case SimpleAggregateFunction:
218218
case AggregateFunction:
219-
return (T) ClickHouseBitmap.deserialize(input, column.getNestedColumns().get(0).getDataType());
219+
return (T) readBitmap( column);
220220
default:
221221
throw new IllegalArgumentException("Unsupported data type: " + column.getDataType());
222222
}
@@ -885,6 +885,11 @@ public static boolean isReadToPrimitive(ClickHouseDataType dataType) {
885885
return false;
886886
}
887887
}
888+
889+
private ClickHouseBitmap readBitmap(ClickHouseColumn column) throws IOException {
890+
return ClickHouseBitmap.deserialize(input, column.getNestedColumns().get(0).getDataType());
891+
}
892+
888893
/**
889894
* Byte allocator that caches preallocated byte arrays for small sizes.
890895
*/

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.clickhouse.client.api.query.NullValueException;
77
import com.clickhouse.data.ClickHouseColumn;
88
import com.clickhouse.data.value.ClickHouseArrayValue;
9+
import com.clickhouse.data.value.ClickHouseBitmap;
910
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
1011
import com.clickhouse.data.value.ClickHouseGeoPointValue;
1112
import com.clickhouse.data.value.ClickHouseGeoPolygonValue;
@@ -482,6 +483,16 @@ public LocalDateTime getLocalDateTime(int index) {
482483
return (LocalDateTime) value;
483484
}
484485

486+
@Override
487+
public ClickHouseBitmap getClickHouseBitmap(String colName) {
488+
return readValue(colName);
489+
}
490+
491+
@Override
492+
public ClickHouseBitmap getClickHouseBitmap(int index) {
493+
return readValue(index);
494+
}
495+
485496
@Override
486497
public Object getObject(String colName) {
487498
return readValue(colName);

client-v2/src/main/java/com/clickhouse/client/api/query/GenericRecord.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.clickhouse.client.api.query;
22

3+
import com.clickhouse.data.value.ClickHouseBitmap;
34
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
45
import com.clickhouse.data.value.ClickHouseGeoPointValue;
56
import com.clickhouse.data.value.ClickHouseGeoPolygonValue;
@@ -489,4 +490,8 @@ public interface GenericRecord {
489490
Object getObject(String colName);
490491

491492
Object getObject(int index);
493+
494+
ClickHouseBitmap getClickHouseBitmap(String colName);
495+
496+
ClickHouseBitmap getClickHouseBitmap(int index);
492497
}

client-v2/src/test/java/com/clickhouse/client/insert/SamplePOJO.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -680,10 +680,10 @@ public static String generateTableCreateSQL(String tableName) {
680680
"array Array(String), " +
681681
"tuple Tuple(UInt64, Int32, String), " +
682682
"map Map(String, Int32), " +
683-
"nested Nested (innerInt Int32, innerString String, innerNullableInt Nullable(Int32))" +
684-
// "groupBitmapUint32 AggregateFunction(groupBitmap, UInt32)," +
685-
// TODO: fix this
686-
// "groupBitmapUint64 AggregateFunction(groupBitmap, UInt64)" +
683+
"nested Nested (innerInt Int32, innerString String, " +
684+
"innerNullableInt Nullable(Int32)), " +
685+
"groupBitmapUint32 AggregateFunction(groupBitmap, UInt32), " +
686+
"groupBitmapUint64 AggregateFunction(groupBitmap, UInt64) " +
687687
") ENGINE = Memory";
688688
}
689689
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.clickhouse.client.query;
2+
3+
import com.clickhouse.data.value.ClickHouseBitmap;
4+
5+
import java.util.Objects;
6+
import java.util.Random;
7+
8+
public class AggregateFuncDTO {
9+
10+
private ClickHouseBitmap groupBitmapUint32;
11+
private ClickHouseBitmap groupBitmapUint64;
12+
13+
public AggregateFuncDTO() {
14+
Random random = new Random();
15+
this.groupBitmapUint32 = ClickHouseBitmap.wrap(random.ints(5, Integer.MAX_VALUE - 100, Integer.MAX_VALUE).toArray());
16+
this.groupBitmapUint64 = ClickHouseBitmap.wrap(random.longs(5, Long.MAX_VALUE - 100, Long.MAX_VALUE).toArray());
17+
}
18+
19+
public ClickHouseBitmap getGroupBitmapUint32() {
20+
return groupBitmapUint32;
21+
}
22+
23+
public void setGroupBitmapUint32(ClickHouseBitmap groupBitmapUint32) {
24+
this.groupBitmapUint32 = groupBitmapUint32;
25+
}
26+
27+
public ClickHouseBitmap getGroupBitmapUint64() {
28+
return groupBitmapUint64;
29+
}
30+
31+
public void setGroupBitmapUint64(ClickHouseBitmap groupBitmapUint64) {
32+
this.groupBitmapUint64 = groupBitmapUint64;
33+
}
34+
35+
@Override
36+
public boolean equals(Object o) {
37+
if (this == o) return true;
38+
if (o == null || getClass() != o.getClass()) return false;
39+
AggregateFuncDTO that = (AggregateFuncDTO) o;
40+
return Objects.equals(groupBitmapUint32, that.groupBitmapUint32) && Objects.equals(groupBitmapUint64, that.groupBitmapUint64);
41+
}
42+
43+
@Override
44+
public int hashCode() {
45+
return Objects.hash(groupBitmapUint32, groupBitmapUint64);
46+
}
47+
48+
public static String generateTableCreateSQL(String tableName) {
49+
return "CREATE TABLE " + tableName + " (" +
50+
"groupBitmapUint32 AggregateFunction(groupBitmap, UInt32), " +
51+
"groupBitmapUint64 AggregateFunction(groupBitmap, UInt64) " +
52+
") ENGINE = MergeTree() ORDER BY tuple()";
53+
}
54+
}

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.clickhouse.client.api.ServerException;
1717
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
1818
import com.clickhouse.client.api.enums.Protocol;
19+
import com.clickhouse.client.api.insert.InsertResponse;
1920
import com.clickhouse.client.api.insert.InsertSettings;
2021
import com.clickhouse.client.api.metadata.TableSchema;
2122
import com.clickhouse.client.api.metrics.ClientMetrics;
@@ -26,6 +27,7 @@
2627
import com.clickhouse.client.api.query.QueryResponse;
2728
import com.clickhouse.client.api.query.QuerySettings;
2829
import com.clickhouse.client.api.query.Records;
30+
import com.clickhouse.client.insert.SamplePOJO;
2931
import com.clickhouse.data.ClickHouseDataType;
3032
import com.clickhouse.data.ClickHouseFormat;
3133
import com.fasterxml.jackson.databind.JsonNode;
@@ -1618,6 +1620,36 @@ public static BigDecimal cropDecimal(BigDecimal value, int scale) {
16181620
return new BigDecimal(bi, scale);
16191621
}
16201622

1623+
@Test(groups = { "integration" }, enabled = true)
1624+
public void testReadingBitmap() throws Exception {
1625+
final String tableName = "bitmaps_test_table";
1626+
final String createSQL = AggregateFuncDTO.generateTableCreateSQL(tableName);
1627+
final AggregateFuncDTO pojo = new AggregateFuncDTO();
1628+
1629+
try {
1630+
client.execute("DROP TABLE IF EXISTS " + tableName).get();
1631+
client.execute(createSQL).get();
1632+
} catch (Exception e) {
1633+
throw e;
1634+
}
1635+
1636+
client.register(AggregateFuncDTO.class, client.getTableSchema(tableName, "default"));
1637+
1638+
try (InsertResponse response = client.insert(tableName, Collections.singletonList(pojo)).get(30, TimeUnit.SECONDS)) {
1639+
Assert.assertEquals(response.getWrittenRows(), 1);
1640+
}
1641+
1642+
try (QueryResponse queryResponse =
1643+
client.query("SELECT * FROM " + tableName + " LIMIT 1").get(30, TimeUnit.SECONDS)) {
1644+
1645+
ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(queryResponse);
1646+
Assert.assertNotNull(reader.next());
1647+
Assert.assertFalse(reader.hasNext());
1648+
1649+
Assert.assertEquals(reader.getClickHouseBitmap("groupBitmapUint32"), pojo.getGroupBitmapUint32());
1650+
Assert.assertEquals(reader.getClickHouseBitmap("groupBitmapUint64"), pojo.getGroupBitmapUint64());
1651+
}
1652+
}
16211653

16221654
protected Client.Builder newClient() {
16231655
ClickHouseNode node = getServer(ClickHouseProtocol.HTTP);

0 commit comments

Comments
 (0)