summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java')
-rw-r--r--core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java153
1 files changed, 76 insertions, 77 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java b/core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java
index f3de52ae65..e6ed81c2d8 100644
--- a/core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java
+++ b/core/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java
@@ -22,14 +22,15 @@ import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.RandomAccessOrds;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedNumericDocValues;
+import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.lucene.ScorerAware;
+import org.elasticsearch.index.fielddata.AbstractSortingNumericDocValues;
import org.elasticsearch.index.fielddata.AtomicOrdinalsFieldData;
import org.elasticsearch.index.fielddata.AtomicParentChildFieldData;
import org.elasticsearch.index.fielddata.IndexFieldData;
@@ -41,7 +42,6 @@ import org.elasticsearch.index.fielddata.MultiGeoPointValues;
import org.elasticsearch.index.fielddata.SortedBinaryDocValues;
import org.elasticsearch.index.fielddata.SortedNumericDoubleValues;
import org.elasticsearch.index.fielddata.SortingBinaryDocValues;
-import org.elasticsearch.index.fielddata.SortingNumericDocValues;
import org.elasticsearch.index.fielddata.SortingNumericDoubleValues;
import org.elasticsearch.index.fielddata.plain.ParentChildIndexFieldData;
import org.elasticsearch.script.LeafSearchScript;
@@ -72,11 +72,8 @@ public abstract class ValuesSource {
@Override
public Bits docsWithValue(LeafReaderContext context) throws IOException {
final SortedBinaryDocValues bytes = bytesValues(context);
- if (org.elasticsearch.index.fielddata.FieldData.unwrapSingleton(bytes) != null) {
- return org.elasticsearch.index.fielddata.FieldData.unwrapSingletonBits(bytes);
- } else {
- return org.elasticsearch.index.fielddata.FieldData.docsWithValue(bytes, context.reader().maxDoc());
- }
+ return org.elasticsearch.index.fielddata.FieldData.docsWithValue(bytes,
+ context.reader().maxDoc());
}
public abstract static class WithOrdinals extends Bytes {
@@ -84,43 +81,42 @@ public abstract class ValuesSource {
public static final WithOrdinals EMPTY = new WithOrdinals() {
@Override
- public RandomAccessOrds ordinalsValues(LeafReaderContext context) {
+ public SortedSetDocValues ordinalsValues(LeafReaderContext context) {
return DocValues.emptySortedSet();
}
@Override
- public RandomAccessOrds globalOrdinalsValues(LeafReaderContext context) {
+ public SortedSetDocValues globalOrdinalsValues(LeafReaderContext context) {
return DocValues.emptySortedSet();
}
@Override
public SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException {
- return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary(context.reader().maxDoc());
+ return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary();
}
};
@Override
- public Bits docsWithValue(LeafReaderContext context) {
- final RandomAccessOrds ordinals = ordinalsValues(context);
- if (DocValues.unwrapSingleton(ordinals) != null) {
- return DocValues.docsWithValue(DocValues.unwrapSingleton(ordinals), context.reader().maxDoc());
- } else {
- return DocValues.docsWithValue(ordinals, context.reader().maxDoc());
- }
+ public Bits docsWithValue(LeafReaderContext context) throws IOException {
+ final SortedSetDocValues ordinals = ordinalsValues(context);
+ return org.elasticsearch.index.fielddata.FieldData.docsWithValue(ordinals,
+ context.reader().maxDoc());
}
- public abstract RandomAccessOrds ordinalsValues(LeafReaderContext context);
+ public abstract SortedSetDocValues ordinalsValues(LeafReaderContext context)
+ throws IOException;
- public abstract RandomAccessOrds globalOrdinalsValues(LeafReaderContext context);
+ public abstract SortedSetDocValues globalOrdinalsValues(LeafReaderContext context)
+ throws IOException;
- public long globalMaxOrd(IndexSearcher indexSearcher) {
+ public long globalMaxOrd(IndexSearcher indexSearcher) throws IOException {
IndexReader indexReader = indexSearcher.getIndexReader();
if (indexReader.leaves().isEmpty()) {
return 0;
} else {
LeafReaderContext atomicReaderContext = indexReader.leaves().get(0);
- RandomAccessOrds values = globalOrdinalsValues(atomicReaderContext);
+ SortedSetDocValues values = globalOrdinalsValues(atomicReaderContext);
return values.getValueCount();
}
}
@@ -140,13 +136,13 @@ public abstract class ValuesSource {
}
@Override
- public RandomAccessOrds ordinalsValues(LeafReaderContext context) {
+ public SortedSetDocValues ordinalsValues(LeafReaderContext context) {
final AtomicOrdinalsFieldData atomicFieldData = indexFieldData.load(context);
return atomicFieldData.getOrdinalsValues();
}
@Override
- public RandomAccessOrds globalOrdinalsValues(LeafReaderContext context) {
+ public SortedSetDocValues globalOrdinalsValues(LeafReaderContext context) {
final IndexOrdinalsFieldData global = indexFieldData.loadGlobal((DirectoryReader)context.parent.reader());
final AtomicOrdinalsFieldData atomicFieldData = global.load(context);
return atomicFieldData.getOrdinalsValues();
@@ -240,12 +236,12 @@ public abstract class ValuesSource {
@Override
public SortedNumericDoubleValues doubleValues(LeafReaderContext context) throws IOException {
- return org.elasticsearch.index.fielddata.FieldData.emptySortedNumericDoubles(context.reader().maxDoc());
+ return org.elasticsearch.index.fielddata.FieldData.emptySortedNumericDoubles();
}
@Override
public SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException {
- return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary(context.reader().maxDoc());
+ return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary();
}
};
@@ -263,18 +259,12 @@ public abstract class ValuesSource {
public Bits docsWithValue(LeafReaderContext context) throws IOException {
if (isFloatingPoint()) {
final SortedNumericDoubleValues values = doubleValues(context);
- if (org.elasticsearch.index.fielddata.FieldData.unwrapSingleton(values) != null) {
- return org.elasticsearch.index.fielddata.FieldData.unwrapSingletonBits(values);
- } else {
- return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values, context.reader().maxDoc());
- }
+ return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values,
+ context.reader().maxDoc());
} else {
final SortedNumericDocValues values = longValues(context);
- if (DocValues.unwrapSingleton(values) != null) {
- return DocValues.unwrapSingletonBits(values);
- } else {
- return DocValues.docsWithValue(values, context.reader().maxDoc());
- }
+ return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values,
+ context.reader().maxDoc());
}
}
@@ -313,7 +303,7 @@ public abstract class ValuesSource {
return new DoubleValues(delegate.doubleValues(context), script.getLeafSearchScript(context));
}
- static class LongValues extends SortingNumericDocValues implements ScorerAware {
+ static class LongValues extends AbstractSortingNumericDocValues implements ScorerAware {
private final SortedNumericDocValues longValues;
private final LeafSearchScript script;
@@ -324,20 +314,23 @@ public abstract class ValuesSource {
}
@Override
- public void setDocument(int doc) {
- longValues.setDocument(doc);
- resize(longValues.count());
- script.setDocument(doc);
- for (int i = 0; i < count(); ++i) {
- script.setNextAggregationValue(longValues.valueAt(i));
- values[i] = script.runAsLong();
- }
- sort();
+ public void setScorer(Scorer scorer) {
+ script.setScorer(scorer);
}
@Override
- public void setScorer(Scorer scorer) {
- script.setScorer(scorer);
+ public boolean advanceExact(int target) throws IOException {
+ if (longValues.advanceExact(target)) {
+ resize(longValues.docValueCount());
+ script.setDocument(target);
+ for (int i = 0; i < docValueCount(); ++i) {
+ script.setNextAggregationValue(longValues.nextValue());
+ values[i] = script.runAsLong();
+ }
+ sort();
+ return true;
+ }
+ return false;
}
}
@@ -352,20 +345,23 @@ public abstract class ValuesSource {
}
@Override
- public void setDocument(int doc) {
- doubleValues.setDocument(doc);
- resize(doubleValues.count());
- script.setDocument(doc);
- for (int i = 0; i < count(); ++i) {
- script.setNextAggregationValue(doubleValues.valueAt(i));
- values[i] = script.runAsDouble();
- }
- sort();
+ public void setScorer(Scorer scorer) {
+ script.setScorer(scorer);
}
@Override
- public void setScorer(Scorer scorer) {
- script.setScorer(scorer);
+ public boolean advanceExact(int target) throws IOException {
+ if (doubleValues.advanceExact(target)) {
+ resize(doubleValues.docValueCount());
+ script.setDocument(target);
+ for (int i = 0; i < docValueCount(); ++i) {
+ script.setNextAggregationValue(doubleValues.nextValue());
+ values[i] = script.runAsDouble();
+ }
+ sort();
+ return true;
+ }
+ return false;
}
}
}
@@ -468,21 +464,27 @@ public abstract class ValuesSource {
}
@Override
- public void setDocument(int docId) {
- bytesValues.setDocument(docId);
- count = bytesValues.count();
- grow();
- for (int i = 0; i < count; ++i) {
- final BytesRef value = bytesValues.valueAt(i);
- script.setNextAggregationValue(value.utf8ToString());
- values[i].copyChars(script.run().toString());
- }
- sort();
+ public void setScorer(Scorer scorer) {
+ script.setScorer(scorer);
}
@Override
- public void setScorer(Scorer scorer) {
- script.setScorer(scorer);
+ public boolean advanceExact(int doc) throws IOException {
+ if (bytesValues.advanceExact(doc)) {
+ count = bytesValues.docValueCount();
+ grow();
+ for (int i = 0; i < count; ++i) {
+ final BytesRef value = bytesValues.nextValue();
+ script.setNextAggregationValue(value.utf8ToString());
+ values[i].copyChars(script.run().toString());
+ }
+ sort();
+ return true;
+ } else {
+ count = 0;
+ grow();
+ return false;
+ }
}
}
}
@@ -493,12 +495,12 @@ public abstract class ValuesSource {
@Override
public MultiGeoPointValues geoPointValues(LeafReaderContext context) {
- return org.elasticsearch.index.fielddata.FieldData.emptyMultiGeoPoints(context.reader().maxDoc());
+ return org.elasticsearch.index.fielddata.FieldData.emptyMultiGeoPoints();
}
@Override
public SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException {
- return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary(context.reader().maxDoc());
+ return org.elasticsearch.index.fielddata.FieldData.emptySortedBinary();
}
};
@@ -506,11 +508,8 @@ public abstract class ValuesSource {
@Override
public Bits docsWithValue(LeafReaderContext context) {
final MultiGeoPointValues geoPoints = geoPointValues(context);
- if (org.elasticsearch.index.fielddata.FieldData.unwrapSingleton(geoPoints) != null) {
- return org.elasticsearch.index.fielddata.FieldData.unwrapSingletonBits(geoPoints);
- } else {
- return org.elasticsearch.index.fielddata.FieldData.docsWithValue(geoPoints, context.reader().maxDoc());
- }
+ return org.elasticsearch.index.fielddata.FieldData.docsWithValue(geoPoints,
+ context.reader().maxDoc());
}
public abstract MultiGeoPointValues geoPointValues(LeafReaderContext context);