diff --git a/server/src/main/java/org/elasticsearch/index/fielddata/DocValueBits.java b/server/src/main/java/org/elasticsearch/index/fielddata/DocValueBits.java new file mode 100644 index 00000000000..fcfe7c9a8ce --- /dev/null +++ b/server/src/main/java/org/elasticsearch/index/fielddata/DocValueBits.java @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.fielddata; + +import java.io.IOException; + +public abstract class DocValueBits { + + /** + * Advance this instance to the given document id + * + * @return true if there is a value for this document + */ + public abstract boolean advanceExact(int doc) throws IOException; +} diff --git a/server/src/main/java/org/elasticsearch/index/fielddata/FieldData.java b/server/src/main/java/org/elasticsearch/index/fielddata/FieldData.java index a1ac341b56f..eb569aa4c2b 100644 --- a/server/src/main/java/org/elasticsearch/index/fielddata/FieldData.java +++ b/server/src/main/java/org/elasticsearch/index/fielddata/FieldData.java @@ -24,7 +24,6 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.NumericDocValues; import org.apache.lucene.index.SortedNumericDocValues; import org.apache.lucene.index.SortedSetDocValues; -import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.geo.GeoPoint; @@ -92,109 +91,64 @@ public enum FieldData { } /** - * Returns a {@link Bits} representing all documents from dv that have a value. + * Returns a {@link DocValueBits} representing all documents from values that have a value. */ - public static Bits docsWithValue(final SortedBinaryDocValues dv, final int maxDoc) { - return new Bits() { + public static DocValueBits docsWithValue(final SortedBinaryDocValues values) { + return new DocValueBits() { @Override - public boolean get(int index) { - try { - return dv.advanceExact(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return maxDoc; + public boolean advanceExact(int doc) throws IOException { + return values.advanceExact(doc); } }; } /** - * Returns a {@link Bits} representing all documents from dv + * Returns a {@link DocValueBits} representing all documents from docValues * that have a value. */ - public static Bits docsWithValue(final SortedSetDocValues dv, final int maxDoc) { - return new Bits() { + public static DocValueBits docsWithValue(final SortedSetDocValues docValues) { + return new DocValueBits() { @Override - public boolean get(int index) { - try { - return dv.advanceExact(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return maxDoc; + public boolean advanceExact(int doc) throws IOException { + return docValues.advanceExact(doc); } }; } /** - * Returns a Bits representing all documents from dv that have + * Returns a {@link DocValueBits} representing all documents from pointValues that have * a value. */ - public static Bits docsWithValue(final MultiGeoPointValues dv, final int maxDoc) { - return new Bits() { + public static DocValueBits docsWithValue(final MultiGeoPointValues pointValues) { + return new DocValueBits() { @Override - public boolean get(int index) { - try { - return dv.advanceExact(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return maxDoc; + public boolean advanceExact(int doc) throws IOException { + return pointValues.advanceExact(doc); } }; } /** - * Returns a Bits representing all documents from dv that have a value. + * Returns a {@link DocValueBits} representing all documents from doubleValues that have a value. */ - public static Bits docsWithValue(final SortedNumericDoubleValues dv, final int maxDoc) { - return new Bits() { + public static DocValueBits docsWithValue(final SortedNumericDoubleValues doubleValues) { + return new DocValueBits() { @Override - public boolean get(int index) { - try { - return dv.advanceExact(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return maxDoc; + public boolean advanceExact(int doc) throws IOException { + return doubleValues.advanceExact(doc); } }; } /** - * Returns a Bits representing all documents from dv that have + * Returns a {@link DocValueBits} representing all documents from docValues that have * a value. */ - public static Bits docsWithValue(final SortedNumericDocValues dv, final int maxDoc) { - return new Bits() { + public static DocValueBits docsWithValue(final SortedNumericDocValues docValues) { + return new DocValueBits() { @Override - public boolean get(int index) { - try { - return dv.advanceExact(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return maxDoc; + public boolean advanceExact(int doc) throws IOException { + return docValues.advanceExact(doc); } }; } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregator.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregator.java index 5864f5c5ca7..c4be1eef808 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregator.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/MissingAggregator.java @@ -19,7 +19,7 @@ package org.elasticsearch.search.aggregations.bucket.missing; import org.apache.lucene.index.LeafReaderContext; -import org.apache.lucene.util.Bits; +import org.elasticsearch.index.fielddata.DocValueBits; import org.elasticsearch.search.aggregations.Aggregator; import org.elasticsearch.search.aggregations.AggregatorFactories; import org.elasticsearch.search.aggregations.InternalAggregation; @@ -49,17 +49,21 @@ public class MissingAggregator extends BucketsAggregator implements SingleBucket @Override public LeafBucketCollector getLeafCollector(LeafReaderContext ctx, final LeafBucketCollector sub) throws IOException { - - final Bits docsWithValue; + final DocValueBits docsWithValue; if (valuesSource != null) { docsWithValue = valuesSource.docsWithValue(ctx); } else { - docsWithValue = new Bits.MatchNoBits(ctx.reader().maxDoc()); + docsWithValue = new DocValueBits() { + @Override + public boolean advanceExact(int doc) throws IOException { + return false; + } + }; } return new LeafBucketCollectorBase(sub, docsWithValue) { @Override public void collect(int doc, long bucket) throws IOException { - if (docsWithValue != null && !docsWithValue.get(doc)) { + if (docsWithValue.advanceExact(doc) == false) { collectBucket(sub, doc, bucket); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java index 6dc2758fa5c..c3b67f1c9b3 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSource.java @@ -27,12 +27,12 @@ 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.common.util.CollectionUtils; import org.elasticsearch.index.fielddata.AbstractSortingNumericDocValues; import org.elasticsearch.index.fielddata.AtomicOrdinalsFieldData; +import org.elasticsearch.index.fielddata.DocValueBits; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.fielddata.IndexNumericFieldData; @@ -58,7 +58,7 @@ public abstract class ValuesSource { */ public abstract SortedBinaryDocValues bytesValues(LeafReaderContext context) throws IOException; - public abstract Bits docsWithValue(LeafReaderContext context) throws IOException; + public abstract DocValueBits docsWithValue(LeafReaderContext context) throws IOException; /** Whether this values source needs scores. */ public boolean needsScores() { @@ -68,10 +68,9 @@ public abstract class ValuesSource { public abstract static class Bytes extends ValuesSource { @Override - public Bits docsWithValue(LeafReaderContext context) throws IOException { + public DocValueBits docsWithValue(LeafReaderContext context) throws IOException { final SortedBinaryDocValues bytes = bytesValues(context); - return org.elasticsearch.index.fielddata.FieldData.docsWithValue(bytes, - context.reader().maxDoc()); + return org.elasticsearch.index.fielddata.FieldData.docsWithValue(bytes); } public abstract static class WithOrdinals extends Bytes { @@ -101,10 +100,9 @@ public abstract class ValuesSource { }; @Override - public Bits docsWithValue(LeafReaderContext context) throws IOException { + public DocValueBits docsWithValue(LeafReaderContext context) throws IOException { final SortedSetDocValues ordinals = ordinalsValues(context); - return org.elasticsearch.index.fielddata.FieldData.docsWithValue(ordinals, - context.reader().maxDoc()); + return org.elasticsearch.index.fielddata.FieldData.docsWithValue(ordinals); } public abstract SortedSetDocValues ordinalsValues(LeafReaderContext context) @@ -241,15 +239,13 @@ public abstract class ValuesSource { public abstract SortedNumericDoubleValues doubleValues(LeafReaderContext context) throws IOException; @Override - public Bits docsWithValue(LeafReaderContext context) throws IOException { + public DocValueBits docsWithValue(LeafReaderContext context) throws IOException { if (isFloatingPoint()) { final SortedNumericDoubleValues values = doubleValues(context); - return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values, - context.reader().maxDoc()); + return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values); } else { final SortedNumericDocValues values = longValues(context); - return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values, - context.reader().maxDoc()); + return org.elasticsearch.index.fielddata.FieldData.docsWithValue(values); } } @@ -493,10 +489,9 @@ public abstract class ValuesSource { }; @Override - public Bits docsWithValue(LeafReaderContext context) { + public DocValueBits docsWithValue(LeafReaderContext context) throws IOException { final MultiGeoPointValues geoPoints = geoPointValues(context); - return org.elasticsearch.index.fielddata.FieldData.docsWithValue(geoPoints, - context.reader().maxDoc()); + return org.elasticsearch.index.fielddata.FieldData.docsWithValue(geoPoints); } public abstract MultiGeoPointValues geoPointValues(LeafReaderContext context);