@Test public void testAggregator() { BitmapAggregator aggregator = new BitmapAggregator(); assertNull(null, aggregator.getState()); aggregator.aggregate(factory.newBitmap(10, 20, 30, 40)); assertEquals(4, aggregator.getState().getCount()); aggregator.aggregate(factory.newBitmap(25, 30, 35, 40, 45)); assertEquals(7, aggregator.getState().getCount()); aggregator.reset(); assertNull(aggregator.getState()); }
private BitmapAggregator createBitmapAggr(boolean lowCardinality) { BitmapCounter counter = bitmapFactory.newBitmap(); counter.orWith(lowCardinality ? bitmaps[0] : bitmaps[3]); BitmapAggregator result = new BitmapAggregator(); result.aggregate(counter); return result; }
@Override public MeasureAggregator<BitmapCounter> newAggregator() { return new BitmapAggregator(); }
@Override public int getMemBytesEstimate() { return sum == null ? 0 : sum.getMemBytes(); } }
@Override public void reset() { current = factory.newBitmap(); } };
@Override public void aggregate(BitmapCounter value) { // Here we optimize for case when group only has 1 value. In such situation, no // aggregation is needed, so we just keep a reference to the first value, saving // the cost of deserialization and merging. if (sum == null) { sum = value; return; } sum.orWith(value); }
public static BitmapAggregator add(BitmapAggregator agg, Object value) { agg.aggregate((BitmapCounter) value); return agg; }
@Override public BitmapCounter newBitmap(ByteBuffer in) throws IOException { RoaringBitmapCounter counter = new RoaringBitmapCounter(); counter.readFields(in); return counter; } }
@Override public MeasureType<BitmapCounter> createMeasureType(String funcName, DataType dataType) { return new BitmapMeasureType(); }
@Override public BitmapCounter newBitmap() { return new RoaringBitmapCounter(); }
@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(); } }
@Override public String toString() { return "RoaringBitmapCounter[" + getCount() + "]"; } }
public static RetentionPartialResult add(RetentionPartialResult result, Object value, Object key, List keyList) { result.add(key, keyList, value); return result; }
public static long result(RetentionPartialResult result) { return result.result(); } }
public static RetentionPartialResult merge(RetentionPartialResult result, Object value, Object key, List keyList) { return add(result, value, key, keyList); }
public static BitmapAggregator init() { return new BitmapAggregator(); }
@Override public BitmapCounter newBitmap(long counter) { return new RoaringBitmapCounter(counter); }