From b8caaf56ca883b6ae56e35eec6717a78266a2561 Mon Sep 17 00:00:00 2001 From: wangbo <506340561@qq.com> Date: Thu, 12 Nov 2020 18:37:11 +0800 Subject: [PATCH] (#4883) Java Version BitmapValue deserialized failed when only has 32-bit bitmap --- .../doris/load/loadv2/dpp/Roaring64Map.java | 15 +++++++++---- .../load/loadv2/dpp/BitmapValueTest.java | 21 ++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/fe/spark-dpp/src/main/java/org/apache/doris/load/loadv2/dpp/Roaring64Map.java b/fe/spark-dpp/src/main/java/org/apache/doris/load/loadv2/dpp/Roaring64Map.java index 56ad1a7a9c1cad..a606766d1acf14 100644 --- a/fe/spark-dpp/src/main/java/org/apache/doris/load/loadv2/dpp/Roaring64Map.java +++ b/fe/spark-dpp/src/main/java/org/apache/doris/load/loadv2/dpp/Roaring64Map.java @@ -24,6 +24,7 @@ import org.roaringbitmap.BitmapDataProviderSupplier; import org.roaringbitmap.IntConsumer; import org.roaringbitmap.IntIterator; +import org.roaringbitmap.InvalidRoaringFormat; import org.roaringbitmap.RoaringBitmap; import org.roaringbitmap.RoaringBitmapSupplier; import org.roaringbitmap.Util; @@ -1345,16 +1346,22 @@ public void deserialize(DataInput in, int bitmapType) throws IOException { this.clear(); highToBitmap = new TreeMap<>(); - long nbHighs = 1; - if (bitmapType == BitmapValue.BITMAP64) { - nbHighs = Codec.decodeVarint64(in); + if (bitmapType == BitmapValue.BITMAP32) { + RoaringBitmap provider = new RoaringBitmap(); + provider.deserialize(in); + highToBitmap.put(0, provider); + return; } + if (bitmapType != BitmapValue.BITMAP64) { + throw new InvalidRoaringFormat("invalid bitmap type"); + } + + long nbHighs = Codec.decodeVarint64(in); for (int i = 0; i < nbHighs; i++) { int high = in.readInt(); RoaringBitmap provider = new RoaringBitmap(); provider.deserialize(in); - highToBitmap.put(high, provider); } diff --git a/fe/spark-dpp/src/test/java/org/apache/doris/load/loadv2/dpp/BitmapValueTest.java b/fe/spark-dpp/src/test/java/org/apache/doris/load/loadv2/dpp/BitmapValueTest.java index d9c71e818c5e2d..e90e8851d316eb 100644 --- a/fe/spark-dpp/src/test/java/org/apache/doris/load/loadv2/dpp/BitmapValueTest.java +++ b/fe/spark-dpp/src/test/java/org/apache/doris/load/loadv2/dpp/BitmapValueTest.java @@ -324,13 +324,11 @@ public void testBitmapValueSerializeAndDeserialize() throws IOException { Assert.assertTrue(serializeSingleValueBitmapValue.equals(deserializeSingleValueBitmapValue)); // bitmap + // case 1 : 32-bit bitmap BitmapValue serializeBitmapBitmapValue = new BitmapValue(); for (int i = 0; i < 10; i++) { serializeBitmapBitmapValue.add(i); } - for (long i = Long.MAX_VALUE; i > Long.MAX_VALUE - 10; i--) { - serializeBitmapBitmapValue.add(i); - } ByteArrayOutputStream bitmapOutputStream = new ByteArrayOutputStream(); DataOutput bitmapOutput = new DataOutputStream(bitmapOutputStream); serializeBitmapBitmapValue.serialize(bitmapOutput); @@ -340,6 +338,23 @@ public void testBitmapValueSerializeAndDeserialize() throws IOException { deserializeBitmapBitmapValue.deserialize(bitmapInputStream); Assert.assertTrue(serializeBitmapBitmapValue.equals(deserializeBitmapBitmapValue)); + + + // bitmap + // case 2 : 64-bit bitmap + BitmapValue serializeBitmapBitmapValue64 = new BitmapValue(); + for (long i = Long.MAX_VALUE; i > Long.MAX_VALUE - 10; i--) { + serializeBitmapBitmapValue64.add(i); + } + ByteArrayOutputStream bitmapOutputStream64 = new ByteArrayOutputStream(); + DataOutput bitmapOutput64 = new DataOutputStream(bitmapOutputStream64); + serializeBitmapBitmapValue64.serialize(bitmapOutput64); + + DataInputStream bitmapInputStream64 = new DataInputStream(new ByteArrayInputStream(bitmapOutputStream64.toByteArray())); + BitmapValue deserializeBitmapBitmapValue64 = new BitmapValue(); + deserializeBitmapBitmapValue64.deserialize(bitmapInputStream64); + + Assert.assertTrue(serializeBitmapBitmapValue64.equals(deserializeBitmapBitmapValue64)); } @Test