diff options
author | Colin Goodheart-Smithe <colings86@users.noreply.github.com> | 2017-04-03 09:39:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-03 09:39:03 +0100 |
commit | 058869ed549deb080522d873e3891425d377cc48 (patch) | |
tree | 29d6750ab8c4ba30cf366cb897b66cfd6ac9b690 /core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java | |
parent | 5cf1d4ae90b1c19df4c3ddd1dbf8f196177012b0 (diff) |
Adds tests for cardinality and filter aggregations (#23826)
* Adds tests for cardinality and filter aggregations
Relates to #22278
* addresses review comments
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java index 42b4561e07..6425cc3b68 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java @@ -34,6 +34,9 @@ import org.elasticsearch.common.util.IntArray; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; /** * Hyperloglog++ counter, implemented based on pseudo code from @@ -420,6 +423,32 @@ public final class HyperLogLogPlusPlus implements Releasable { Releasables.close(runLens, hashSet.sizes); } + private Set<Object> getComparableData(long bucket) { + Set<Object> values = new HashSet<>(); + if (algorithm.get(bucket) == LINEAR_COUNTING) { + try (IntArray hashSetValues = hashSet.values(bucket)) { + for (long i = 0; i < hashSetValues.size(); i++) { + values.add(hashSetValues.get(i)); + } + } + } else { + for (long i = 0; i < runLens.size(); i++) { + values.add(runLens.get((bucket << p) + i)); + } + } + return values; + } + + public int hashCode(long bucket) { + return Objects.hash(p, algorithm.get(bucket), getComparableData(bucket)); + } + + public boolean equals(long bucket, HyperLogLogPlusPlus other) { + return Objects.equals(p, other.p) && + Objects.equals(algorithm.get(bucket), other.algorithm.get(bucket)) && + Objects.equals(getComparableData(bucket), getComparableData(bucket)); + } + /** * We are actually using HyperLogLog's runLens array but interpreting it as a hash set * for linear counting. |