package org.talend.dataquality.statistics.cardinality;
import com.clearspring.analytics.stream.cardinality.CardinalityMergeException;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.clearspring.analytics.stream.cardinality.HyperLogLog;
/**
* Created by afournier on 31/03/17.
*/
public class CardinalityHLLStatisticsTest {
private static CardinalityHLLStatistics cardHLLStats;
@Before
public void setUp() throws Exception {
cardHLLStats = new CardinalityHLLStatistics();
cardHLLStats.setHyperLogLog(new HyperLogLog(20));
}
@Test(expected = CardinalityMergeException.class)
public void testDifferentHLLMerge() throws CardinalityMergeException {
CardinalityHLLStatistics cardStat = new CardinalityHLLStatistics();
cardStat.setHyperLogLog(new HyperLogLog(28));
for (int i = 0; i < 1000; i++) {
cardHLLStats.incrementCount();
cardStat.incrementCount();
String str = RandomStringUtils.randomAscii(2);
cardHLLStats.getHyperLogLog().offer(str);
cardStat.add(str);
}
cardHLLStats.merge(cardStat);
Assert.assertEquals(cardStat.getDistinctCount(), cardHLLStats.getDistinctCount());
}
@Test(expected = ClassCastException.class)
public void testDifferentTypeMerge() throws CardinalityMergeException {
AbstractCardinalityStatistics stat1 = new CardinalityStatistics();
stat1.merge(cardHLLStats);
}
@Test
public void testPossibleMerge() throws CardinalityMergeException {
CardinalityHLLStatistics otherCardHLLStat = new CardinalityHLLStatistics();
otherCardHLLStat.setHyperLogLog(new HyperLogLog(20));
for (int i = 0; i < 1000; i++) {
cardHLLStats.incrementCount();
otherCardHLLStat.incrementCount();
String str = RandomStringUtils.randomAscii(2);
cardHLLStats.getHyperLogLog().offer(str);
otherCardHLLStat.getHyperLogLog().offer(str);
}
cardHLLStats.merge(otherCardHLLStat);
Assert.assertEquals(cardHLLStats.getDistinctCount(), otherCardHLLStat.getDistinctCount());
}
}