private PercentileAggregator createPercentileAggreator(int sumNums, Integer sqrtNum, Integer compression) { compression = compression == null ? DEFAULT_COMPRESSION : compression; PercentileAggregator aggregator = new PercentileAggregator(compression); Random random = new Random(); for (int i = 0; i < sumNums; i++) { double d = 0; if (sqrtNum == null) d = random.nextInt(1000000000); else d = Math.sqrt(sqrtNum.intValue()) * random.nextGaussian(); PercentileCounter c = new PercentileCounter(compression, 0.5); c.add(d); aggregator.aggregate(c); } return aggregator; }
private double getActualSize(PercentileAggregator aggregator) { ByteBuffer buffer = ByteBuffer.allocate(10 * 1024 * 1024); aggregator.getState().writeRegisters(buffer); double actual = buffer.position(); buffer.clear(); return actual; }
@Test public void testAggregate() { double compression = 100; int datasize = 10000; PercentileAggregator aggregator = new PercentileAggregator(compression); Random random = new Random(); List<Double> dataset = Lists.newArrayListWithCapacity(datasize); for (int i = 0; i < datasize; i++) { double d = random.nextDouble(); dataset.add(d); PercentileCounter c = new PercentileCounter(compression, 0.5); c.add(d); aggregator.aggregate(c); } Collections.sort(dataset); double actualResult = aggregator.getState().getResultEstimate(); double expectResult = MathUtil.findMedianInSortedList(dataset); assertEquals(expectResult, actualResult, 0.001); }
@Override public MeasureAggregator<PercentileCounter> newAggregator() { return new PercentileAggregator(dataType.getPrecision()); }
private void testPercentileSize(int sumNums, Integer sqrtNum, Integer compresion) throws Exception { compresion = compresion == null ? DEFAULT_COMPRESSION : compresion; PercentileAggregator aggregator = createPercentileAggreator(sumNums, sqrtNum, compresion); double actual = getActualSize(aggregator); double estimate = getEstimateSize((int) aggregator.getState().getRegisters().size(), 1, compresion); assertTrue(Math.abs(actual - estimate) / actual < 0.3); aggregator.reset(); }
@Test public void testSmallSize() { for (int compression : compressions) { for (int i = compression; i < 4 * compression; i += compression / 3) { PercentileAggregator aggregator = createPercentileAggreator(i, null, compression); double estimate = getEstimateSize(i, 1, compression); assertTrue(Math.abs(getActualSize(aggregator) - estimate) / estimate < 0.3); aggregator.reset(); } } }
@Override public MeasureAggregator<PercentileCounter> newAggregator() { return new PercentileAggregator(dataType.getPrecision()); }