mirror of https://github.com/apache/druid.git
move tests
This commit is contained in:
parent
b85a28ab96
commit
4efa93a190
|
@ -50,7 +50,7 @@ public class HyperloglogAggregator implements Aggregator
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static Object combine(Object lhs, Object rhs)
|
public static Object combine(Object lhs, Object rhs)
|
||||||
{
|
{
|
||||||
final TIntByteMap newIbMap = new TIntByteHashMap((TIntByteMap) lhs);
|
final TIntByteMap newIbMap = new TIntByteHashMap((TIntByteMap) lhs);
|
||||||
final TIntByteMap rightIbMap = (TIntByteMap) rhs;
|
final TIntByteMap rightIbMap = (TIntByteMap) rhs;
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Druid - a distributed column store.
|
||||||
|
* Copyright (C) 2012 Metamarkets Group Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.druid.query.aggregation;
|
||||||
|
|
||||||
|
import gnu.trove.map.hash.TIntByteHashMap;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class HyperloglogAggregatorTest
|
||||||
|
{
|
||||||
|
@Test
|
||||||
|
public void testAggregate()
|
||||||
|
{
|
||||||
|
final TestHllComplexMetricSelector selector = new TestHllComplexMetricSelector();
|
||||||
|
final HyperloglogAggregatorFactory aggFactory = new HyperloglogAggregatorFactory("billy", "billyG");
|
||||||
|
final HyperloglogAggregator agg = new HyperloglogAggregator("billy", selector);
|
||||||
|
|
||||||
|
Assert.assertEquals("billy", agg.getName());
|
||||||
|
|
||||||
|
Assert.assertEquals(0L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
Assert.assertEquals(0L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
Assert.assertEquals(0L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
|
||||||
|
aggregate(selector, agg);
|
||||||
|
aggregate(selector, agg);
|
||||||
|
aggregate(selector, agg);
|
||||||
|
|
||||||
|
Assert.assertEquals(3L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
Assert.assertEquals(3L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
Assert.assertEquals(3L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
|
||||||
|
aggregate(selector, agg);
|
||||||
|
aggregate(selector, agg);
|
||||||
|
|
||||||
|
Assert.assertEquals(5L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
Assert.assertEquals(5L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testComparator()
|
||||||
|
{
|
||||||
|
final TestHllComplexMetricSelector selector = new TestHllComplexMetricSelector();
|
||||||
|
final Comparator comp = new HyperloglogAggregatorFactory("billy", "billyG").getComparator();
|
||||||
|
final HyperloglogAggregator agg = new HyperloglogAggregator("billy", selector);
|
||||||
|
|
||||||
|
Object first = new TIntByteHashMap((TIntByteHashMap) agg.get());
|
||||||
|
agg.aggregate();
|
||||||
|
|
||||||
|
Assert.assertEquals(0, comp.compare(first, first));
|
||||||
|
Assert.assertEquals(0, comp.compare(agg.get(), agg.get()));
|
||||||
|
Assert.assertEquals(1, comp.compare(agg.get(), first));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHighCardinalityAggregate()
|
||||||
|
{
|
||||||
|
final TestHllComplexMetricSelector selector = new TestHllComplexMetricSelector();
|
||||||
|
final HyperloglogAggregatorFactory aggFactory = new HyperloglogAggregatorFactory("billy", "billyG");
|
||||||
|
final HyperloglogAggregator agg = new HyperloglogAggregator("billy", selector);
|
||||||
|
|
||||||
|
final int card = 100000;
|
||||||
|
|
||||||
|
for (int i = 0; i < card; i++) {
|
||||||
|
aggregate(selector, agg);
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertEquals(99443L, aggFactory.finalizeComputation(agg.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provides a nice printout of error rates as a function of cardinality
|
||||||
|
//@Test
|
||||||
|
public void benchmarkAggregation() throws Exception
|
||||||
|
{
|
||||||
|
final TestHllComplexMetricSelector selector = new TestHllComplexMetricSelector();
|
||||||
|
final HyperloglogAggregatorFactory aggFactory = new HyperloglogAggregatorFactory("billy", "billyG");
|
||||||
|
|
||||||
|
double error = 0.0d;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
final int[] valsToCheck = {
|
||||||
|
10, 20, 50, 100, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 1000000, 2000000, 10000000, Integer.MAX_VALUE
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int numThings : valsToCheck) {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
final HyperloglogAggregator agg = new HyperloglogAggregator("billy", selector);
|
||||||
|
|
||||||
|
for (int i = 0; i < numThings; ++i) {
|
||||||
|
if (i != 0 && i % 100000000 == 0) {
|
||||||
|
++count;
|
||||||
|
error = computeError(error, count, i, (Long) aggFactory.finalizeComputation(agg.get()), startTime);
|
||||||
|
}
|
||||||
|
aggregate(selector, agg);
|
||||||
|
}
|
||||||
|
|
||||||
|
++count;
|
||||||
|
error = computeError(error, count, numThings, (Long) aggFactory.finalizeComputation(agg.get()), startTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//@Test
|
||||||
|
public void benchmarkCombine() throws Exception
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
long totalTime = 0;
|
||||||
|
|
||||||
|
final TestHllComplexMetricSelector selector = new TestHllComplexMetricSelector();
|
||||||
|
TIntByteHashMap combined = new TIntByteHashMap();
|
||||||
|
|
||||||
|
for (count = 0; count < 1000000; ++count) {
|
||||||
|
final HyperloglogAggregator agg = new HyperloglogAggregator("billy", selector);
|
||||||
|
aggregate(selector, agg);
|
||||||
|
|
||||||
|
long start = System.nanoTime();
|
||||||
|
combined = (TIntByteHashMap) HyperloglogAggregator.combine(agg.get(), combined);
|
||||||
|
totalTime += System.nanoTime() - start;
|
||||||
|
}
|
||||||
|
System.out.printf("benchmarkCombine took %d ms%n", totalTime / 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
private double computeError(double error, int count, long exactValue, long estimatedValue, long startTime)
|
||||||
|
{
|
||||||
|
final double errorThisTime = Math.abs((double) exactValue - estimatedValue) / exactValue;
|
||||||
|
|
||||||
|
error += errorThisTime;
|
||||||
|
|
||||||
|
System.out.printf(
|
||||||
|
"%,d ==? %,d in %,d millis. actual error[%,f%%], avg. error [%,f%%]%n",
|
||||||
|
exactValue,
|
||||||
|
estimatedValue,
|
||||||
|
System.currentTimeMillis() - startTime,
|
||||||
|
100 * errorThisTime,
|
||||||
|
(error / count) * 100
|
||||||
|
);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void aggregate(TestHllComplexMetricSelector selector, HyperloglogAggregator agg)
|
||||||
|
{
|
||||||
|
agg.aggregate();
|
||||||
|
selector.increment();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Druid - a distributed column store.
|
||||||
|
* Copyright (C) 2013 Metamarkets Group Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.druid.query.aggregation;
|
||||||
|
|
||||||
|
import io.druid.segment.ObjectColumnSelector;
|
||||||
|
|
||||||
|
public class TestHllComplexMetricSelector implements ObjectColumnSelector<String>
|
||||||
|
{
|
||||||
|
private int index = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> classOfObject()
|
||||||
|
{
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get()
|
||||||
|
{
|
||||||
|
return String.valueOf(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increment()
|
||||||
|
{
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue