diff options
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.java | 153 |
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); |