summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java
diff options
context:
space:
mode:
authorColin Goodheart-Smithe <colings86@users.noreply.github.com>2017-04-03 09:39:03 +0100
committerGitHub <noreply@github.com>2017-04-03 09:39:03 +0100
commit058869ed549deb080522d873e3891425d377cc48 (patch)
tree29d6750ab8c4ba30cf366cb897b66cfd6ac9b690 /core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/HyperLogLogPlusPlus.java
parent5cf1d4ae90b1c19df4c3ddd1dbf8f196177012b0 (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.java29
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.