@Override public BitmapCounter deserialize(ByteBuffer in) { try { //The length of RoaringBitmap is larger than 12 if (peekLength(in) == RESULT_SIZE) { int flag = in.getInt(); return factory.newBitmap(in.getLong()); } else { return factory.newBitmap(in); } } catch (IOException e) { throw new RuntimeException(e); } }
@Override protected double getStorageBytesEstimate(double averageNumOfElementsInCounter) { // MappeableArrayContainer DEFAULT_MAX_SIZE = 4096 if (averageNumOfElementsInCounter < DEFAULT_MAX_SIZE) { // 8 = 4 + 4 for SERIAL_COOKIE_NO_RUNCONTAINER + size // size * 8 = 2 * size + 2 * size + 4 * size as keys + values Cardinality + startOffsets // size * 8 for values array return 8 + averageNumOfElementsInCounter * 16; } else { return getStorageBytesEstimate(); } }
@Test public void testBitmapSerDe() { BitmapSerializer serializer = new BitmapSerializer(DataType.ANY); serializer.serialize(counter, buffer); int size = buffer.position(); buffer.flip(); assertEquals(size, serializer.peekLength(buffer)); assertEquals(0, buffer.position()); // peek doesn't change buffer BitmapCounter counter2 = serializer.deserialize(buffer); serializer.serialize(counter, buffer); Assert.fail(); } catch (Exception e) {
@Override public BitmapCounter deserialize(ByteBuffer in) { BitmapCounter counter = current(); try { counter.readRegisters(in); } catch (IOException e) { throw new RuntimeException(e); } return counter; }
@Override public int getStorageBytesEstimate() { return current().getMemBytes(); } }
@Override public BitmapCounter deserialize(ByteBuffer in) { try { //The length of RoaringBitmap is larger than 12 if (peekLength(in) == RESULT_SIZE) { int flag = in.getInt(); return factory.newBitmap(in.getLong()); } else { return factory.newBitmap(in); } } catch (IOException e) { throw new RuntimeException(e); } }
@Override public int peekLength(ByteBuffer in) { return current().peekLength(in); }
@Override protected double getStorageBytesEstimate(double averageNumOfElementsInCounter) { // MappeableArrayContainer DEFAULT_MAX_SIZE = 4096 if (averageNumOfElementsInCounter < DEFAULT_MAX_SIZE) { // 8 = 4 + 4 for SERIAL_COOKIE_NO_RUNCONTAINER + size // size * 8 = 2 * size + 2 * size + 4 * size as keys + values Cardinality + startOffsets // size * 8 for values array return 8 + averageNumOfElementsInCounter * 16; } else { return getStorageBytesEstimate(); } }