You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/10/27 20:09:06 UTC
[02/50] [abbrv] lucene-solr:jira/solr-8593: LUCENE-7462: Give doc
values APIs an `advanceExact` method.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java b/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
index 0cb86db..ff390b3 100644
--- a/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
+++ b/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
@@ -244,11 +244,7 @@ public class BM25Similarity extends Similarity {
if (norms == null) {
norm = k1;
} else {
- int normsDocID = norms.docID();
- if (normsDocID < doc) {
- normsDocID = norms.advance(doc);
- }
- if (normsDocID == doc) {
+ if (norms.advanceExact(doc)) {
norm = cache[(byte)norms.longValue() & 0xFF];
} else {
norm = cache[0];
@@ -310,7 +306,7 @@ public class BM25Similarity extends Similarity {
"tfNorm, computed from:", subs);
} else {
byte norm;
- if (norms.advance(doc) == doc) {
+ if (norms.advanceExact(doc)) {
norm = (byte) norms.longValue();
} else {
norm = 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java b/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java
index ed837c4..925dc59 100644
--- a/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java
+++ b/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java
@@ -279,11 +279,7 @@ public abstract class SimilarityBase extends Similarity {
if (norms == null) {
return 1F;
}
- int normsDocID = norms.docID();
- if (normsDocID < doc) {
- normsDocID = norms.advance(doc);
- }
- if (normsDocID == doc) {
+ if (norms.advanceExact(doc)) {
return decodeNormValue((byte) norms.longValue());
} else {
return decodeNormValue((byte) 0);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java b/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
index 6cd87b5..cd8acd6 100644
--- a/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
+++ b/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
@@ -599,11 +599,7 @@ public abstract class TFIDFSimilarity extends Similarity {
return raw;
} else {
long normValue;
- int normsDocID = norms.docID();
- if (normsDocID < doc) {
- normsDocID = norms.advance(doc);
- }
- if (normsDocID == doc) {
+ if (norms.advanceExact(doc)) {
normValue = norms.longValue();
} else {
normValue = 0;
@@ -649,7 +645,7 @@ public abstract class TFIDFSimilarity extends Similarity {
private Explanation explainField(int doc, Explanation freq, IDFStats stats, NumericDocValues norms) throws IOException {
Explanation tfExplanation = Explanation.match(tf(freq.getValue()), "tf(freq="+freq.getValue()+"), with freq of:", freq);
float norm;
- if (norms != null && norms.advance(doc) == doc) {
+ if (norms != null && norms.advanceExact(doc)) {
norm = decodeNormValue(norms.longValue());
} else {
norm = 1f;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestIndexedDISI.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestIndexedDISI.java b/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestIndexedDISI.java
index 18b4590..64bfbd5 100644
--- a/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestIndexedDISI.java
+++ b/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestIndexedDISI.java
@@ -153,7 +153,7 @@ public class TestIndexedDISI extends LuceneTestCase {
public void testRandom() throws IOException {
try (Directory dir = newDirectory()) {
- for (int i = 0; i < 100; ++i) {
+ for (int i = 0; i < 10; ++i) {
doTestRandom(dir);
}
}
@@ -217,6 +217,32 @@ public class TestIndexedDISI extends LuceneTestCase {
}
}
+ for (int step : new int[] {10, 100, 1000, 10000, 100000}) {
+ try (IndexInput in = dir.openInput("foo", IOContext.DEFAULT)) {
+ IndexedDISI disi = new IndexedDISI(in, 0L, length, cardinality);
+ BitSetIterator disi2 = new BitSetIterator(set, cardinality);
+ int index = -1;
+ for (int target = 0; target < set.length(); ) {
+ target += TestUtil.nextInt(random(), 0, step);
+ int doc = disi2.docID();
+ while (doc < target) {
+ doc = disi2.nextDoc();
+ index++;
+ }
+
+ boolean exists = disi.advanceExact(target);
+ assertEquals(doc == target, exists);
+ if (exists) {
+ assertEquals(index, disi.index());
+ } else if (random().nextBoolean()) {
+ assertEquals(doc, disi.nextDoc());
+ assertEquals(index, disi.index());
+ target = doc;
+ }
+ }
+ }
+ }
+
dir.deleteFile("foo");
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestLucene70DocValuesFormat.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestLucene70DocValuesFormat.java b/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestLucene70DocValuesFormat.java
index 5ad701e..8661298 100644
--- a/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestLucene70DocValuesFormat.java
+++ b/lucene/core/src/test/org/apache/lucene/codecs/lucene70/TestLucene70DocValuesFormat.java
@@ -104,7 +104,7 @@ public class TestLucene70DocValuesFormat extends BaseCompressingDocValuesFormatT
public void testSortedVariableLengthBigVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestSortedVsStoredFields(atLeast(300), 1, 32766);
+ doTestSortedVsStoredFields(atLeast(300), 1d, 1, 32766);
}
}
@@ -112,7 +112,7 @@ public class TestLucene70DocValuesFormat extends BaseCompressingDocValuesFormatT
public void testSortedVariableLengthManyVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestSortedVsStoredFields(TestUtil.nextInt(random(), 1024, 2049), 1, 500);
+ doTestSortedVsStoredFields(TestUtil.nextInt(random(), 1024, 2049), 1d, 1, 500);
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java b/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
index 1219494..4fff6a6 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
@@ -199,10 +199,7 @@ public class SortedSetDocValuesFacetCounts extends Facets {
int doc;
while ((doc = docs.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
//System.out.println(" doc=" + doc);
- if (doc > segValues.docID()) {
- segValues.advance(doc);
- }
- if (doc == segValues.docID()) {
+ if (segValues.advanceExact(doc)) {
int term = (int) segValues.nextOrd();
while (term != SortedSetDocValues.NO_MORE_ORDS) {
//System.out.println(" segOrd=" + segOrd + " ord=" + term + " globalOrd=" + ordinalMap.getGlobalOrd(segOrd, term));
@@ -219,10 +216,7 @@ public class SortedSetDocValuesFacetCounts extends Facets {
int doc;
while ((doc = docs.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
//System.out.println(" doc=" + doc);
- if (doc > segValues.docID()) {
- segValues.advance(doc);
- }
- if (doc == segValues.docID()) {
+ if (segValues.advanceExact(doc)) {
int term = (int) segValues.nextOrd();
while (term != SortedSetDocValues.NO_MORE_ORDS) {
//System.out.println(" ord=" + term);
@@ -246,10 +240,7 @@ public class SortedSetDocValuesFacetCounts extends Facets {
// just aggregate directly into counts:
int doc;
while ((doc = docs.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > segValues.docID()) {
- segValues.advance(doc);
- }
- if (doc == segValues.docID()) {
+ if (segValues.advanceExact(doc)) {
int term = (int) segValues.nextOrd();
while (term != SortedSetDocValues.NO_MORE_ORDS) {
counts[term]++;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
----------------------------------------------------------------------
diff --git a/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java b/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
index a2e0c55..359b3cb 100644
--- a/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
+++ b/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
@@ -102,7 +102,7 @@ public class BlockJoinSelector {
}
return new SortedDocValues() {
- private int ord;
+ private int ord = -1;
private int docID = -1;
@Override
@@ -169,6 +169,60 @@ public class BlockJoinSelector {
}
@Override
+ public boolean advanceExact(int targetParentDocID) throws IOException {
+ if (targetParentDocID < docID) {
+ throw new IllegalArgumentException("target must be after the current document: current=" + docID + " target=" + targetParentDocID);
+ }
+ int previousDocId = docID;
+ docID = targetParentDocID;
+ if (targetParentDocID == previousDocId) {
+ return ord != -1;
+ }
+ docID = targetParentDocID;
+ ord = -1;
+ if (parents.get(targetParentDocID) == false) {
+ return false;
+ }
+ int prevParentDocId = docID == 0 ? -1 : parents.prevSetBit(docID - 1);
+ int childDoc = values.docID();
+ if (childDoc <= prevParentDocId) {
+ childDoc = values.advance(prevParentDocId + 1);
+ }
+ if (childDoc >= docID) {
+ return false;
+ }
+
+ boolean hasValue = false;
+ for (int doc = values.docID(); doc < docID; doc = values.nextDoc()) {
+ if (children.get(doc)) {
+ ord = values.ordValue();
+ hasValue = true;
+ values.nextDoc();
+ break;
+ }
+ }
+ if (hasValue == false) {
+ return false;
+ }
+
+ for (int doc = values.docID(); doc < docID; doc = values.nextDoc()) {
+ if (children.get(doc)) {
+ switch (selection) {
+ case MIN:
+ ord = Math.min(ord, values.ordValue());
+ break;
+ case MAX:
+ ord = Math.max(ord, values.ordValue());
+ break;
+ default:
+ throw new AssertionError();
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
public int ordValue() {
return ord;
}
@@ -288,6 +342,54 @@ public class BlockJoinSelector {
}
@Override
+ public boolean advanceExact(int targetParentDocID) throws IOException {
+ if (targetParentDocID <= parentDocID) {
+ throw new IllegalArgumentException("target must be after the current document: current=" + parentDocID + " target=" + targetParentDocID);
+ }
+ parentDocID = targetParentDocID;
+ if (parents.get(targetParentDocID) == false) {
+ return false;
+ }
+ int prevParentDocId = parentDocID == 0 ? -1 : parents.prevSetBit(parentDocID - 1);
+ int childDoc = values.docID();
+ if (childDoc <= prevParentDocId) {
+ childDoc = values.advance(prevParentDocId + 1);
+ }
+ if (childDoc >= parentDocID) {
+ return false;
+ }
+
+ boolean hasValue = false;
+ for (int doc = values.docID(); doc < parentDocID; doc = values.nextDoc()) {
+ if (children.get(doc)) {
+ value = values.longValue();
+ hasValue = true;
+ values.nextDoc();
+ break;
+ }
+ }
+ if (hasValue == false) {
+ return false;
+ }
+
+ for (int doc = values.docID(); doc < parentDocID; doc = values.nextDoc()) {
+ if (children.get(doc)) {
+ switch (selection) {
+ case MIN:
+ value = Math.min(value, values.longValue());
+ break;
+ case MAX:
+ value = Math.max(value, values.longValue());
+ break;
+ default:
+ throw new AssertionError();
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
public long longValue() {
return value;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java b/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
index 3ad0fe3..47b1b62 100644
--- a/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
+++ b/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
@@ -74,6 +74,13 @@ interface GenericTermsCollector extends Collector {
}
@Override
+ public boolean advanceExact(int dest) throws IOException {
+ boolean exists = target.advanceExact(dest);
+ out.println("\nadvanceExact(" + dest + ") -> exists# "+exists);
+ return exists;
+ }
+
+ @Override
public long cost() {
return target.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinSelector.java
----------------------------------------------------------------------
diff --git a/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinSelector.java b/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinSelector.java
index 41f994c..04cb771 100644
--- a/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinSelector.java
+++ b/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinSelector.java
@@ -150,6 +150,12 @@ public class TestBlockJoinSelector extends LuceneTestCase {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return ords[docID] != -1;
+ }
+
+ @Override
public int ordValue() {
assert ords[docID] != -1;
return ords[docID];
@@ -257,6 +263,12 @@ public class TestBlockJoinSelector extends LuceneTestCase {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docsWithValue.get(docID);
+ }
+
+ @Override
public long longValue() {
return values[docID];
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
----------------------------------------------------------------------
diff --git a/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java b/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
index ccbbf24..218d26c 100644
--- a/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
+++ b/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
@@ -970,6 +970,12 @@ public class MemoryIndex {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docID == 0;
+ }
+
+ @Override
public long cost() {
return 1;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java b/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
index b64afc5..043141a 100644
--- a/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
+++ b/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
@@ -144,6 +144,11 @@ public class TestDiversifiedTopDocsCollector extends LuceneTestCase {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return sdv.advanceExact(target + context.docBase);
+ }
+
+ @Override
public long cost() {
return 0;
}
@@ -187,6 +192,10 @@ public class TestDiversifiedTopDocsCollector extends LuceneTestCase {
return vals.advance(target);
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return vals.advanceExact(target);
+ }
+ @Override
public long cost() {
return vals.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java b/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
index 6686ec4..37c549e 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
@@ -398,6 +398,7 @@ public class AssertingLeafReader extends FilterLeafReader {
private final NumericDocValues in;
private final int maxDoc;
private int lastDocID = -1;
+ private boolean exists;
public AssertingNumericDocValues(NumericDocValues in, int maxDoc) {
this.in = in;
@@ -420,6 +421,7 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == NO_MORE_DOCS || docID < maxDoc;
assert docID == in.docID();
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@@ -432,10 +434,23 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID >= target;
assert docID == NO_MORE_DOCS || docID < maxDoc;
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ assertThread("Numeric doc values", creationThread);
+ assert target >= 0;
+ assert target >= in.docID();
+ assert target < maxDoc;
+ exists = in.advanceExact(target);
+ assert in.docID() == target;
+ lastDocID = target;
+ return exists;
+ }
+
+ @Override
public long cost() {
assertThread("Numeric doc values", creationThread);
long cost = in.cost();
@@ -446,8 +461,7 @@ public class AssertingLeafReader extends FilterLeafReader {
@Override
public long longValue() throws IOException {
assertThread("Numeric doc values", creationThread);
- assert in.docID() != -1;
- assert in.docID() != NO_MORE_DOCS;
+ assert exists;
return in.longValue();
}
@@ -463,6 +477,7 @@ public class AssertingLeafReader extends FilterLeafReader {
private final BinaryDocValues in;
private final int maxDoc;
private int lastDocID = -1;
+ private boolean exists;
public AssertingBinaryDocValues(BinaryDocValues in, int maxDoc) {
this.in = in;
@@ -485,6 +500,7 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == NO_MORE_DOCS || docID < maxDoc;
assert docID == in.docID();
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@@ -497,10 +513,23 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID >= target;
assert docID == NO_MORE_DOCS || docID < maxDoc;
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ assertThread("Numeric doc values", creationThread);
+ assert target >= 0;
+ assert target >= in.docID();
+ assert target < maxDoc;
+ exists = in.advanceExact(target);
+ assert in.docID() == target;
+ lastDocID = target;
+ return exists;
+ }
+
+ @Override
public long cost() {
assertThread("Binary doc values", creationThread);
long cost = in.cost();
@@ -511,8 +540,7 @@ public class AssertingLeafReader extends FilterLeafReader {
@Override
public BytesRef binaryValue() throws IOException {
assertThread("Binary doc values", creationThread);
- assert in.docID() != -1;
- assert in.docID() != NO_MORE_DOCS;
+ assert exists;
return in.binaryValue();
}
@@ -529,6 +557,7 @@ public class AssertingLeafReader extends FilterLeafReader {
private final int maxDoc;
private final int valueCount;
private int lastDocID = -1;
+ private boolean exists;
public AssertingSortedDocValues(SortedDocValues in, int maxDoc) {
this.in = in;
@@ -551,6 +580,7 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == NO_MORE_DOCS || docID < maxDoc;
assert docID == in.docID();
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@@ -563,10 +593,23 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID >= target;
assert docID == NO_MORE_DOCS || docID < maxDoc;
lastDocID = docID;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ assertThread("Numeric doc values", creationThread);
+ assert target >= 0;
+ assert target >= in.docID();
+ assert target < maxDoc;
+ exists = in.advanceExact(target);
+ assert in.docID() == target;
+ lastDocID = target;
+ return exists;
+ }
+
+ @Override
public long cost() {
assertThread("Sorted doc values", creationThread);
long cost = in.cost();
@@ -577,6 +620,7 @@ public class AssertingLeafReader extends FilterLeafReader {
@Override
public int ordValue() {
assertThread("Sorted doc values", creationThread);
+ assert exists;
int ord = in.ordValue();
assert ord >= -1 && ord < valueCount;
return ord;
@@ -625,6 +669,7 @@ public class AssertingLeafReader extends FilterLeafReader {
private final int maxDoc;
private int lastDocID = -1;
private int valueUpto;
+ private boolean exists;
public AssertingSortedNumericDocValues(SortedNumericDocValues in, int maxDoc) {
this.in = in;
@@ -645,6 +690,7 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == in.docID();
lastDocID = docID;
valueUpto = 0;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@@ -659,10 +705,24 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == NO_MORE_DOCS || docID < maxDoc;
lastDocID = docID;
valueUpto = 0;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ assertThread("Numeric doc values", creationThread);
+ assert target >= 0;
+ assert target >= in.docID();
+ assert target < maxDoc;
+ exists = in.advanceExact(target);
+ assert in.docID() == target;
+ lastDocID = target;
+ valueUpto = 0;
+ return exists;
+ }
+
+ @Override
public long cost() {
assertThread("Sorted numeric doc values", creationThread);
long cost = in.cost();
@@ -673,6 +733,7 @@ public class AssertingLeafReader extends FilterLeafReader {
@Override
public long nextValue() throws IOException {
assertThread("Sorted numeric doc values", creationThread);
+ assert exists;
assert valueUpto < in.docValueCount(): "valueUpto=" + valueUpto + " in.docValueCount()=" + in.docValueCount();
valueUpto++;
return in.nextValue();
@@ -681,6 +742,7 @@ public class AssertingLeafReader extends FilterLeafReader {
@Override
public int docValueCount() {
assertThread("Sorted numeric doc values", creationThread);
+ assert exists;
assert in.docValueCount() > 0;
return in.docValueCount();
}
@@ -693,7 +755,8 @@ public class AssertingLeafReader extends FilterLeafReader {
private final int maxDoc;
private final long valueCount;
private int lastDocID = -1;
- long lastOrd = NO_MORE_ORDS;
+ private long lastOrd = NO_MORE_ORDS;
+ private boolean exists;
public AssertingSortedSetDocValues(SortedSetDocValues in, int maxDoc) {
this.in = in;
@@ -717,6 +780,7 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == in.docID();
lastDocID = docID;
lastOrd = -2;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@@ -731,10 +795,24 @@ public class AssertingLeafReader extends FilterLeafReader {
assert docID == NO_MORE_DOCS || docID < maxDoc;
lastDocID = docID;
lastOrd = -2;
+ exists = docID != NO_MORE_DOCS;
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ assertThread("Numeric doc values", creationThread);
+ assert target >= 0;
+ assert target >= in.docID();
+ assert target < maxDoc;
+ exists = in.advanceExact(target);
+ assert in.docID() == target;
+ lastDocID = target;
+ lastOrd = -2;
+ return exists;
+ }
+
+ @Override
public long cost() {
assertThread("Sorted set doc values", creationThread);
long cost = in.cost();
@@ -746,6 +824,7 @@ public class AssertingLeafReader extends FilterLeafReader {
public long nextOrd() throws IOException {
assertThread("Sorted set doc values", creationThread);
assert lastOrd != NO_MORE_ORDS;
+ assert exists;
long ord = in.nextOrd();
assert ord < valueCount;
assert ord == NO_MORE_ORDS || ord > lastOrd;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
index b9bf745..d55f212 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
@@ -30,6 +30,8 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.CountDownLatch;
+import java.util.function.LongSupplier;
+import java.util.function.Supplier;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.MockAnalyzer;
@@ -556,7 +558,6 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
IndexReader ireader = DirectoryReader.open(directory); // read-only=true
assert ireader.leaves().size() == 1;
BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
- BytesRef scratch = new BytesRef();
for(int i=0;i<2;i++) {
Document doc2 = ireader.leaves().get(0).reader().document(i);
String expected;
@@ -1185,20 +1186,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
dir.close();
}
- static abstract class LongProducer {
- abstract long next();
- }
-
- private void doTestNumericsVsStoredFields(final long minValue, final long maxValue) throws Exception {
- doTestNumericsVsStoredFields(new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), minValue, maxValue);
- }
- });
- }
-
- private void doTestNumericsVsStoredFields(LongProducer longs) throws Exception {
+ private void doTestNumericsVsStoredFields(double density, LongSupplier longs) throws Exception {
Directory dir = newDirectory();
IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random()));
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
@@ -1216,8 +1204,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// for numbers of values <= 256, all storage layouts are tested
assert numDocs > 256;
for (int i = 0; i < numDocs; i++) {
+ if (random().nextDouble() > density) {
+ writer.addDocument(new Document());
+ continue;
+ }
idField.setStringValue(Integer.toString(i));
- long value = longs.next();
+ long value = longs.getAsLong();
storedField.setStringValue(Long.toString(value));
dvField.setLongValue(value);
writer.addDocument(doc);
@@ -1241,20 +1233,28 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare
DirectoryReader ir = DirectoryReader.open(dir);
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
- NumericDocValues docValues = r.getNumericDocValues("dv");
+ NumericDocValues docValues = DocValues.getNumeric(r, "dv");
+ docValues.nextDoc();
for (int i = 0; i < r.maxDoc(); i++) {
- long storedValue = Long.parseLong(r.document(i).get("stored"));
- assertEquals(i, docValues.nextDoc());
- assertEquals(storedValue, docValues.longValue());
+ String storedValue = r.document(i).get("stored");
+ if (storedValue == null) {
+ assertTrue(docValues.docID() > i);
+ } else {
+ assertEquals(i, docValues.docID());
+ assertEquals(Long.parseLong(storedValue), docValues.longValue());
+ docValues.nextDoc();
+ }
}
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, docValues.docID());
}
ir.close();
dir.close();
}
- private void doTestSortedNumericsVsStoredFields(LongProducer counts, LongProducer values) throws Exception {
+ private void doTestSortedNumericsVsStoredFields(LongSupplier counts, LongSupplier values) throws Exception {
Directory dir = newDirectory();
IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random()));
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
@@ -1268,10 +1268,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
Document doc = new Document();
doc.add(new StringField("id", Integer.toString(i), Field.Store.NO));
- int valueCount = (int) counts.next();
+ int valueCount = (int) counts.getAsLong();
long valueArray[] = new long[valueCount];
for (int j = 0; j < valueCount; j++) {
- long value = values.next();
+ long value = values.getAsLong();
valueArray[j] = value;
doc.add(new SortedNumericDocValuesField("dv", value));
}
@@ -1300,6 +1300,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare
DirectoryReader ir = DirectoryReader.open(dir);
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
SortedNumericDocValues docValues = DocValues.getSortedNumeric(r, "dv");
@@ -1326,39 +1327,74 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
public void testBooleanNumericsVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestNumericsVsStoredFields(0, 1);
+ doTestNumericsVsStoredFields(1, () -> random().nextInt(2));
}
}
-
+
+ public void testSparseBooleanNumericsVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestNumericsVsStoredFields(random().nextDouble(), () -> random().nextInt(2));
+ }
+ }
+
public void testByteNumericsVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestNumericsVsStoredFields(Byte.MIN_VALUE, Byte.MAX_VALUE);
+ doTestNumericsVsStoredFields(1, () -> TestUtil.nextInt(random(), Byte.MIN_VALUE, Byte.MAX_VALUE));
}
}
-
+
+ public void testSparseByteNumericsVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestNumericsVsStoredFields(random().nextDouble(), () -> TestUtil.nextInt(random(), Byte.MIN_VALUE, Byte.MAX_VALUE));
+ }
+ }
+
public void testShortNumericsVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestNumericsVsStoredFields(Short.MIN_VALUE, Short.MAX_VALUE);
+ doTestNumericsVsStoredFields(1, () -> TestUtil.nextInt(random(), Short.MIN_VALUE, Short.MAX_VALUE));
}
}
-
+
+ public void testSparseShortNumericsVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestNumericsVsStoredFields(random().nextDouble(), () -> TestUtil.nextInt(random(), Short.MIN_VALUE, Short.MAX_VALUE));
+ }
+ }
+
public void testIntNumericsVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestNumericsVsStoredFields(Integer.MIN_VALUE, Integer.MAX_VALUE);
+ doTestNumericsVsStoredFields(1, random()::nextInt);
+ }
+ }
+
+ public void testSparseIntNumericsVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestNumericsVsStoredFields(random().nextDouble(), random()::nextInt);
}
}
public void testLongNumericsVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestNumericsVsStoredFields(Long.MIN_VALUE, Long.MAX_VALUE);
+ doTestNumericsVsStoredFields(1, random()::nextLong);
}
}
- private void doTestBinaryVsStoredFields(int minLength, int maxLength) throws Exception {
+ public void testSparseLongNumericsVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestNumericsVsStoredFields(random().nextDouble(), random()::nextLong);
+ }
+ }
+
+ private void doTestBinaryVsStoredFields(double density, Supplier<byte[]> bytes) throws Exception {
Directory dir = newDirectory();
IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random()));
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
@@ -1373,15 +1409,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// index some docs
int numDocs = atLeast(300);
for (int i = 0; i < numDocs; i++) {
- idField.setStringValue(Integer.toString(i));
- final int length;
- if (minLength == maxLength) {
- length = minLength; // fixed length
- } else {
- length = TestUtil.nextInt(random(), minLength, maxLength);
+ if (random().nextDouble() > density) {
+ writer.addDocument(new Document());
+ continue;
}
- byte buffer[] = new byte[length];
- random().nextBytes(buffer);
+ idField.setStringValue(Integer.toString(i));
+ byte[] buffer = bytes.get();
storedField.setBytesValue(buffer);
dvField.setBytesValue(buffer);
writer.addDocument(doc);
@@ -1399,28 +1432,44 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare
DirectoryReader ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
- BinaryDocValues docValues = r.getBinaryDocValues("dv");
+ BinaryDocValues docValues = DocValues.getBinary(r, "dv");
+ docValues.nextDoc();
for (int i = 0; i < r.maxDoc(); i++) {
BytesRef binaryValue = r.document(i).getBinaryValue("stored");
- assertEquals(i, docValues.nextDoc());
- assertEquals(binaryValue, docValues.binaryValue());
+ if (binaryValue == null) {
+ assertTrue(docValues.docID() > i);
+ } else {
+ assertEquals(i, docValues.docID());
+ assertEquals(binaryValue, docValues.binaryValue());
+ docValues.nextDoc();
+ }
}
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, docValues.docID());
}
ir.close();
// compare again
writer.forceMerge(1);
ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
- BinaryDocValues docValues = r.getBinaryDocValues("dv");
+ BinaryDocValues docValues = DocValues.getBinary(r, "dv");
+ docValues.nextDoc();
for (int i = 0; i < r.maxDoc(); i++) {
BytesRef binaryValue = r.document(i).getBinaryValue("stored");
- assertEquals(i, docValues.nextDoc());
- assertEquals(binaryValue, docValues.binaryValue());
+ if (binaryValue == null) {
+ assertTrue(docValues.docID() > i);
+ } else {
+ assertEquals(i, docValues.docID());
+ assertEquals(binaryValue, docValues.binaryValue());
+ docValues.nextDoc();
+ }
}
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, docValues.docID());
}
ir.close();
writer.close();
@@ -1428,21 +1477,46 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
}
public void testBinaryFixedLengthVsStoredFields() throws Exception {
+ doTestBinaryFixedLengthVsStoredFields(1);
+ }
+
+ public void testSparseBinaryFixedLengthVsStoredFields() throws Exception {
+ doTestBinaryFixedLengthVsStoredFields(random().nextDouble());
+ }
+
+ private void doTestBinaryFixedLengthVsStoredFields(double density) throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
int fixedLength = TestUtil.nextInt(random(), 0, 10);
- doTestBinaryVsStoredFields(fixedLength, fixedLength);
+ doTestBinaryVsStoredFields(density, () -> {
+ byte buffer[] = new byte[fixedLength];
+ random().nextBytes(buffer);
+ return buffer;
+ });
}
}
-
+
public void testBinaryVariableLengthVsStoredFields() throws Exception {
+ doTestBinaryVariableLengthVsStoredFields(1);
+ }
+
+ public void testSparseBinaryVariableLengthVsStoredFields() throws Exception {
+ doTestBinaryVariableLengthVsStoredFields(random().nextDouble());
+ }
+
+ public void doTestBinaryVariableLengthVsStoredFields(double density) throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestBinaryVsStoredFields(0, 10);
+ doTestBinaryVsStoredFields(density, () -> {
+ final int length = random().nextInt(10);
+ byte buffer[] = new byte[length];
+ random().nextBytes(buffer);
+ return buffer;
+ });
}
}
- protected void doTestSortedVsStoredFields(int numDocs, int minLength, int maxLength) throws Exception {
+ protected void doTestSortedVsStoredFields(int numDocs, double density, Supplier<byte[]> bytes) throws Exception {
Directory dir = newFSDirectory(createTempDir("dvduel"));
IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random()));
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
@@ -1456,15 +1530,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// index some docs
for (int i = 0; i < numDocs; i++) {
- idField.setStringValue(Integer.toString(i));
- final int length;
- if (minLength == maxLength) {
- length = minLength; // fixed length
- } else {
- length = TestUtil.nextInt(random(), minLength, maxLength);
+ if (random().nextDouble() > density) {
+ writer.addDocument(new Document());
+ continue;
}
- byte buffer[] = new byte[length];
- random().nextBytes(buffer);
+ idField.setStringValue(Integer.toString(i));
+ byte[] buffer = bytes.get();
storedField.setBytesValue(buffer);
dvField.setBytesValue(buffer);
writer.addDocument(doc);
@@ -1482,28 +1553,44 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare
DirectoryReader ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
BinaryDocValues docValues = DocValues.getBinary(r, "dv");
+ docValues.nextDoc();
for (int i = 0; i < r.maxDoc(); i++) {
BytesRef binaryValue = r.document(i).getBinaryValue("stored");
- assertEquals(i, docValues.nextDoc());
- assertEquals(binaryValue, docValues.binaryValue());
+ if (binaryValue == null) {
+ assertTrue(docValues.docID() > i);
+ } else {
+ assertEquals(i, docValues.docID());
+ assertEquals(binaryValue, docValues.binaryValue());
+ docValues.nextDoc();
+ }
}
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, docValues.docID());
}
ir.close();
writer.forceMerge(1);
// compare again
ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
BinaryDocValues docValues = DocValues.getBinary(r, "dv");
+ docValues.nextDoc();
for (int i = 0; i < r.maxDoc(); i++) {
BytesRef binaryValue = r.document(i).getBinaryValue("stored");
- assertEquals(i, docValues.nextDoc());
- assertEquals(binaryValue, docValues.binaryValue());
+ if (binaryValue == null) {
+ assertTrue(docValues.docID() > i);
+ } else {
+ assertEquals(i, docValues.docID());
+ assertEquals(binaryValue, docValues.binaryValue());
+ docValues.nextDoc();
+ }
}
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, docValues.docID());
}
ir.close();
writer.close();
@@ -1514,17 +1601,41 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
int fixedLength = TestUtil.nextInt(random(), 1, 10);
- doTestSortedVsStoredFields(atLeast(300), fixedLength, fixedLength);
+ doTestSortedVsStoredFields(atLeast(300), 1, fixedLength, fixedLength);
}
}
- public void testSortedVariableLengthVsStoredFields() throws Exception {
+ public void testSparseSortedFixedLengthVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestSortedVsStoredFields(atLeast(300), 1, 10);
+ int fixedLength = TestUtil.nextInt(random(), 1, 10);
+ doTestSortedVsStoredFields(atLeast(300), random().nextDouble(), fixedLength, fixedLength);
}
}
+ public void testSortedVariableLengthVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestSortedVsStoredFields(atLeast(300), 1, 1, 10);
+ }
+ }
+
+ public void testSparseSortedVariableLengthVsStoredFields() throws Exception {
+ int numIterations = atLeast(1);
+ for (int i = 0; i < numIterations; i++) {
+ doTestSortedVsStoredFields(atLeast(300), random().nextDouble(), 1, 10);
+ }
+ }
+
+ protected void doTestSortedVsStoredFields(int numDocs, double density, int minLength, int maxLength) throws Exception {
+ doTestSortedVsStoredFields(numDocs, density, () -> {
+ int length = TestUtil.nextInt(random(), minLength, maxLength);
+ byte[] buffer = new byte[length];
+ random().nextBytes(buffer);
+ return buffer;
+ });
+ }
+
public void testSortedSetOneValue() throws IOException {
Directory directory = newDirectory();
RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory);
@@ -2001,6 +2112,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare
DirectoryReader ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
SortedSetDocValues docValues = r.getSortedSetDocValues("dv");
@@ -2029,6 +2141,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// compare again
ir = writer.getReader();
+ TestUtil.checkReader(ir);
for (LeafReaderContext context : ir.leaves()) {
LeafReader r = context.reader();
SortedSetDocValues docValues = r.getSortedSetDocValues("dv");
@@ -2067,18 +2180,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
doTestSortedNumericsVsStoredFields(
- new LongProducer() {
- @Override
- long next() {
- return 1;
- }
- },
- new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), Long.MIN_VALUE, Long.MAX_VALUE);
- }
- }
+ () -> 1,
+ random()::nextLong
);
}
}
@@ -2087,18 +2190,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
doTestSortedNumericsVsStoredFields(
- new LongProducer() {
- @Override
- long next() {
- return random().nextBoolean() ? 0 : 1;
- }
- },
- new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), Long.MIN_VALUE, Long.MAX_VALUE);
- }
- }
+ () -> random().nextBoolean() ? 0 : 1,
+ random()::nextLong
);
}
}
@@ -2107,18 +2200,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
doTestSortedNumericsVsStoredFields(
- new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), 0, 50);
- }
- },
- new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), Long.MIN_VALUE, Long.MAX_VALUE);
- }
- }
+ () -> TestUtil.nextLong(random(), 0, 50),
+ random()::nextLong
);
}
}
@@ -2131,18 +2214,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
doTestSortedNumericsVsStoredFields(
- new LongProducer() {
- @Override
- long next() {
- return TestUtil.nextLong(random(), 0, 6);
- }
- },
- new LongProducer() {
- @Override
- long next() {
- return values[random().nextInt(values.length)];
- }
- }
+ () -> TestUtil.nextLong(random(), 0, 6),
+ () -> values[random().nextInt(values.length)]
);
}
}
@@ -2198,22 +2271,31 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
}
public void testGCDCompression() throws Exception {
+ doTestGCDCompression(1);
+ }
+
+ public void testSparseGCDCompression() throws Exception {
+ doTestGCDCompression(random().nextDouble());
+ }
+
+ private void doTestGCDCompression(double density) throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
final long min = - (((long) random().nextInt(1 << 30)) << 32);
final long mul = random().nextInt() & 0xFFFFFFFFL;
- final LongProducer longs = new LongProducer() {
- @Override
- long next() {
- return min + mul * random().nextInt(1 << 20);
- }
+ final LongSupplier longs = () -> {
+ return min + mul * random().nextInt(1 << 20);
};
- doTestNumericsVsStoredFields(longs);
+ doTestNumericsVsStoredFields(density, longs);
}
}
public void testZeros() throws Exception {
- doTestNumericsVsStoredFields(0, 0);
+ doTestNumericsVsStoredFields(1, () -> 0);
+ }
+
+ public void testSparseZeros() throws Exception {
+ doTestNumericsVsStoredFields(random().nextDouble(), () -> 0);
}
public void testZeroOrMin() throws Exception {
@@ -2221,13 +2303,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
// the GCD of 0 and MIN_VALUE is negative
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- final LongProducer longs = new LongProducer() {
- @Override
- long next() {
- return random().nextBoolean() ? 0 : Long.MIN_VALUE;
- }
+ final LongSupplier longs = () -> {
+ return random().nextBoolean() ? 0 : Long.MIN_VALUE;
};
- doTestNumericsVsStoredFields(longs);
+ doTestNumericsVsStoredFields(1, longs);
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/test-framework/src/java/org/apache/lucene/index/BaseIndexFileFormatTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseIndexFileFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseIndexFileFormatTestCase.java
index d56e6cb..7a7abc0 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseIndexFileFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseIndexFileFormatTestCase.java
@@ -362,6 +362,12 @@ abstract class BaseIndexFileFormatTestCase extends LuceneTestCase {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return target == 0;
+ }
+
+ @Override
public long cost() {
return 1;
}
@@ -415,6 +421,12 @@ abstract class BaseIndexFileFormatTestCase extends LuceneTestCase {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return target == 0;
+ }
+
+ @Override
public long cost() {
return 1;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
index 64e99da..cd62218 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
+import java.util.function.LongSupplier;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.MockAnalyzer;
@@ -59,9 +60,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
});
@@ -73,9 +74,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
});
@@ -86,9 +87,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Short.MIN_VALUE, Short.MAX_VALUE);
}
});
@@ -100,9 +101,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Short.MIN_VALUE, Short.MAX_VALUE);
}
});
@@ -113,9 +114,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Long.MIN_VALUE, Long.MAX_VALUE);
}
});
@@ -127,9 +128,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return TestUtil.nextLong(r, Long.MIN_VALUE, Long.MAX_VALUE);
}
});
@@ -140,9 +141,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
int thingToDo = r.nextInt(3);
switch (thingToDo) {
case 0: return Long.MIN_VALUE;
@@ -159,9 +160,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
int thingToDo = r.nextInt(3);
switch (thingToDo) {
case 0: return Long.MIN_VALUE;
@@ -177,9 +178,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextBoolean() ? 20 : 3;
}
});
@@ -191,9 +192,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextBoolean() ? 20 : 3;
}
});
@@ -204,9 +205,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextBoolean() ? 1000000L : -5000;
}
});
@@ -218,9 +219,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextBoolean() ? 1000000L : -5000;
}
});
@@ -230,9 +231,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
public void testAllZeros() throws Exception {
int iterations = atLeast(1);
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return 0;
}
});
@@ -243,9 +244,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
assumeTrue("Requires sparse norms support", codecSupportsSparsity());
int iterations = atLeast(1);
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return 0;
}
});
@@ -256,9 +257,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
int iterations = atLeast(1);
final Random r = random();
for (int i = 0; i < iterations; i++) {
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE) : 0;
}
});
@@ -270,9 +271,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
final Random r = random();
for (int i = 0; i < iterations; i++) {
final long commonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE) : commonValue;
}
});
@@ -285,9 +286,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
final Random r = random();
for (int i = 0; i < iterations; i++) {
final long commonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE) : commonValue;
}
});
@@ -300,9 +301,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int i = 0; i < iterations; i++) {
final long commonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
final long uncommonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? uncommonValue : commonValue;
}
});
@@ -316,9 +317,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int i = 0; i < iterations; i++) {
final long commonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
final long uncommonValue = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? uncommonValue : commonValue;
}
});
@@ -337,9 +338,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int j = 0; j < numOtherValues; ++j) {
otherValues[j] = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? otherValues[r.nextInt(numOtherValues - 1)] : commonValues[r.nextInt(N - 1)];
}
});
@@ -358,9 +359,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int j = 0; j < numOtherValues; ++j) {
otherValues[j] = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? otherValues[r.nextInt(numOtherValues - 1)] : commonValues[r.nextInt(N - 1)];
}
});
@@ -386,9 +387,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int j = 0; j < numOtherValues; ++j) {
otherValues[j] = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
- doTestNormsVersusDocValues(1, new LongProducer() {
+ doTestNormsVersusDocValues(1, new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? otherValues[r.nextInt(numOtherValues - 1)] : commonValues[r.nextInt(N - 1)];
}
});
@@ -417,9 +418,9 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
for (int j = 0; j < numOtherValues; ++j) {
otherValues[j] = TestUtil.nextLong(r, Byte.MIN_VALUE, Byte.MAX_VALUE);
}
- doTestNormsVersusDocValues(random().nextDouble(), new LongProducer() {
+ doTestNormsVersusDocValues(random().nextDouble(), new LongSupplier() {
@Override
- long next() {
+ public long getAsLong() {
return r.nextInt(100) == 0 ? otherValues[r.nextInt(numOtherValues - 1)] : commonValues[r.nextInt(N - 1)];
}
});
@@ -427,7 +428,7 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
}
}
- private void doTestNormsVersusDocValues(double density, LongProducer longs) throws Exception {
+ private void doTestNormsVersusDocValues(double density, LongSupplier longs) throws Exception {
int numDocs = atLeast(500);
final FixedBitSet docsWithField = new FixedBitSet(numDocs);
final int numDocsWithField = Math.max(1, (int) (density * numDocs));
@@ -445,7 +446,7 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
}
long norms[] = new long[numDocsWithField];
for (int i = 0; i < numDocsWithField; i++) {
- norms[i] = longs.next();
+ norms[i] = longs.getAsLong();
}
Directory dir = newDirectory();
@@ -519,10 +520,6 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
}
}
- static abstract class LongProducer {
- abstract long next();
- }
-
static class CannedNormSimilarity extends Similarity {
final long norms[];
int index = 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java b/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
index 09ad836..0dab34b 100644
--- a/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
@@ -272,11 +272,8 @@ public class DocValuesFacets {
final LongValues ordmap = map == null ? null : map.getGlobalOrds(subIndex);
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
int term;
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
term = si.ordValue();
} else {
term = -1;
@@ -301,10 +298,7 @@ public class DocValuesFacets {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
segCounts[1+si.ordValue()]++;
} else {
segCounts[0]++;
@@ -334,10 +328,7 @@ public class DocValuesFacets {
final LongValues ordMap = map == null ? null : map.getGlobalOrds(subIndex);
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
// strange do-while to collect the missing count (first ord is NO_MORE_ORDS)
int term = (int) si.nextOrd();
do {
@@ -365,10 +356,7 @@ public class DocValuesFacets {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
int term = (int) si.nextOrd();
do {
segCounts[1+term]++;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java b/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
index 0c88b80..3db7b4c 100644
--- a/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
+++ b/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
@@ -293,11 +293,8 @@ class PerSegmentSingleValuedFaceting {
// specialized version when collecting counts for all terms
int doc;
while ((doc = iter.nextDoc()) < DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
int t;
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
t = 1+si.ordValue();
} else {
t = 0;
@@ -309,11 +306,8 @@ class PerSegmentSingleValuedFaceting {
// version that adjusts term numbers because we aren't collecting the full range
int doc;
while ((doc = iter.nextDoc()) < DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > si.docID()) {
- si.advance(doc);
- }
int term;
- if (doc == si.docID()) {
+ if (si.advanceExact(doc)) {
term = si.ordValue();
} else {
term = -1;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index 933477b..5ac1975 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -795,7 +795,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
continue;
}
Long val;
- if (ndv.advance(localId) == localId) {
+ if (ndv.advanceExact(localId)) {
val = ndv.longValue();
} else {
continue;
@@ -820,7 +820,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
continue;
}
BytesRef value;
- if (bdv.advance(localId) == localId) {
+ if (bdv.advanceExact(localId)) {
value = BytesRef.deepCopyOf(bdv.binaryValue());
} else {
continue;
@@ -832,7 +832,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
if (sdv == null) {
continue;
}
- if (sdv.advance(localId) == localId) {
+ if (sdv.advanceExact(localId)) {
final BytesRef bRef = sdv.binaryValue();
// Special handling for Boolean fields since they're stored as 'T' and 'F'.
if (schemaField.getType() instanceof BoolField) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArrayDV.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArrayDV.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArrayDV.java
index fb60945..88adf67 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArrayDV.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArrayDV.java
@@ -186,10 +186,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > singleDv.docID()) {
- singleDv.advance(doc);
- }
- if (doc == singleDv.docID()) {
+ if (singleDv.advanceExact(doc)) {
counts[ singleDv.ordValue() + 1 ]++;
} else {
counts[ 0 ]++;
@@ -211,10 +208,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > multiDv.docID()) {
- multiDv.advance(doc);
- }
- if (doc == multiDv.docID()) {
+ if (multiDv.advanceExact(doc)) {
for(;;) {
int segOrd = (int)multiDv.nextOrd();
if (segOrd < 0) break;
@@ -247,10 +241,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
private void collectDocs(SortedDocValues singleDv, DocIdSetIterator disi, LongValues toGlobal) throws IOException {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > singleDv.docID()) {
- singleDv.advance(doc);
- }
- if (doc == singleDv.docID()) {
+ if (singleDv.advanceExact(doc)) {
int segOrd = singleDv.ordValue();
collect(doc, segOrd, toGlobal);
}
@@ -260,10 +251,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
private void collectCounts(SortedDocValues singleDv, DocIdSetIterator disi, LongValues toGlobal) throws IOException {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > singleDv.docID()) {
- singleDv.advance(doc);
- }
- if (doc == singleDv.docID()) {
+ if (singleDv.advanceExact(doc)) {
int segOrd = singleDv.ordValue();
int ord = (int)toGlobal.get(segOrd);
countAcc.incrementCount(ord, 1);
@@ -274,10 +262,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
private void collectDocs(SortedSetDocValues multiDv, DocIdSetIterator disi, LongValues toGlobal) throws IOException {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > multiDv.docID()) {
- multiDv.advance(doc);
- }
- if (doc == multiDv.docID()) {
+ if (multiDv.advanceExact(doc)) {
for(;;) {
int segOrd = (int)multiDv.nextOrd();
if (segOrd < 0) break;
@@ -290,10 +275,7 @@ class FacetFieldProcessorByArrayDV extends FacetFieldProcessorByArray {
private void collectCounts(SortedSetDocValues multiDv, DocIdSetIterator disi, LongValues toGlobal) throws IOException {
int doc;
while ((doc = disi.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
- if (doc > multiDv.docID()) {
- multiDv.advance(doc);
- }
- if (doc == multiDv.docID()) {
+ if (multiDv.advanceExact(doc)) {
for(;;) {
int segOrd = (int)multiDv.nextOrd();
if (segOrd < 0) break;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/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 b63e5e9..2224010 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
@@ -692,6 +692,12 @@ class FieldCacheImpl implements FieldCache {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docsWithField.get(docID);
+ }
+
+ @Override
public long cost() {
return values.size();
}
@@ -821,6 +827,12 @@ class FieldCacheImpl implements FieldCache {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docToTermOrd.get(docID) != 0;
+ }
+
+ @Override
public long cost() {
return 0;
}
@@ -1022,6 +1034,12 @@ class FieldCacheImpl implements FieldCache {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docsWithField.get(docID);
+ }
+
+ @Override
public long cost() {
return 0;
}