summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java')
-rw-r--r--core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java72
1 files changed, 37 insertions, 35 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java
index 7d5db460ae..7a8483b1b2 100644
--- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java
+++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/cardinality/CardinalityAggregator.java
@@ -22,8 +22,8 @@ package org.elasticsearch.search.aggregations.metrics.cardinality;
import com.carrotsearch.hppc.BitMixer;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.RandomAccessOrds;
import org.apache.lucene.index.SortedNumericDocValues;
+import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.FixedBitSet;
@@ -88,7 +88,7 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
if (valuesSource instanceof ValuesSource.Bytes.WithOrdinals) {
ValuesSource.Bytes.WithOrdinals source = (ValuesSource.Bytes.WithOrdinals) valuesSource;
- final RandomAccessOrds ordinalValues = source.ordinalsValues(ctx);
+ final SortedSetDocValues ordinalValues = source.ordinalsValues(ctx);
final long maxOrd = ordinalValues.getValueCount();
if (maxOrd == 0) {
return new EmptyCollector();
@@ -114,7 +114,7 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
return collector;
}
- private void postCollectLastCollector() {
+ private void postCollectLastCollector() throws IOException {
if (collector != null) {
try {
collector.postCollect();
@@ -126,7 +126,7 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- protected void doPostCollection() {
+ protected void doPostCollection() throws IOException {
postCollectLastCollector();
}
@@ -159,7 +159,7 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
private abstract static class Collector extends LeafBucketCollector implements Releasable {
- public abstract void postCollect();
+ public abstract void postCollect() throws IOException;
}
@@ -192,11 +192,12 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- public void collect(int doc, long bucketOrd) {
- hashes.setDocument(doc);
- final int valueCount = hashes.count();
- for (int i = 0; i < valueCount; ++i) {
- counts.collect(bucketOrd, hashes.valueAt(i));
+ public void collect(int doc, long bucketOrd) throws IOException {
+ if (hashes.advanceExact(doc)) {
+ final int valueCount = hashes.count();
+ for (int i = 0; i < valueCount; ++i) {
+ counts.collect(bucketOrd, hashes.nextValue());
+ }
}
}
@@ -224,12 +225,13 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
private final BigArrays bigArrays;
- private final RandomAccessOrds values;
+ private final SortedSetDocValues values;
private final int maxOrd;
private final HyperLogLogPlusPlus counts;
private ObjectArray<FixedBitSet> visitedOrds;
- OrdinalsCollector(HyperLogLogPlusPlus counts, RandomAccessOrds values, BigArrays bigArrays) {
+ OrdinalsCollector(HyperLogLogPlusPlus counts, SortedSetDocValues values,
+ BigArrays bigArrays) {
if (values.getValueCount() > Integer.MAX_VALUE) {
throw new IllegalArgumentException();
}
@@ -241,22 +243,22 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- public void collect(int doc, long bucketOrd) {
+ public void collect(int doc, long bucketOrd) throws IOException {
visitedOrds = bigArrays.grow(visitedOrds, bucketOrd + 1);
FixedBitSet bits = visitedOrds.get(bucketOrd);
if (bits == null) {
bits = new FixedBitSet(maxOrd);
visitedOrds.set(bucketOrd, bits);
}
- values.setDocument(doc);
- final int valueCount = values.cardinality();
- for (int i = 0; i < valueCount; ++i) {
- bits.set((int) values.ordAt(i));
+ if (values.advanceExact(doc)) {
+ for (long ord = values.nextOrd(); ord != SortedSetDocValues.NO_MORE_ORDS; ord = values.nextOrd()) {
+ bits.set((int) ord);
+ }
}
}
@Override
- public void postCollect() {
+ public void postCollect() throws IOException {
final FixedBitSet allVisitedOrds = new FixedBitSet(maxOrd);
for (long bucket = visitedOrds.size() - 1; bucket >= 0; --bucket) {
final FixedBitSet bits = visitedOrds.get(bucket);
@@ -296,11 +298,11 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
*/
abstract static class MurmurHash3Values {
- public abstract void setDocument(int docId);
+ public abstract boolean advanceExact(int docId) throws IOException;
public abstract int count();
- public abstract long valueAt(int index);
+ public abstract long nextValue() throws IOException;
/**
* Return a {@link MurmurHash3Values} instance that computes hashes on the fly for each double value.
@@ -332,18 +334,18 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- public void setDocument(int docId) {
- values.setDocument(docId);
+ public boolean advanceExact(int docId) throws IOException {
+ return values.advanceExact(docId);
}
@Override
public int count() {
- return values.count();
+ return values.docValueCount();
}
@Override
- public long valueAt(int index) {
- return BitMixer.mix64(values.valueAt(index));
+ public long nextValue() throws IOException {
+ return BitMixer.mix64(values.nextValue());
}
}
@@ -356,18 +358,18 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- public void setDocument(int docId) {
- values.setDocument(docId);
+ public boolean advanceExact(int docId) throws IOException {
+ return values.advanceExact(docId);
}
@Override
public int count() {
- return values.count();
+ return values.docValueCount();
}
@Override
- public long valueAt(int index) {
- return BitMixer.mix64(java.lang.Double.doubleToLongBits(values.valueAt(index)));
+ public long nextValue() throws IOException {
+ return BitMixer.mix64(java.lang.Double.doubleToLongBits(values.nextValue()));
}
}
@@ -382,18 +384,18 @@ public class CardinalityAggregator extends NumericMetricsAggregator.SingleValue
}
@Override
- public void setDocument(int docId) {
- values.setDocument(docId);
+ public boolean advanceExact(int docId) throws IOException {
+ return values.advanceExact(docId);
}
@Override
public int count() {
- return values.count();
+ return values.docValueCount();
}
@Override
- public long valueAt(int index) {
- final BytesRef bytes = values.valueAt(index);
+ public long nextValue() throws IOException {
+ final BytesRef bytes = values.nextValue();
org.elasticsearch.common.hash.MurmurHash3.hash128(bytes.bytes, bytes.offset, bytes.length, 0, hash);
return hash.h1;
}