You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/09/21 13:42:06 UTC
[02/16] lucene-solr:master: LUCENE-7407: switch doc values usage to
an iterator API, based on DocIdSetIterator, instead of random acces,
freeing codecs for future improvements
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
index fb93417..ffed5f4 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
@@ -29,7 +29,6 @@ import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.search.SimpleCollector;
import org.apache.lucene.util.BitUtil;
-import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.LongValues;
import org.apache.solr.common.SolrException;
@@ -353,9 +352,11 @@ class FacetFieldProcessorByHashDV extends FacetFieldProcessor {
@Override
public void collect(int segDoc) throws IOException {
- long ord = docValues.getOrd(segDoc);
- if (ord != -1) {
- long val = toGlobal.get(ord);
+ if (segDoc > docValues.docID()) {
+ docValues.advance(segDoc);
+ }
+ if (segDoc == docValues.docID()) {
+ long val = toGlobal.get(docValues.ordValue());
collectValFirstPhase(segDoc, val);
}
}
@@ -366,7 +367,6 @@ class FacetFieldProcessorByHashDV extends FacetFieldProcessor {
// TODO support SortedNumericDocValues
DocSetUtil.collectSortedDocSet(fcontext.base, fcontext.searcher.getIndexReader(), new SimpleCollector() {
NumericDocValues values = null; //NN
- Bits docsWithField = null; //NN
@Override public boolean needsScores() { return false; }
@@ -374,14 +374,15 @@ class FacetFieldProcessorByHashDV extends FacetFieldProcessor {
protected void doSetNextReader(LeafReaderContext ctx) throws IOException {
setNextReaderFirstPhase(ctx);
values = DocValues.getNumeric(ctx.reader(), sf.getName());
- docsWithField = DocValues.getDocsWithField(ctx.reader(), sf.getName());
}
@Override
public void collect(int segDoc) throws IOException {
- long val = values.get(segDoc);
- if (val != 0 || docsWithField.get(segDoc)) {
- collectValFirstPhase(segDoc, val);
+ if (segDoc > values.docID()) {
+ values.advance(segDoc);
+ }
+ if (segDoc == values.docID()) {
+ collectValFirstPhase(segDoc, values.longValue());
}
}
});
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java b/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java
index 89e2386..005e9fc 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java
@@ -22,7 +22,6 @@ import org.apache.solr.util.hll.HLLType;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.util.Bits;
import org.apache.solr.common.util.Hash;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.schema.SchemaField;
@@ -112,7 +111,6 @@ public class HLLAgg extends StrAggValueSource {
SchemaField sf;
HLL[] sets;
NumericDocValues values;
- Bits exists;
public NumericAcc(FacetContext fcontext, String field, int numSlots) throws IOException {
super(fcontext);
@@ -133,15 +131,20 @@ public class HLLAgg extends StrAggValueSource {
@Override
public void setNextReader(LeafReaderContext readerContext) throws IOException {
values = DocValues.getNumeric(readerContext.reader(), sf.getName());
- exists = DocValues.getDocsWithField(readerContext.reader(), sf.getName());
}
@Override
public void collect(int doc, int slot) throws IOException {
- long val = values.get(doc);
- if (val == 0 && !exists.get(doc)) {
+ int valuesDocID = values.docID();
+ if (valuesDocID < doc) {
+ valuesDocID = values.advance(doc);
+ }
+ if (valuesDocID > doc) {
return;
}
+ assert valuesDocID == doc;
+
+ long val = values.longValue();
long hash = Hash.fmix64(val);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/PercentileAgg.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/PercentileAgg.java b/solr/core/src/java/org/apache/solr/search/facet/PercentileAgg.java
index a1f44f0..7f063b2 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/PercentileAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/PercentileAgg.java
@@ -109,7 +109,7 @@ public class PercentileAgg extends SimpleAggValueSource {
digests = new AVLTreeDigest[numSlots];
}
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
if (!values.exists(doc)) return;
double val = values.doubleVal(doc);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
index de1636e..4f4851b 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
@@ -265,7 +265,7 @@ class SumSlotAcc extends DoubleFuncSlotAcc {
super(values, fcontext, numSlots);
}
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
double val = values.doubleVal(doc); // todo: worth trying to share this value across multiple stats that need it?
result[slotNum] += val;
}
@@ -277,7 +277,7 @@ class SumsqSlotAcc extends DoubleFuncSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
double val = values.doubleVal(doc);
val = val * val;
result[slotNum] += val;
@@ -292,7 +292,7 @@ class MinSlotAcc extends DoubleFuncSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
double val = values.doubleVal(doc);
if (val == 0 && !values.exists(doc)) return; // depend on fact that non existing values return 0 for func query
@@ -309,7 +309,7 @@ class MaxSlotAcc extends DoubleFuncSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
double val = values.doubleVal(doc);
if (val == 0 && !values.exists(doc)) return; // depend on fact that non existing values return 0 for func query
@@ -339,7 +339,7 @@ class AvgSlotAcc extends DoubleFuncSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
+ public void collect(int doc, int slotNum) throws IOException {
double val = values.doubleVal(doc);
if (val != 0 || values.exists(doc)) {
result[slotNum] += val;
@@ -466,4 +466,4 @@ class SortSlotAcc extends SlotAcc {
// sort slot only works with direct-mapped accumulators
throw new UnsupportedOperationException();
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
index 341bdaf..a18eb0f 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
@@ -25,7 +25,6 @@ import java.util.Set;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.util.Bits;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.schema.SchemaField;
@@ -192,7 +191,6 @@ public class UniqueAgg extends StrAggValueSource {
SchemaField sf;
LongSet[] sets;
NumericDocValues values;
- Bits exists;
public NumericAcc(FacetContext fcontext, String field, int numSlots) throws IOException {
super(fcontext);
@@ -213,15 +211,19 @@ public class UniqueAgg extends StrAggValueSource {
@Override
public void setNextReader(LeafReaderContext readerContext) throws IOException {
values = DocValues.getNumeric(readerContext.reader(), sf.getName());
- exists = DocValues.getDocsWithField(readerContext.reader(), sf.getName());
}
@Override
public void collect(int doc, int slot) throws IOException {
- long val = values.get(doc);
- if (val == 0 && !exists.get(doc)) {
+ int valuesDocID = values.docID();
+ if (valuesDocID < doc) {
+ valuesDocID = values.advance(doc);
+ }
+ if (valuesDocID > doc) {
+ // missing
return;
}
+ long val = values.longValue();
LongSet set = sets[slot];
if (set == null) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
index 4c29753..c52df36 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
@@ -66,21 +66,26 @@ class UniqueMultiDvSlotAcc extends UniqueSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
- subDv.setDocument(doc);
- int segOrd = (int) subDv.nextOrd();
- if (segOrd < 0) return;
-
- FixedBitSet bits = arr[slotNum];
- if (bits == null) {
- bits = new FixedBitSet(nTerms);
- arr[slotNum] = bits;
+ public void collect(int doc, int slotNum) throws IOException {
+ if (doc > subDv.docID()) {
+ subDv.advance(doc);
}
+ if (doc == subDv.docID()) {
+
+ int segOrd = (int) subDv.nextOrd();
+ assert segOrd >= 0;
+
+ FixedBitSet bits = arr[slotNum];
+ if (bits == null) {
+ bits = new FixedBitSet(nTerms);
+ arr[slotNum] = bits;
+ }
- do {
- int ord = toGlobal == null ? segOrd : (int) toGlobal.get(segOrd);
- bits.set(ord);
- segOrd = (int) subDv.nextOrd();
- } while (segOrd >= 0);
+ do {
+ int ord = toGlobal == null ? segOrd : (int) toGlobal.get(segOrd);
+ bits.set(ord);
+ segOrd = (int) subDv.nextOrd();
+ } while (segOrd >= 0);
+ }
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
index c67fd47..870b894 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
@@ -66,16 +66,20 @@ class UniqueSinglevaluedSlotAcc extends UniqueSlotAcc {
}
@Override
- public void collect(int doc, int slotNum) {
- int segOrd = subDv.getOrd(doc);
- if (segOrd < 0) return; // -1 means missing
- int ord = toGlobal==null ? segOrd : (int)toGlobal.get(segOrd);
+ public void collect(int doc, int slotNum) throws IOException {
+ if (doc > subDv.docID()) {
+ subDv.advance(doc);
+ }
+ if (doc == subDv.docID()) {
+ int segOrd = subDv.ordValue();
+ int ord = toGlobal==null ? segOrd : (int)toGlobal.get(segOrd);
- FixedBitSet bits = arr[slotNum];
- if (bits == null) {
- bits = new FixedBitSet(nTerms);
- arr[slotNum] = bits;
+ FixedBitSet bits = arr[slotNum];
+ if (bits == null) {
+ bits = new FixedBitSet(nTerms);
+ arr[slotNum] = bits;
+ }
+ bits.set(ord);
}
- bits.set(ord);
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
index 3b63bd9..40d9948 100644
--- a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
@@ -97,16 +97,33 @@ public class OrdFieldSource extends ValueSource {
// if it's e.g. tokenized/multivalued, emulate old behavior of single-valued fc
final SortedDocValues sindex = SortedSetSelector.wrap(DocValues.getSortedSet(r, field), SortedSetSelector.Type.MIN);
return new IntDocValues(this) {
+
+ private int lastDocID;
+
+ private int getOrdForDoc(int docID) throws IOException {
+ if (docID < lastDocID) {
+ throw new IllegalArgumentException("docs out of order: lastDocID=" + lastDocID + " docID=" + docID);
+ }
+ if (docID > sindex.docID()) {
+ sindex.advance(docID);
+ }
+ if (docID == sindex.docID()) {
+ return sindex.ordValue();
+ } else {
+ return -1;
+ }
+ }
+
protected String toTerm(String readableValue) {
return readableValue;
}
@Override
- public int intVal(int doc) {
- return sindex.getOrd(doc+off);
+ public int intVal(int doc) throws IOException {
+ return getOrdForDoc(doc+off);
}
@Override
- public int ordVal(int doc) {
- return sindex.getOrd(doc+off);
+ public int ordVal(int doc) throws IOException {
+ return getOrdForDoc(doc+off);
}
@Override
public int numOrd() {
@@ -114,8 +131,8 @@ public class OrdFieldSource extends ValueSource {
}
@Override
- public boolean exists(int doc) {
- return sindex.getOrd(doc+off) != 0;
+ public boolean exists(int doc) throws IOException {
+ return getOrdForDoc(doc+off) != 0;
}
@Override
@@ -129,8 +146,8 @@ public class OrdFieldSource extends ValueSource {
}
@Override
- public void fillValue(int doc) {
- mval.value = sindex.getOrd(doc);
+ public void fillValue(int doc) throws IOException {
+ mval.value = getOrdForDoc(doc);
mval.exists = mval.value!=0;
}
};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
index abc9f95..4417000 100644
--- a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
@@ -99,9 +99,16 @@ public class ReverseOrdFieldSource extends ValueSource {
final int end = sindex.getValueCount();
return new IntDocValues(this) {
- @Override
- public int intVal(int doc) {
- return (end - sindex.getOrd(doc+off) - 1);
+ @Override
+ public int intVal(int doc) throws IOException {
+ if (doc+off > sindex.docID()) {
+ sindex.advance(doc+off);
+ }
+ if (doc+off == sindex.docID()) {
+ return (end - sindex.ordValue() - 1);
+ } else {
+ return end;
+ }
}
};
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/SolrComparisonBoolFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/SolrComparisonBoolFunction.java b/solr/core/src/java/org/apache/solr/search/function/SolrComparisonBoolFunction.java
index c994fbb..64be371 100644
--- a/solr/core/src/java/org/apache/solr/search/function/SolrComparisonBoolFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/SolrComparisonBoolFunction.java
@@ -17,6 +17,8 @@
package org.apache.solr.search.function;
+import java.io.IOException;
+
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.docvalues.IntDocValues;
@@ -41,7 +43,7 @@ public class SolrComparisonBoolFunction extends ComparisonBoolFunction {
}
@Override
- public boolean compare(int doc, FunctionValues lhs, FunctionValues rhs) {
+ public boolean compare(int doc, FunctionValues lhs, FunctionValues rhs) throws IOException {
// TODO consider a separate FunctionValues impl, one for Long, one for Double
// performs the safest possible numeric comparison, if both lhs and rhs are Longs, then
// we perform a Long comparison to avoid the issues with precision when casting to doubles
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
index b00f2fd..4e38843 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
@@ -53,12 +53,12 @@ public class GeohashFunction extends ValueSource {
return new FunctionValues() {
@Override
- public String strVal(int doc) {
+ public String strVal(int doc) throws IOException {
return GeohashUtils.encodeLatLon(latDV.doubleVal(doc), lonDV.doubleVal(doc));
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(name()).append('(');
sb.append(latDV.toString(doc)).append(',').append(lonDV.toString(doc));
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
index 915db33..40c7aa7 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
@@ -65,11 +65,11 @@ public class GeohashHaversineFunction extends ValueSource {
return new DoubleDocValues(this) {
@Override
- public double doubleVal(int doc) {
+ public double doubleVal(int doc) throws IOException {
return distance(doc, gh1DV, gh2DV);
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(name()).append('(');
sb.append(gh1DV.toString(doc)).append(',').append(gh2DV.toString(doc));
@@ -79,7 +79,7 @@ public class GeohashHaversineFunction extends ValueSource {
};
}
- protected double distance(int doc, FunctionValues gh1DV, FunctionValues gh2DV) {
+ protected double distance(int doc, FunctionValues gh1DV, FunctionValues gh2DV) throws IOException {
double result = 0;
String h1 = gh1DV.strVal(doc);
String h2 = gh2DV.strVal(doc);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
index 4b68f5c..e489ff4 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
@@ -65,7 +65,7 @@ public class HaversineConstFunction extends ValueSource {
return new DoubleDocValues(this) {
@Override
- public double doubleVal(int doc) {
+ public double doubleVal(int doc) throws IOException {
double latRad = latVals.doubleVal(doc) * DEGREES_TO_RADIANS;
double lonRad = lonVals.doubleVal(doc) * DEGREES_TO_RADIANS;
double diffX = latCenterRad - latRad;
@@ -77,7 +77,7 @@ public class HaversineConstFunction extends ValueSource {
return (EARTH_MEAN_DIAMETER * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h)));
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
return name() + '(' + latVals.toString(doc) + ',' + lonVals.toString(doc) + ',' + latCenter + ',' + lonCenter + ')';
}
};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
index 20ed5a7..1697f2b 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
@@ -67,7 +67,7 @@ public class HaversineFunction extends ValueSource {
* @param doc The doc to score
* @return The haversine distance formula
*/
- protected double distance(int doc, FunctionValues p1DV, FunctionValues p2DV) {
+ protected double distance(int doc, FunctionValues p1DV, FunctionValues p2DV) throws IOException {
double[] p1D = new double[2];
double[] p2D = new double[2];
@@ -99,11 +99,11 @@ public class HaversineFunction extends ValueSource {
final FunctionValues vals2 = p2.getValues(context, readerContext);
return new DoubleDocValues(this) {
@Override
- public double doubleVal(int doc) {
+ public double doubleVal(int doc) throws IOException {
return distance(doc, vals1, vals2);
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(name()).append('(');
sb.append(vals1.toString(doc)).append(',').append(vals2.toString(doc));
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/SquaredEuclideanFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/SquaredEuclideanFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/SquaredEuclideanFunction.java
index 75c7fc0..381a526 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/SquaredEuclideanFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/SquaredEuclideanFunction.java
@@ -15,6 +15,8 @@
* limitations under the License.
*/
package org.apache.solr.search.function.distance;
+import java.io.IOException;
+
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.valuesource.MultiValueSource;
@@ -40,7 +42,7 @@ public class SquaredEuclideanFunction extends VectorDistanceFunction {
* @param doc The doc to score
*/
@Override
- protected double distance(int doc, FunctionValues dv1, FunctionValues dv2) {
+ protected double distance(int doc, FunctionValues dv1, FunctionValues dv2) throws IOException {
double[] vals1 = new double[source1.dimension()];
double[] vals2 = new double[source1.dimension()];
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
index ed94e31..8bf9f1a 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
@@ -49,7 +49,7 @@ public class StringDistanceFunction extends ValueSource {
return new FloatDocValues(this) {
@Override
- public float floatVal(int doc) {
+ public float floatVal(int doc) throws IOException {
String s1 = str1DV.strVal(doc);
String s2 = str2DV.strVal(doc);
if (null == s1 || null == s2) {
@@ -60,12 +60,12 @@ public class StringDistanceFunction extends ValueSource {
}
@Override
- public boolean exists(int doc) {
+ public boolean exists(int doc) throws IOException {
return str1DV.exists(doc) && str2DV.exists(doc);
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append("strdist").append('(');
sb.append(str1DV.toString(doc)).append(',').append(str2DV.toString(doc))
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
index f988882..474ece3 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
@@ -67,7 +67,7 @@ public class VectorDistanceFunction extends ValueSource {
* @param dv2 The values from the second MultiValueSource
* @return The distance
*/
- protected double distance(int doc, FunctionValues dv1, FunctionValues dv2) {
+ protected double distance(int doc, FunctionValues dv1, FunctionValues dv2) throws IOException {
//Handle some special cases:
double[] vals1 = new double[source1.dimension()];
double[] vals2 = new double[source1.dimension()];
@@ -159,12 +159,12 @@ public class VectorDistanceFunction extends ValueSource {
return new DoubleDocValues(this) {
@Override
- public double doubleVal(int doc) {
+ public double doubleVal(int doc) throws IOException {
return distance(doc, vals1, vals2);
}
@Override
- public String toString(int doc) {
+ public String toString(int doc) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(name()).append('(').append(power).append(',');
boolean firstTime = true;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
index 286cd45..dee1f60 100644
--- a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
+++ b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
@@ -21,8 +21,8 @@ import java.util.Arrays;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.MultiDocValues;
import org.apache.lucene.index.MultiDocValues.OrdinalMap;
+import org.apache.lucene.index.MultiDocValues;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.util.ArrayUtil;
@@ -66,10 +66,12 @@ class BlockJoinFieldFacetAccumulator {
}
} else {
SortedDocValues single = searcher.getLeafReader().getSortedDocValues(fieldName);
- topSSDV = single == null ? null : DocValues.singleton(single);// npe friendly code
if (single instanceof MultiDocValues.MultiSortedDocValues) {
ordinalMap = ((MultiDocValues.MultiSortedDocValues) single).mapping;
}
+ if (single != null) {
+ topSSDV = DocValues.singleton(single);
+ }
}
}
@@ -135,18 +137,31 @@ class BlockJoinFieldFacetAccumulator {
// some codecs may optimize SORTED_SET storage for single-valued fields
for (iter.reset(); iter.hasNext(); ) {
final int docNum = iter.nextDoc();
- int term = segmentSDV.getOrd(docNum);
+ if (docNum > segmentSDV.docID()) {
+ segmentSDV.advance(docNum);
+ }
+
+ int term;
+ if (docNum == segmentSDV.docID()) {
+ term = segmentSDV.ordValue();
+ } else {
+ term = -1;
+ }
accumulateTermOrd(term, iter.getAggKey());
//System.out.println("doc# "+docNum+" "+fieldName+" term# "+term+" tick "+Long.toHexString(segmentAccums[1+term]));
}
} else {
for (iter.reset(); iter.hasNext(); ) {
final int docNum = iter.nextDoc();
- segmentSSDV.setDocument(docNum);
- int term = (int) segmentSSDV.nextOrd();
- do { // absent values are designated by term=-1, first iteration counts [0] as "missing", and exit, otherwise it spins
- accumulateTermOrd(term, iter.getAggKey());
- } while (term>=0 && (term = (int) segmentSSDV.nextOrd()) >= 0);
+ if (docNum > segmentSSDV.docID()) {
+ segmentSSDV.advance(docNum);
+ }
+ if (docNum == segmentSSDV.docID()) {
+ int term = (int) segmentSSDV.nextOrd();
+ do { // absent values are designated by term=-1, first iteration counts [0] as "missing", and exit, otherwise it spins
+ accumulateTermOrd(term, iter.getAggKey());
+ } while (term>=0 && (term = (int) segmentSSDV.nextOrd()) >= 0);
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/search/join/GraphTermsCollector.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/join/GraphTermsCollector.java b/solr/core/src/java/org/apache/solr/search/join/GraphTermsCollector.java
index 33a03f4..377f71b 100644
--- a/solr/core/src/java/org/apache/solr/search/join/GraphTermsCollector.java
+++ b/solr/core/src/java/org/apache/solr/search/join/GraphTermsCollector.java
@@ -89,14 +89,18 @@ class GraphTermsCollector extends SimpleCollector implements Collector {
private void addEdgeIdsToResult(int doc) throws IOException {
// set the doc to pull the edges ids for.
- docTermOrds.setDocument(doc);
- BytesRef edgeValue = new BytesRef();
- long ord;
- while ((ord = docTermOrds.nextOrd()) != SortedSetDocValues.NO_MORE_ORDS) {
- // TODO: handle non string type fields.
- edgeValue = docTermOrds.lookupOrd(ord);
- // add the edge id to the collector terms.
- collectorTerms.add(edgeValue);
+ if (doc > docTermOrds.docID()) {
+ docTermOrds.advance(doc);
+ }
+ if (doc == docTermOrds.docID()) {
+ BytesRef edgeValue = new BytesRef();
+ long ord;
+ while ((ord = docTermOrds.nextOrd()) != SortedSetDocValues.NO_MORE_ORDS) {
+ // TODO: handle non string type fields.
+ edgeValue = docTermOrds.lookupOrd(ord);
+ // add the edge id to the collector terms.
+ collectorTerms.add(edgeValue);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java b/solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java
index 4b60dba..fcc6974 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java
@@ -27,6 +27,8 @@ import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LegacySortedSetDocValues;
+import org.apache.lucene.index.LegacySortedSetDocValuesWrapper;
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.index.Terms;
@@ -745,11 +747,11 @@ public class DocTermOrds implements Accountable {
if (isEmpty()) {
return DocValues.emptySortedSet();
} else {
- return new Iterator(reader);
+ return new LegacySortedSetDocValuesWrapper(new Iterator(reader), reader.maxDoc());
}
}
- private class Iterator extends SortedSetDocValues {
+ private class Iterator extends LegacySortedSetDocValues {
final LeafReader reader;
final TermsEnum te; // used internally for lookupOrd() and lookupTerm()
// currently we read 5 at a time (using the logic of the old iterator)
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/uninverting/FieldCache.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/uninverting/FieldCache.java b/solr/core/src/java/org/apache/solr/uninverting/FieldCache.java
index be08a60..ea8f6ea 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/FieldCache.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/FieldCache.java
@@ -20,9 +20,9 @@ import java.io.IOException;
import java.io.PrintStream;
import org.apache.lucene.document.NumericDocValuesField;
-import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.BinaryDocValues;
import org.apache.lucene.index.IndexReader; // javadocs
+import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
@@ -280,14 +280,11 @@ interface FieldCache {
* Computes long for string values. May be {@code null} if the
* requested field was indexed as {@link NumericDocValuesField} or
* {@link org.apache.lucene.legacy.LegacyLongField}.
- * @param setDocsWithField
- * If true then {@link #getDocsWithField} will also be computed and
- * stored in the FieldCache.
* @return The values in the given field for each document.
* @throws IOException
* If any error occurs.
*/
- public NumericDocValues getNumerics(LeafReader reader, String field, Parser parser, boolean setDocsWithField) throws IOException;
+ public NumericDocValues getNumerics(LeafReader reader, String field, Parser parser) throws IOException;
/** Checks the internal cache for an appropriate entry, and if none
* is found, reads the term values in <code>field</code>
@@ -295,19 +292,17 @@ interface FieldCache {
* method to retrieve the term (as a BytesRef) per document.
* @param reader Used to get field values.
* @param field Which field contains the strings.
- * @param setDocsWithField If true then {@link #getDocsWithField} will
- * also be computed and stored in the FieldCache.
* @return The values in the given field for each document.
* @throws IOException If any error occurs.
*/
- public BinaryDocValues getTerms(LeafReader reader, String field, boolean setDocsWithField) throws IOException;
+ public BinaryDocValues getTerms(LeafReader reader, String field) throws IOException;
- /** Expert: just like {@link #getTerms(org.apache.lucene.index.LeafReader,String,boolean)},
+ /** Expert: just like {@link #getTerms(org.apache.lucene.index.LeafReader,String)},
* but you can specify whether more RAM should be consumed in exchange for
* faster lookups (default is "true"). Note that the
* first call for a given reader and field "wins",
* subsequent calls will share the same cache entry. */
- public BinaryDocValues getTerms(LeafReader reader, String field, boolean setDocsWithField, float acceptableOverheadRatio) throws IOException;
+ public BinaryDocValues getTerms(LeafReader reader, String field, float acceptableOverheadRatio) throws IOException;
/** Checks the internal cache for an appropriate entry, and if none
* is found, reads the term values in <code>field</code>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
index e6a066d..ab14785 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
@@ -29,14 +29,14 @@ import java.util.WeakHashMap;
import org.apache.lucene.index.BinaryDocValues;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.DocValuesType;
-import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.index.PointValues;
import org.apache.lucene.index.PointValues.IntersectVisitor;
import org.apache.lucene.index.PointValues.Relation;
+import org.apache.lucene.index.PointValues;
+import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.SegmentReader;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
@@ -134,7 +134,7 @@ class FieldCacheImpl implements FieldCache {
final Map<Object,Map<CacheKey,Accountable>> readerCache = new WeakHashMap<>();
- protected abstract Accountable createValue(LeafReader reader, CacheKey key, boolean setDocsWithField)
+ protected abstract Accountable createValue(LeafReader reader, CacheKey key)
throws IOException;
/** Remove this reader from the cache, if present. */
@@ -165,7 +165,7 @@ class FieldCacheImpl implements FieldCache {
}
}
- public Object get(LeafReader reader, CacheKey key, boolean setDocsWithField) throws IOException {
+ public Object get(LeafReader reader, CacheKey key) throws IOException {
Map<CacheKey,Accountable> innerCache;
Accountable value;
final Object readerKey = reader.getCoreCacheKey();
@@ -189,7 +189,7 @@ class FieldCacheImpl implements FieldCache {
synchronized (value) {
CreationPlaceholder progress = (CreationPlaceholder) value;
if (progress.value == null) {
- progress.value = createValue(reader, key, setDocsWithField);
+ progress.value = createValue(reader, key);
synchronized (readerCache) {
innerCache.put(key, progress.value);
}
@@ -272,31 +272,31 @@ class FieldCacheImpl implements FieldCache {
this.points = points;
}
- final void uninvert(LeafReader reader, String field, boolean setDocsWithField) throws IOException {
+ final void uninvert(LeafReader reader, String field) throws IOException {
if (points) {
- uninvertPoints(reader, field, setDocsWithField);
+ uninvertPoints(reader, field);
} else {
- uninvertPostings(reader, field, setDocsWithField);
+ uninvertPostings(reader, field);
}
}
- final void uninvertPoints(LeafReader reader, String field, boolean setDocsWithField) throws IOException {
+ final void uninvertPoints(LeafReader reader, String field) throws IOException {
final int maxDoc = reader.maxDoc();
PointValues values = reader.getPointValues();
assert values != null;
assert values.size(field) > 0;
-
- if (setDocsWithField) {
- final int docCount = values.getDocCount(field);
- assert docCount <= maxDoc;
- if (docCount == maxDoc) {
- // Fast case: all docs have this field:
- this.docsWithField = new Bits.MatchAllBits(maxDoc);
- setDocsWithField = false;
- }
+
+ final boolean setDocsWithField;
+ final int docCount = values.getDocCount(field);
+ assert docCount <= maxDoc;
+ if (docCount == maxDoc) {
+ // Fast case: all docs have this field:
+ this.docsWithField = new Bits.MatchAllBits(maxDoc);
+ setDocsWithField = false;
+ } else {
+ setDocsWithField = true;
}
- final boolean doDocsWithField = setDocsWithField;
BytesRef scratch = new BytesRef();
values.intersect(field, new IntersectVisitor() {
@Override
@@ -310,7 +310,7 @@ class FieldCacheImpl implements FieldCache {
scratch.length = packedValue.length;
visitTerm(scratch);
visitDoc(docID);
- if (doDocsWithField) {
+ if (setDocsWithField) {
if (docsWithField == null) {
// Lazy init
docsWithField = new FixedBitSet(maxDoc);
@@ -326,18 +326,19 @@ class FieldCacheImpl implements FieldCache {
});
}
- final void uninvertPostings(LeafReader reader, String field, boolean setDocsWithField) throws IOException {
+ final void uninvertPostings(LeafReader reader, String field) throws IOException {
final int maxDoc = reader.maxDoc();
Terms terms = reader.terms(field);
if (terms != null) {
- if (setDocsWithField) {
- final int termsDocCount = terms.getDocCount();
- assert termsDocCount <= maxDoc;
- if (termsDocCount == maxDoc) {
- // Fast case: all docs have this field:
- this.docsWithField = new Bits.MatchAllBits(maxDoc);
- setDocsWithField = false;
- }
+ final boolean setDocsWithField;
+ final int termsDocCount = terms.getDocCount();
+ assert termsDocCount <= maxDoc;
+ if (termsDocCount == maxDoc) {
+ // Fast case: all docs have this field:
+ this.docsWithField = new Bits.MatchAllBits(maxDoc);
+ setDocsWithField = false;
+ } else {
+ setDocsWithField = true;
}
final TermsEnum termsEnum = termsEnum(terms);
@@ -418,25 +419,25 @@ class FieldCacheImpl implements FieldCache {
public long minValue;
}
+ @Override
public Bits getDocsWithField(LeafReader reader, String field, Parser parser) throws IOException {
final FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field);
if (fieldInfo == null) {
// field does not exist or has no value
return new Bits.MatchNoBits(reader.maxDoc());
- } else if (fieldInfo.getDocValuesType() != DocValuesType.NONE) {
- return reader.getDocsWithField(field);
}
- if (parser instanceof PointParser) {
+ if (fieldInfo.getDocValuesType() != DocValuesType.NONE) {
+ // doc values case
+ } else if (parser instanceof PointParser) {
// points case
-
} else {
// postings case
if (fieldInfo.getIndexOptions() == IndexOptions.NONE) {
return new Bits.MatchNoBits(reader.maxDoc());
}
}
- BitsEntry bitsEntry = (BitsEntry) caches.get(DocsWithFieldCache.class).get(reader, new CacheKey(field, parser), false);
+ BitsEntry bitsEntry = (BitsEntry) caches.get(DocsWithFieldCache.class).get(reader, new CacheKey(field, parser));
return bitsEntry.bits;
}
@@ -464,16 +465,56 @@ class FieldCacheImpl implements FieldCache {
}
@Override
- protected BitsEntry createValue(LeafReader reader, CacheKey key, boolean setDocsWithField /* ignored */) throws IOException {
+ protected BitsEntry createValue(LeafReader reader, CacheKey key) throws IOException {
final String field = key.field;
final Parser parser = (Parser) key.custom;
- if (parser instanceof PointParser) {
+ FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field);
+ if (fieldInfo.getDocValuesType() != DocValuesType.NONE) {
+ return createValueDocValues(reader, field);
+ } else if (parser instanceof PointParser) {
return createValuePoints(reader, field);
} else {
return createValuePostings(reader, field);
}
}
-
+
+ private BitsEntry createValueDocValues(LeafReader reader, String field) throws IOException {
+ FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field);
+
+ DocValuesType dvType = fieldInfo.getDocValuesType();
+ DocIdSetIterator iterator;
+ switch(dvType) {
+ case NUMERIC:
+ iterator = reader.getNumericDocValues(field);
+ break;
+ case BINARY:
+ iterator = reader.getBinaryDocValues(field);
+ break;
+ case SORTED:
+ iterator = reader.getSortedDocValues(field);
+ break;
+ case SORTED_NUMERIC:
+ iterator = reader.getSortedNumericDocValues(field);
+ break;
+ case SORTED_SET:
+ iterator = reader.getSortedSetDocValues(field);
+ break;
+ default:
+ throw new AssertionError();
+ }
+
+ FixedBitSet bits = new FixedBitSet(reader.maxDoc());
+ while (true) {
+ int docID = iterator.nextDoc();
+ if (docID == DocIdSetIterator.NO_MORE_DOCS) {
+ break;
+ }
+ bits.set(docID);
+ }
+
+ return new BitsEntry(bits);
+ }
+
private BitsEntry createValuePoints(LeafReader reader, String field) throws IOException {
final int maxDoc = reader.maxDoc();
PointValues values = reader.getPointValues();
@@ -500,7 +541,7 @@ class FieldCacheImpl implements FieldCache {
@Override
protected void visitDoc(int docID) {}
};
- u.uninvert(reader, field, true);
+ u.uninvert(reader, field);
return new BitsEntry(u.docsWithField);
}
@@ -553,16 +594,14 @@ class FieldCacheImpl implements FieldCache {
return new BitsEntry(res);
}
}
-
+
@Override
- public NumericDocValues getNumerics(LeafReader reader, String field, Parser parser, boolean setDocsWithField) throws IOException {
+ public NumericDocValues getNumerics(LeafReader reader, String field, Parser parser) throws IOException {
if (parser == null) {
throw new NullPointerException();
}
final NumericDocValues valuesIn = reader.getNumericDocValues(field);
if (valuesIn != null) {
- // Not cached here by FieldCacheImpl (cached instead
- // per-thread by SegmentReader):
return valuesIn;
} else {
final FieldInfo info = reader.getFieldInfos().fieldInfo(field);
@@ -597,28 +636,77 @@ class FieldCacheImpl implements FieldCache {
return DocValues.emptyNumeric();
}
}
- return (NumericDocValues) caches.get(Long.TYPE).get(reader, new CacheKey(field, parser), setDocsWithField);
+
+ Bits docsWithField = getDocsWithField(reader, field, parser);
+ return ((LongsFromArray) caches.get(Long.TYPE).get(reader, new CacheKey(field, parser))).iterator(docsWithField);
}
}
- static class LongsFromArray extends NumericDocValues implements Accountable {
+ static class LongsFromArray implements Accountable {
private final PackedInts.Reader values;
private final long minValue;
+ private final String field;
- public LongsFromArray(PackedInts.Reader values, long minValue) {
+ public LongsFromArray(String field, PackedInts.Reader values, long minValue) {
+ this.field = field;
this.values = values;
this.minValue = minValue;
}
@Override
- public long get(int docID) {
- return minValue + values.get(docID);
- }
-
- @Override
public long ramBytesUsed() {
return values.ramBytesUsed() + RamUsageEstimator.NUM_BYTES_OBJECT_REF + Long.BYTES;
}
+
+ public NumericDocValues iterator(final Bits docsWithField) {
+ return new NumericDocValues() {
+ int docID = -1;
+
+ @Override
+ public int docID() {
+ return docID;
+ }
+
+ @Override
+ public int nextDoc() {
+ while (true) {
+ docID++;
+ if (docID >= values.size()) {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ if (docsWithField.get(docID)) {
+ return docID;
+ }
+ }
+ }
+
+ @Override
+ public int advance(int target) {
+ if (target < values.size()) {
+ docID = target;
+ if (docsWithField.get(docID)) {
+ return docID;
+ } else{
+ return nextDoc();
+ }
+ } else {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ }
+
+ @Override
+ public long cost() {
+ return values.size();
+ }
+
+ @Override
+ public long longValue() {
+ return minValue + values.get(docID);
+ }
+ };
+ }
}
static final class LongCache extends Cache {
@@ -627,7 +715,7 @@ class FieldCacheImpl implements FieldCache {
}
@Override
- protected Accountable createValue(final LeafReader reader, CacheKey key, boolean setDocsWithField)
+ protected Accountable createValue(final LeafReader reader, CacheKey key)
throws IOException {
final Parser parser = (Parser) key.custom;
@@ -675,16 +763,13 @@ class FieldCacheImpl implements FieldCache {
}
};
- u.uninvert(reader, key.field, setDocsWithField);
-
- if (setDocsWithField) {
- wrapper.setDocsWithField(reader, key.field, u.docsWithField, parser);
- }
+ u.uninvert(reader, key.field);
+ wrapper.setDocsWithField(reader, key.field, u.docsWithField, parser);
GrowableWriterAndMinValue values = valuesRef.get();
if (values == null) {
- return new LongsFromArray(new PackedInts.NullReader(reader.maxDoc()), 0L);
+ return new LongsFromArray(key.field, new PackedInts.NullReader(reader.maxDoc()), 0L);
}
- return new LongsFromArray(values.writer.getMutable(), values.minValue);
+ return new LongsFromArray(key.field, values.writer.getMutable(), values.minValue);
}
}
@@ -704,14 +789,49 @@ class FieldCacheImpl implements FieldCache {
public SortedDocValues iterator() {
final BytesRef term = new BytesRef();
return new SortedDocValues() {
+ private int docID = -1;
@Override
- public int getValueCount() {
- return numOrd;
+ public int docID() {
+ return docID;
}
@Override
- public int getOrd(int docID) {
+ public int nextDoc() {
+ while (true) {
+ docID++;
+ if (docID >= docToTermOrd.size()) {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ if (docToTermOrd.get(docID) != 0) {
+ return docID;
+ }
+ }
+ }
+
+ @Override
+ public int advance(int target) {
+ if (target < docToTermOrd.size()) {
+ docID = target;
+ if (docToTermOrd.get(docID) != 0) {
+ return docID;
+ } else{
+ return nextDoc();
+ }
+ } else {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ }
+
+ @Override
+ public long cost() {
+ return 0;
+ }
+
+ @Override
+ public int ordValue() {
// Subtract 1, matching the 1+ord we did when
// storing, so that missing values, which are 0 in the
// packed ints, are returned as -1 ord:
@@ -719,6 +839,11 @@ class FieldCacheImpl implements FieldCache {
}
@Override
+ public int getValueCount() {
+ return numOrd;
+ }
+
+ @Override
public BytesRef lookupOrd(int ord) {
if (ord < 0) {
throw new IllegalArgumentException("ord must be >=0 (got ord=" + ord + ")");
@@ -769,7 +894,7 @@ class FieldCacheImpl implements FieldCache {
} else if (info.getIndexOptions() == IndexOptions.NONE) {
return DocValues.emptySorted();
}
- SortedDocValuesImpl impl = (SortedDocValuesImpl) caches.get(SortedDocValues.class).get(reader, new CacheKey(field, acceptableOverheadRatio), false);
+ SortedDocValuesImpl impl = (SortedDocValuesImpl) caches.get(SortedDocValues.class).get(reader, new CacheKey(field, acceptableOverheadRatio));
return impl.iterator();
}
}
@@ -780,7 +905,7 @@ class FieldCacheImpl implements FieldCache {
}
@Override
- protected Accountable createValue(LeafReader reader, CacheKey key, boolean setDocsWithField /* ignored */)
+ protected Accountable createValue(LeafReader reader, CacheKey key)
throws IOException {
final int maxDoc = reader.maxDoc();
@@ -860,11 +985,54 @@ class FieldCacheImpl implements FieldCache {
this.docToOffset = docToOffset;
}
- public BinaryDocValues iterator() {
- final BytesRef term = new BytesRef();
+ public BinaryDocValues iterator(Bits docsWithField) {
return new BinaryDocValues() {
+
+ final BytesRef term = new BytesRef();
+
+ int docID = -1;
+
+ @Override
+ public int docID() {
+ return docID;
+ }
+
@Override
- public BytesRef get(int docID) {
+ public int nextDoc() {
+ while (true) {
+ docID++;
+ if (docID >= docToOffset.size()) {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ if (docsWithField.get(docID)) {
+ return docID;
+ }
+ }
+ }
+
+ @Override
+ public int advance(int target) {
+ if (target < docToOffset.size()) {
+ docID = target;
+ if (docsWithField.get(docID)) {
+ return docID;
+ } else{
+ return nextDoc();
+ }
+ } else {
+ docID = NO_MORE_DOCS;
+ return docID;
+ }
+ }
+
+ @Override
+ public long cost() {
+ return 0;
+ }
+
+ @Override
+ public BytesRef binaryValue() {
final long pointer = docToOffset.get(docID);
if (pointer == 0) {
term.length = 0;
@@ -892,11 +1060,11 @@ class FieldCacheImpl implements FieldCache {
// TODO: this if DocTermsIndex was already created, we
// should share it...
- public BinaryDocValues getTerms(LeafReader reader, String field, boolean setDocsWithField) throws IOException {
- return getTerms(reader, field, setDocsWithField, PackedInts.FAST);
+ public BinaryDocValues getTerms(LeafReader reader, String field) throws IOException {
+ return getTerms(reader, field, PackedInts.FAST);
}
- public BinaryDocValues getTerms(LeafReader reader, String field, boolean setDocsWithField, float acceptableOverheadRatio) throws IOException {
+ public BinaryDocValues getTerms(LeafReader reader, String field, float acceptableOverheadRatio) throws IOException {
BinaryDocValues valuesIn = reader.getBinaryDocValues(field);
if (valuesIn == null) {
valuesIn = reader.getSortedDocValues(field);
@@ -917,8 +1085,8 @@ class FieldCacheImpl implements FieldCache {
return DocValues.emptyBinary();
}
- BinaryDocValuesImpl impl = (BinaryDocValuesImpl) caches.get(BinaryDocValues.class).get(reader, new CacheKey(field, acceptableOverheadRatio), setDocsWithField);
- return impl.iterator();
+ BinaryDocValuesImpl impl = (BinaryDocValuesImpl) caches.get(BinaryDocValues.class).get(reader, new CacheKey(field, acceptableOverheadRatio));
+ return impl.iterator(getDocsWithField(reader, field, null));
}
static final class BinaryDocValuesCache extends Cache {
@@ -927,7 +1095,7 @@ class FieldCacheImpl implements FieldCache {
}
@Override
- protected Accountable createValue(LeafReader reader, CacheKey key, boolean setDocsWithField)
+ protected Accountable createValue(LeafReader reader, CacheKey key)
throws IOException {
// TODO: would be nice to first check if DocTermsIndex
@@ -997,8 +1165,7 @@ class FieldCacheImpl implements FieldCache {
}
final PackedInts.Reader offsetReader = docToOffset.getMutable();
- if (setDocsWithField) {
- wrapper.setDocsWithField(reader, key.field, new Bits() {
+ wrapper.setDocsWithField(reader, key.field, new Bits() {
@Override
public boolean get(int index) {
return offsetReader.get(index) != 0;
@@ -1009,7 +1176,6 @@ class FieldCacheImpl implements FieldCache {
return maxDoc;
}
}, null);
- }
// maybe an int-only impl?
return new BinaryDocValuesImpl(bytes.freeze(true), offsetReader);
}
@@ -1055,7 +1221,7 @@ class FieldCacheImpl implements FieldCache {
}
}
- DocTermOrds dto = (DocTermOrds) caches.get(DocTermOrds.class).get(reader, new CacheKey(field, prefix), false);
+ DocTermOrds dto = (DocTermOrds) caches.get(DocTermOrds.class).get(reader, new CacheKey(field, prefix));
return dto.iterator(reader);
}
@@ -1065,7 +1231,7 @@ class FieldCacheImpl implements FieldCache {
}
@Override
- protected Accountable createValue(LeafReader reader, CacheKey key, boolean setDocsWithField /* ignored */)
+ protected Accountable createValue(LeafReader reader, CacheKey key)
throws IOException {
BytesRef prefix = (BytesRef) key.custom;
return new DocTermOrds(reader, null, key.field, prefix);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java b/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
index 8d49fcb..7825666 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
@@ -37,7 +37,6 @@ import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
-import org.apache.lucene.util.Bits;
import org.apache.solr.uninverting.FieldCache.CacheEntry;
/**
@@ -274,44 +273,60 @@ public class UninvertingReader extends FilterLeafReader {
@Override
public NumericDocValues getNumericDocValues(String field) throws IOException {
+ NumericDocValues values = super.getNumericDocValues(field);
+ if (values != null) {
+ return values;
+ }
Type v = getType(field);
if (v != null) {
switch (v) {
- case INTEGER_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.INT_POINT_PARSER, true);
- case FLOAT_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.FLOAT_POINT_PARSER, true);
- case LONG_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LONG_POINT_PARSER, true);
- case DOUBLE_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.DOUBLE_POINT_PARSER, true);
- case LEGACY_INTEGER: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_INT_PARSER, true);
- case LEGACY_FLOAT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_FLOAT_PARSER, true);
- case LEGACY_LONG: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_LONG_PARSER, true);
- case LEGACY_DOUBLE: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_DOUBLE_PARSER, true);
+ case INTEGER_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.INT_POINT_PARSER);
+ case FLOAT_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.FLOAT_POINT_PARSER);
+ case LONG_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LONG_POINT_PARSER);
+ case DOUBLE_POINT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.DOUBLE_POINT_PARSER);
+ case LEGACY_INTEGER: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_INT_PARSER);
+ case LEGACY_FLOAT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_FLOAT_PARSER);
+ case LEGACY_LONG: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_LONG_PARSER);
+ case LEGACY_DOUBLE: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.LEGACY_DOUBLE_PARSER);
}
}
- return super.getNumericDocValues(field);
+ return null;
}
@Override
public BinaryDocValues getBinaryDocValues(String field) throws IOException {
+ BinaryDocValues values = in.getBinaryDocValues(field);
+ if (values != null) {
+ return values;
+ }
Type v = getType(field);
if (v == Type.BINARY) {
- return FieldCache.DEFAULT.getTerms(in, field, true);
+ return FieldCache.DEFAULT.getTerms(in, field);
} else {
- return in.getBinaryDocValues(field);
+ return null;
}
}
@Override
public SortedDocValues getSortedDocValues(String field) throws IOException {
+ SortedDocValues values = in.getSortedDocValues(field);
+ if (values != null) {
+ return values;
+ }
Type v = getType(field);
if (v == Type.SORTED) {
return FieldCache.DEFAULT.getTermsIndex(in, field);
} else {
- return in.getSortedDocValues(field);
+ return null;
}
}
@Override
public SortedSetDocValues getSortedSetDocValues(String field) throws IOException {
+ SortedSetDocValues values = in.getSortedSetDocValues(field);
+ if (values != null) {
+ return values;
+ }
Type v = getType(field);
if (v != null) {
switch (v) {
@@ -325,30 +340,9 @@ public class UninvertingReader extends FilterLeafReader {
return FieldCache.DEFAULT.getDocTermOrds(in, field, null);
}
}
- return in.getSortedSetDocValues(field);
+ return null;
}
- @Override
- public Bits getDocsWithField(String field) throws IOException {
- Type v = getType(field);
- if (v != null) {
- switch (v) {
- case INTEGER_POINT: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.INT_POINT_PARSER);
- case FLOAT_POINT: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.FLOAT_POINT_PARSER);
- case LONG_POINT: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.LONG_POINT_PARSER);
- case DOUBLE_POINT: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.DOUBLE_POINT_PARSER);
- case LEGACY_INTEGER: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.LEGACY_INT_PARSER);
- case LEGACY_FLOAT: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.LEGACY_FLOAT_PARSER);
- case LEGACY_LONG: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.LEGACY_LONG_PARSER);
- case LEGACY_DOUBLE: return FieldCache.DEFAULT.getDocsWithField(in, field, FieldCache.LEGACY_DOUBLE_PARSER);
- default:
- return FieldCache.DEFAULT.getDocsWithField(in, field, null);
- }
- } else {
- return in.getDocsWithField(field);
- }
- }
-
/**
* Returns the field's uninversion type, or null
* if the field doesn't exist or doesn't have a mapping.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/schema/DocValuesMultiTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/DocValuesMultiTest.java b/solr/core/src/test/org/apache/solr/schema/DocValuesMultiTest.java
index 90c8b73..d31fc5c 100644
--- a/solr/core/src/test/org/apache/solr/schema/DocValuesMultiTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/DocValuesMultiTest.java
@@ -16,9 +16,11 @@
*/
package org.apache.solr.schema;
-import org.apache.lucene.index.LeafReader;
+import java.io.IOException;
+
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfos;
+import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.core.SolrCore;
@@ -27,8 +29,6 @@ import org.apache.solr.util.RefCounted;
import org.junit.BeforeClass;
import org.junit.Test;
-import java.io.IOException;
-
public class DocValuesMultiTest extends SolrTestCaseJ4 {
@BeforeClass
@@ -72,13 +72,13 @@ public class DocValuesMultiTest extends SolrTestCaseJ4 {
assertEquals(DocValuesType.SORTED_SET, infos.fieldInfo("intdv").getDocValuesType());
SortedSetDocValues dv = reader.getSortedSetDocValues("stringdv");
- dv.setDocument(0);
+ assertEquals(0, dv.nextDoc());
assertEquals(0, dv.nextOrd());
assertEquals(1, dv.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, dv.nextOrd());
dv = reader.getSortedSetDocValues("booldv");
- dv.setDocument(0);
+ assertEquals(0, dv.nextDoc());
assertEquals(0, dv.nextOrd());
assertEquals(1, dv.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, dv.nextOrd());
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java b/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java
index d59d326..43eefaa 100644
--- a/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java
@@ -16,10 +16,21 @@
*/
package org.apache.solr.schema;
-import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.index.LeafReader;
+import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfos;
+import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.util.NumericUtils;
import org.apache.solr.SolrTestCaseJ4;
@@ -31,15 +42,6 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.function.Function;
-import java.util.function.Supplier;
-
public class DocValuesTest extends SolrTestCaseJ4 {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -84,12 +86,24 @@ public class DocValuesTest extends SolrTestCaseJ4 {
assertEquals(DocValuesType.SORTED, infos.fieldInfo("stringdv").getDocValuesType());
assertEquals(DocValuesType.SORTED, infos.fieldInfo("booldv").getDocValuesType());
- assertEquals((long) Float.floatToIntBits(1), reader.getNumericDocValues("floatdv").get(0));
- assertEquals(2L, reader.getNumericDocValues("intdv").get(0));
- assertEquals(Double.doubleToLongBits(3), reader.getNumericDocValues("doubledv").get(0));
- assertEquals(4L, reader.getNumericDocValues("longdv").get(0));
- assertEquals("solr", reader.getSortedDocValues("stringdv").get(0).utf8ToString());
- assertEquals("T", reader.getSortedDocValues("booldv").get(0).utf8ToString());
+ NumericDocValues dvs = reader.getNumericDocValues("floatdv");
+ assertEquals(0, dvs.nextDoc());
+ assertEquals((long) Float.floatToIntBits(1), dvs.longValue());
+ dvs = reader.getNumericDocValues("intdv");
+ assertEquals(0, dvs.nextDoc());
+ assertEquals(2L, dvs.longValue());
+ dvs = reader.getNumericDocValues("doubledv");
+ assertEquals(0, dvs.nextDoc());
+ assertEquals(Double.doubleToLongBits(3), dvs.longValue());
+ dvs = reader.getNumericDocValues("longdv");
+ assertEquals(0, dvs.nextDoc());
+ assertEquals(4L, dvs.longValue());
+ SortedDocValues sdv = reader.getSortedDocValues("stringdv");
+ assertEquals(0, sdv.nextDoc());
+ assertEquals("solr", sdv.binaryValue().utf8ToString());
+ sdv = reader.getSortedDocValues("booldv");
+ assertEquals(0, sdv.nextDoc());
+ assertEquals("T", sdv.binaryValue().utf8ToString());
final IndexSchema schema = core.getLatestSchema();
final SchemaField floatDv = schema.getField("floatdv");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/search/TestDocSet.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestDocSet.java b/solr/core/src/test/org/apache/solr/search/TestDocSet.java
index cdddd86..5b44514 100644
--- a/solr/core/src/test/org/apache/solr/search/TestDocSet.java
+++ b/solr/core/src/test/org/apache/solr/search/TestDocSet.java
@@ -443,11 +443,6 @@ public class TestDocSet extends LuceneTestCase {
}
@Override
- public Bits getDocsWithField(String field) throws IOException {
- return null;
- }
-
- @Override
public NumericDocValues getNormValues(String field) {
return null;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java b/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
index e3afed3..b42861a 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
@@ -691,8 +691,18 @@ public class TestRankQueryPlugin extends QParserPlugin {
@Override
public void setScorer(Scorer scorer) throws IOException {}
- public void collect(int doc) {
- list.add(new ScoreDoc(doc+base, (float)values.get(doc)));
+ public void collect(int doc) throws IOException {
+ int valuesDocID = values.docID();
+ if (valuesDocID < doc) {
+ valuesDocID = values.advance(doc);
+ }
+ long value;
+ if (valuesDocID == doc) {
+ value = values.longValue();
+ } else {
+ value = 0;
+ }
+ list.add(new ScoreDoc(doc+base, (float) value));
}
};
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/search/function/NvlValueSourceParser.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/function/NvlValueSourceParser.java b/solr/core/src/test/org/apache/solr/search/function/NvlValueSourceParser.java
index 17b33db..72e2cc6 100644
--- a/solr/core/src/test/org/apache/solr/search/function/NvlValueSourceParser.java
+++ b/solr/core/src/test/org/apache/solr/search/function/NvlValueSourceParser.java
@@ -16,6 +16,8 @@
*/
package org.apache.solr.search.function;
+import java.io.IOException;
+
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.valuesource.SimpleFloatFunction;
@@ -56,7 +58,7 @@ public class NvlValueSourceParser extends ValueSourceParser {
}
@Override
- protected float func(int doc, FunctionValues vals) {
+ protected float func(int doc, FunctionValues vals) throws IOException {
float v = vals.floatVal(doc);
if (v == nvlFloatValue) {
return nvl;
@@ -75,4 +77,4 @@ public class NvlValueSourceParser extends ValueSourceParser {
this.nvlFloatValue = nvlFloatValueArg;
}
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/solr/core/src/test/org/apache/solr/uninverting/TestDocTermOrds.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/uninverting/TestDocTermOrds.java b/solr/core/src/test/org/apache/solr/uninverting/TestDocTermOrds.java
index 46339a7..67b62cf 100644
--- a/solr/core/src/test/org/apache/solr/uninverting/TestDocTermOrds.java
+++ b/solr/core/src/test/org/apache/solr/uninverting/TestDocTermOrds.java
@@ -115,19 +115,19 @@ public class TestDocTermOrds extends LuceneTestCase {
final DocTermOrds dto = new DocTermOrds(ar, ar.getLiveDocs(), "field");
SortedSetDocValues iter = dto.iterator(ar);
- iter.setDocument(0);
+ assertEquals(0, iter.nextDoc());
assertEquals(0, iter.nextOrd());
assertEquals(1, iter.nextOrd());
assertEquals(2, iter.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, iter.nextOrd());
- iter.setDocument(1);
+ assertEquals(1, iter.nextDoc());
assertEquals(3, iter.nextOrd());
assertEquals(4, iter.nextOrd());
assertEquals(5, iter.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, iter.nextOrd());
- iter.setDocument(2);
+ assertEquals(2, iter.nextDoc());
assertEquals(0, iter.nextOrd());
assertEquals(5, iter.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, iter.nextOrd());
@@ -353,7 +353,7 @@ public class TestDocTermOrds extends LuceneTestCase {
TestUtil.nextInt(random(), 2, 10));
- final NumericDocValues docIDToID = FieldCache.DEFAULT.getNumerics(r, "id", FieldCache.LEGACY_INT_PARSER, false);
+ final NumericDocValues docIDToID = FieldCache.DEFAULT.getNumerics(r, "id", FieldCache.LEGACY_INT_PARSER);
/*
for(int docID=0;docID<subR.maxDoc();docID++) {
System.out.println(" docID=" + docID + " id=" + docIDToID[docID]);
@@ -405,11 +405,20 @@ public class TestDocTermOrds extends LuceneTestCase {
SortedSetDocValues iter = dto.iterator(r);
for(int docID=0;docID<r.maxDoc();docID++) {
+ assertEquals(docID, docIDToID.nextDoc());
+ if (docID > iter.docID()) {
+ iter.nextDoc();
+ }
+ if (docID < iter.docID()) {
+ int[] answers = idToOrds[(int) docIDToID.longValue()];
+ assertEquals(0, answers.length);
+ continue;
+ }
+
if (VERBOSE) {
- System.out.println("TEST: docID=" + docID + " of " + r.maxDoc() + " (id=" + docIDToID.get(docID) + ")");
+ System.out.println("TEST: docID=" + docID + " of " + r.maxDoc() + " (id=" + docIDToID.longValue() + ")");
}
- iter.setDocument(docID);
- final int[] answers = idToOrds[(int) docIDToID.get(docID)];
+ final int[] answers = idToOrds[(int) docIDToID.longValue()];
int upto = 0;
long ord;
while ((ord = iter.nextOrd()) != SortedSetDocValues.NO_MORE_ORDS) {
@@ -447,7 +456,7 @@ public class TestDocTermOrds extends LuceneTestCase {
SortedSetDocValues v = FieldCache.DEFAULT.getDocTermOrds(getOnlyLeafReader(r1), "foo", null);
assertEquals(3, v.getValueCount());
- v.setDocument(1);
+ assertEquals(1, v.advance(1));
assertEquals(1, v.nextOrd());
iw.close();
@@ -477,12 +486,12 @@ public class TestDocTermOrds extends LuceneTestCase {
SortedSetDocValues v = FieldCache.DEFAULT.getDocTermOrds(ar, "foo", FieldCache.INT32_TERM_PREFIX);
assertEquals(2, v.getValueCount());
-
- v.setDocument(0);
+
+ assertEquals(0, v.nextDoc());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
- v.setDocument(1);
+ assertEquals(1, v.nextDoc());
assertEquals(0, v.nextOrd());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
@@ -519,11 +528,11 @@ public class TestDocTermOrds extends LuceneTestCase {
SortedSetDocValues v = FieldCache.DEFAULT.getDocTermOrds(ar, "foo", FieldCache.INT64_TERM_PREFIX);
assertEquals(2, v.getValueCount());
- v.setDocument(0);
+ assertEquals(0, v.nextDoc());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
- v.setDocument(1);
+ assertEquals(1, v.nextDoc());
assertEquals(0, v.nextOrd());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
@@ -654,18 +663,15 @@ public class TestDocTermOrds extends LuceneTestCase {
assertNotNull(DocValues.unwrapSingleton(v)); // actually a single-valued field
assertEquals(2, v.getValueCount());
- v.setDocument(0);
+ assertEquals(0, v.nextDoc());
assertEquals(0, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
- v.setDocument(1);
+ assertEquals(1, v.nextDoc());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
- v.setDocument(2);
- assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
-
- v.setDocument(3);
+ assertEquals(3, v.nextDoc());
assertEquals(1, v.nextOrd());
assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());