You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2016/10/24 08:52:11 UTC
[2/2] lucene-solr:master: LUCENE-7462: Give doc values APIs an
`advanceExact` method.
LUCENE-7462: Give doc values APIs an `advanceExact` method.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9aca4c9d
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9aca4c9d
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9aca4c9d
Branch: refs/heads/master
Commit: 9aca4c9d56089a9ac89df5fd93be76a4fe822448
Parents: 9b49c72
Author: Adrien Grand <jp...@gmail.com>
Authored: Thu Oct 20 14:07:10 2016 +0200
Committer: Adrien Grand <jp...@gmail.com>
Committed: Mon Oct 24 10:51:23 2016 +0200
----------------------------------------------------------------------
.../codecs/lucene53/Lucene53NormsProducer.java | 6 +
.../lucene54/Lucene54DocValuesProducer.java | 65 +++-
.../lucene54/TestLucene54DocValuesFormat.java | 5 +-
.../simpletext/SimpleTextDocValuesReader.java | 95 +++++-
.../simpletext/SimpleTextDocValuesWriter.java | 9 +
.../apache/lucene/codecs/DocValuesConsumer.java | 25 ++
.../org/apache/lucene/codecs/NormsConsumer.java | 5 +
.../lucene/codecs/lucene70/IndexedDISI.java | 88 +++--
.../lucene70/Lucene70DocValuesProducer.java | 62 ++++
.../codecs/lucene70/Lucene70NormsProducer.java | 11 +
.../apache/lucene/index/BinaryDocValues.java | 5 +-
.../lucene/index/BinaryDocValuesWriter.java | 5 +
.../org/apache/lucene/index/CheckIndex.java | 81 ++++-
.../java/org/apache/lucene/index/DocValues.java | 95 +++---
.../apache/lucene/index/DocValuesIterator.java | 33 ++
.../lucene/index/FilterBinaryDocValues.java | 5 +
.../lucene/index/FilterNumericDocValues.java | 5 +
.../index/LegacyBinaryDocValuesWrapper.java | 8 +
.../index/LegacyNumericDocValuesWrapper.java | 9 +
.../index/LegacySortedDocValuesWrapper.java | 9 +
.../LegacySortedNumericDocValuesWrapper.java | 9 +
.../index/LegacySortedSetDocValuesWrapper.java | 10 +
.../org/apache/lucene/index/MultiDocValues.java | 125 +++++++
.../apache/lucene/index/NormValuesWriter.java | 5 +
.../apache/lucene/index/NumericDocValues.java | 7 +-
.../lucene/index/NumericDocValuesWriter.java | 5 +
.../apache/lucene/index/ReadersAndUpdates.java | 10 +
.../index/SingletonSortedNumericDocValues.java | 24 +-
.../index/SingletonSortedSetDocValues.java | 18 +-
.../apache/lucene/index/SortedDocValues.java | 3 +
.../lucene/index/SortedDocValuesWriter.java | 5 +
.../lucene/index/SortedNumericDocValues.java | 6 +-
.../index/SortedNumericDocValuesWriter.java | 5 +
.../apache/lucene/index/SortedSetDocValues.java | 5 +-
.../lucene/index/SortedSetDocValuesWriter.java | 5 +
.../apache/lucene/index/SortingLeafReader.java | 32 ++
.../apache/lucene/search/FieldComparator.java | 40 +--
.../lucene/search/SortedNumericSelector.java | 18 +
.../apache/lucene/search/SortedSetSelector.java | 36 ++
.../search/similarities/BM25Similarity.java | 8 +-
.../search/similarities/SimilarityBase.java | 6 +-
.../search/similarities/TFIDFSimilarity.java | 8 +-
.../lucene/codecs/lucene70/TestIndexedDISI.java | 28 +-
.../lucene70/TestLucene70DocValuesFormat.java | 4 +-
.../SortedSetDocValuesFacetCounts.java | 15 +-
.../lucene/search/join/BlockJoinSelector.java | 104 +++++-
.../search/join/GenericTermsCollector.java | 7 +
.../search/join/TestBlockJoinSelector.java | 12 +
.../apache/lucene/index/memory/MemoryIndex.java | 6 +
.../search/TestDiversifiedTopDocsCollector.java | 9 +
.../lucene/index/AssertingLeafReader.java | 89 ++++-
.../index/BaseDocValuesFormatTestCase.java | 331 ++++++++++++-------
.../index/BaseIndexFileFormatTestCase.java | 12 +
.../lucene/index/BaseNormsFormatTestCase.java | 101 +++---
.../apache/solr/request/DocValuesFacets.java | 20 +-
.../request/PerSegmentSingleValuedFaceting.java | 10 +-
.../apache/solr/search/SolrIndexSearcher.java | 6 +-
.../facet/FacetFieldProcessorByArrayDV.java | 30 +-
.../apache/solr/uninverting/FieldCacheImpl.java | 18 +
59 files changed, 1405 insertions(+), 413 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java
index a97cb5a..718fcd6 100644
--- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java
+++ b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java
@@ -222,6 +222,12 @@ class Lucene53NormsProducer extends NormsProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return true;
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
index 1f785fe..f1c169c 100644
--- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
+++ b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
@@ -477,6 +477,12 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return true;
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
@@ -524,6 +530,13 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ value = values.get(doc);
+ return value != 0 || docsWithField.get(doc);
+ }
+
+ @Override
public long cost() {
return maxDoc;
}
@@ -696,6 +709,16 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (advance(target) == target) {
+ return true;
+ }
+ --index;
+ doc = target;
+ return false;
+ }
+
+ @Override
public long longValue() {
assert index >= 0;
assert index < docIDsLength;
@@ -891,6 +914,11 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return sparseValues.advanceExact(target);
+ }
+
+ @Override
public long cost() {
return sparseValues.cost();
}
@@ -933,7 +961,14 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
return nextDoc();
}
}
-
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ ord = (int) ordinals.get(target);
+ return ord != -1;
+ }
+
@Override
public int ordValue() {
return ord;
@@ -1017,6 +1052,11 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return sparseValues.advanceExact(target);
+ }
+
+ @Override
public long cost() {
return sparseValues.cost();
}
@@ -1061,6 +1101,12 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docsWithField.get(docID);
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
@@ -1122,6 +1168,14 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ startOffset = ordIndex.get(docID);
+ endOffset = ordIndex.get(docID+1L);
+ return endOffset > startOffset;
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
@@ -1185,6 +1239,15 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ int ord = (int) ordinals.get(docID);
+ startOffset = offsets[ord];
+ endOffset = offsets[ord+1];
+ return endOffset > startOffset;
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
index c6ca201..b231716 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
@@ -106,7 +106,7 @@ public class TestLucene54DocValuesFormat 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);
}
}
@@ -114,7 +114,7 @@ public class TestLucene54DocValuesFormat 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);
}
}
@@ -201,6 +201,7 @@ public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatT
}
final IndexReader indexReader = writer.getReader();
+ TestUtil.checkReader(indexReader);
writer.close();
for (LeafReaderContext context : indexReader.leaves()) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
index adf5e42..09f97ab 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
@@ -144,7 +144,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
if (values == null) {
return null;
} else {
- DocIdSetIterator docsWithField = getNumericDocsWithField(fieldInfo);
+ DocValuesIterator docsWithField = getNumericDocsWithField(fieldInfo);
return new NumericDocValues() {
@Override
@@ -168,6 +168,11 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return docsWithField.advanceExact(target);
+ }
+
+ @Override
public long longValue() throws IOException {
return values.apply(docsWithField.docID());
}
@@ -214,12 +219,16 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
};
}
-
- private DocIdSetIterator getNumericDocsWithField(FieldInfo fieldInfo) throws IOException {
+
+ private static abstract class DocValuesIterator extends DocIdSetIterator {
+ abstract boolean advanceExact(int target) throws IOException;
+ }
+
+ private DocValuesIterator getNumericDocsWithField(FieldInfo fieldInfo) throws IOException {
final OneField field = fields.get(fieldInfo.name);
final IndexInput in = data.clone();
final BytesRefBuilder scratch = new BytesRefBuilder();
- return new DocIdSetIterator() {
+ return new DocValuesIterator() {
int doc = -1;
@@ -250,6 +259,15 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
return doc = NO_MORE_DOCS;
}
+
+ @Override
+ boolean advanceExact(int target) throws IOException {
+ this.doc = target;
+ in.seek(field.dataStartFilePointer + (1+field.pattern.length()+2)*target);
+ SimpleTextUtil.readLine(in, scratch); // data
+ SimpleTextUtil.readLine(in, scratch); // 'T' or 'F'
+ return scratch.byteAt(0) == (byte) 'T';
+ }
};
}
@@ -265,7 +283,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
final BytesRefBuilder scratch = new BytesRefBuilder();
final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
- DocIdSetIterator docsWithField = getBinaryDocsWithField(fieldInfo);
+ DocValuesIterator docsWithField = getBinaryDocsWithField(fieldInfo);
IntFunction<BytesRef> values = new IntFunction<BytesRef>() {
final BytesRefBuilder term = new BytesRefBuilder();
@@ -317,19 +335,24 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return docsWithField.advanceExact(target);
+ }
+
+ @Override
public BytesRef binaryValue() throws IOException {
return values.apply(docsWithField.docID());
}
};
}
- private DocIdSetIterator getBinaryDocsWithField(FieldInfo fieldInfo) throws IOException {
+ private DocValuesIterator getBinaryDocsWithField(FieldInfo fieldInfo) throws IOException {
final OneField field = fields.get(fieldInfo.name);
final IndexInput in = data.clone();
final BytesRefBuilder scratch = new BytesRefBuilder();
final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
- return new DocIdSetIterator() {
+ return new DocValuesIterator() {
int doc = -1;
@@ -371,6 +394,26 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
return doc = NO_MORE_DOCS;
}
+
+ @Override
+ boolean advanceExact(int target) throws IOException {
+ this.doc = target;
+ in.seek(field.dataStartFilePointer + (9+field.pattern.length() + field.maxLength+2)*target);
+ SimpleTextUtil.readLine(in, scratch);
+ assert StringHelper.startsWith(scratch.get(), LENGTH);
+ int len;
+ try {
+ len = decoder.parse(new String(scratch.bytes(), LENGTH.length, scratch.length() - LENGTH.length, StandardCharsets.UTF_8)).intValue();
+ } catch (ParseException pe) {
+ throw new CorruptIndexException("failed to parse int length", in, pe);
+ }
+ // skip past bytes
+ byte bytes[] = new byte[len];
+ in.readBytes(bytes, 0, len);
+ SimpleTextUtil.readLine(in, scratch); // newline
+ SimpleTextUtil.readLine(in, scratch); // 'T' or 'F'
+ return scratch.byteAt(0) == (byte) 'T';
+ }
};
}
@@ -424,7 +467,20 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
return doc = NO_MORE_DOCS;
}
-
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ this.doc = target;
+ in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + target * (1 + field.ordPattern.length()));
+ SimpleTextUtil.readLine(in, scratch);
+ try {
+ ord = (int) ordDecoder.parse(scratch.get().utf8ToString()).longValue()-1;
+ } catch (ParseException pe) {
+ throw new CorruptIndexException("failed to parse ord", in, pe);
+ }
+ return ord >= 0;
+ }
+
@Override
public int ordValue() {
return ord;
@@ -488,6 +544,15 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
return doc;
}
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ if (binary.advanceExact(target)) {
+ setCurrentDoc();
+ return true;
+ }
+ return false;
+ }
+
long values[];
int index;
@@ -570,6 +635,20 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + target * (1 + field.ordPattern.length()));
+ SimpleTextUtil.readLine(in, scratch);
+ String ordList = scratch.get().utf8ToString().trim();
+ doc = target;
+ if (ordList.isEmpty() == false) {
+ currentOrds = ordList.split(",");
+ currentIndex = 0;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long nextOrd() throws IOException {
if (currentIndex == currentOrds.length) {
return NO_MORE_ORDS;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
index 2649ae6..8c6bdde 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
@@ -342,6 +342,15 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
return doc;
}
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ if (values.advanceExact(target)) {
+ setCurrentDoc();
+ return true;
+ }
+ return false;
+ }
+
final StringBuilder builder = new StringBuilder();
BytesRef binaryValue;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
index e04d5b9..e61724f 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
@@ -228,6 +228,11 @@ public abstract class DocValuesConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return finalCost;
}
@@ -320,6 +325,11 @@ public abstract class DocValuesConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return finalCost;
}
@@ -417,6 +427,11 @@ public abstract class DocValuesConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public int docValueCount() {
return currentSub.values.docValueCount();
}
@@ -575,6 +590,11 @@ public abstract class DocValuesConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return finalCost;
}
@@ -732,6 +752,11 @@ public abstract class DocValuesConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long nextOrd() throws IOException {
long subOrd = currentSub.values.nextOrd();
if (subOrd == NO_MORE_ORDS) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/codecs/NormsConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/NormsConsumer.java b/lucene/core/src/java/org/apache/lucene/codecs/NormsConsumer.java
index 3a6ce22..51abb69 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/NormsConsumer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/NormsConsumer.java
@@ -158,6 +158,11 @@ public abstract class NormsConsumer implements Closeable {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/codecs/lucene70/IndexedDISI.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/IndexedDISI.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/IndexedDISI.java
index 3ea3141..24eaf7a 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/IndexedDISI.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/IndexedDISI.java
@@ -112,6 +112,9 @@ final class IndexedDISI extends DocIdSetIterator {
private int doc = -1;
private int index = -1;
+ // SPARSE variables
+ boolean exists;
+
// DENSE variables
private long word;
private int wordIndex = -1;
@@ -129,7 +132,7 @@ final class IndexedDISI extends DocIdSetIterator {
@Override
public int advance(int target) throws IOException {
final int targetBlock = target & 0xFFFF0000;
- if (block != targetBlock) {
+ if (block < targetBlock) {
advanceBlock(targetBlock);
}
if (block == targetBlock) {
@@ -138,7 +141,19 @@ final class IndexedDISI extends DocIdSetIterator {
}
readBlockHeader();
}
- return doc = method.readFirstDoc(this);
+ boolean found = method.advanceWithinBlock(this, block);
+ assert found;
+ return doc;
+ }
+
+ public boolean advanceExact(int target) throws IOException {
+ final int targetBlock = target & 0xFFFF0000;
+ if (block < targetBlock) {
+ advanceBlock(targetBlock);
+ }
+ boolean found = block == targetBlock && method.advanceExactWithinBlock(this, target);
+ this.doc = target;
+ return found;
}
private void advanceBlock(int targetBlock) throws IOException {
@@ -186,11 +201,6 @@ final class IndexedDISI extends DocIdSetIterator {
enum Method {
SPARSE {
@Override
- int readFirstDoc(IndexedDISI disi) throws IOException {
- disi.index++;
- return disi.block | Short.toUnsignedInt(disi.slice.readShort());
- }
- @Override
boolean advanceWithinBlock(IndexedDISI disi, int target) throws IOException {
final int targetInBlock = target & 0xFFFF;
// TODO: binary search
@@ -199,23 +209,37 @@ final class IndexedDISI extends DocIdSetIterator {
disi.index++;
if (doc >= targetInBlock) {
disi.doc = disi.block | doc;
+ disi.exists = true;
return true;
}
}
return false;
}
- },
- DENSE {
@Override
- int readFirstDoc(IndexedDISI disi) throws IOException {
- do {
- disi.word = disi.slice.readLong();
- disi.wordIndex++;
- } while (disi.word == 0L);
- disi.index = disi.numberOfOnes;
- disi.numberOfOnes += Long.bitCount(disi.word);
- return disi.block | (disi.wordIndex << 6) | Long.numberOfTrailingZeros(disi.word);
+ boolean advanceExactWithinBlock(IndexedDISI disi, int target) throws IOException {
+ final int targetInBlock = target & 0xFFFF;
+ // TODO: binary search
+ if (target == disi.doc) {
+ return disi.exists;
+ }
+ for (; disi.index < disi.nextBlockIndex;) {
+ int doc = Short.toUnsignedInt(disi.slice.readShort());
+ disi.index++;
+ if (doc >= targetInBlock) {
+ if (doc != targetInBlock) {
+ disi.index--;
+ disi.slice.seek(disi.slice.getFilePointer() - Short.BYTES);
+ break;
+ }
+ disi.exists = true;
+ return true;
+ }
+ }
+ disi.exists = false;
+ return false;
}
+ },
+ DENSE {
@Override
boolean advanceWithinBlock(IndexedDISI disi, int target) throws IOException {
final int targetInBlock = target & 0xFFFF;
@@ -244,26 +268,42 @@ final class IndexedDISI extends DocIdSetIterator {
}
return false;
}
- },
- ALL {
@Override
- int readFirstDoc(IndexedDISI disi) {
- return disi.block;
+ boolean advanceExactWithinBlock(IndexedDISI disi, int target) throws IOException {
+ final int targetInBlock = target & 0xFFFF;
+ final int targetWordIndex = targetInBlock >>> 6;
+ for (int i = disi.wordIndex + 1; i <= targetWordIndex; ++i) {
+ disi.word = disi.slice.readLong();
+ disi.numberOfOnes += Long.bitCount(disi.word);
+ }
+ disi.wordIndex = targetWordIndex;
+
+ long leftBits = disi.word >>> target;
+ disi.index = disi.numberOfOnes - Long.bitCount(leftBits);
+ return (leftBits & 1L) != 0;
}
+ },
+ ALL {
@Override
boolean advanceWithinBlock(IndexedDISI disi, int target) throws IOException {
disi.doc = target;
disi.index = target - disi.gap;
return true;
}
+ @Override
+ boolean advanceExactWithinBlock(IndexedDISI disi, int target) throws IOException {
+ disi.index = target - disi.gap;
+ return true;
+ }
};
- /** Read the first document of the current block. */
- abstract int readFirstDoc(IndexedDISI disi) throws IOException;
-
/** Advance to the first doc from the block that is equal to or greater than {@code target}.
* Return true if there is such a doc and false otherwise. */
abstract boolean advanceWithinBlock(IndexedDISI disi, int target) throws IOException;
+
+ /** Advance the iterator exactly to the position corresponding to the given {@code target}
+ * and return whether this document exists. */
+ abstract boolean advanceExactWithinBlock(IndexedDISI disi, int target) throws IOException;
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
index 637c8ee..19815ba 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
@@ -375,6 +375,12 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) {
+ doc = target;
+ return true;
+ }
+
+ @Override
public long cost() {
return maxDoc;
}
@@ -392,6 +398,11 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return disi.advanceExact(target);
+ }
+
+ @Override
public int nextDoc() throws IOException {
return disi.nextDoc();
}
@@ -521,6 +532,12 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return true;
+ }
+
+ @Override
public BytesRef binaryValue() throws IOException {
return bytesRefs.get(doc);
}
@@ -551,6 +568,11 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return disi.advanceExact(target);
+ }
+
+ @Override
public BytesRef binaryValue() throws IOException {
return bytesRefs.get(disi.index());
}
@@ -616,6 +638,12 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) {
+ doc = target;
+ return true;
+ }
+
+ @Override
public int ordValue() {
return (int) ords.get(doc);
}
@@ -646,6 +674,11 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return disi.advanceExact(target);
+ }
+
+ @Override
public int ordValue() {
return (int) ords.get(disi.index());
}
@@ -960,6 +993,15 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ start = addresses.get(target);
+ end = addresses.get(target + 1L);
+ count = (int) (end - start);
+ doc = target;
+ return true;
+ }
+
+ @Override
public long nextValue() throws IOException {
return values.get(start++);
}
@@ -1001,6 +1043,12 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ set = false;
+ return disi.advanceExact(target);
+ }
+
+ @Override
public long nextValue() throws IOException {
set();
return values.get(start++);
@@ -1073,6 +1121,14 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ start = addresses.get(target);
+ end = addresses.get(target + 1L);
+ doc = target;
+ return true;
+ }
+
+ @Override
public long nextOrd() throws IOException {
if (start == end) {
return NO_MORE_ORDS;
@@ -1113,6 +1169,12 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ set = false;
+ return disi.advanceExact(target);
+ }
+
+ @Override
public long nextOrd() throws IOException {
if (set == false) {
final int index = disi.index();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
index e3f6f79..c97f1c3 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
@@ -160,6 +160,12 @@ final class Lucene70NormsProducer extends NormsProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ this.doc = target;
+ return true;
+ }
+
+ @Override
public long cost() {
return maxDoc;
}
@@ -177,6 +183,11 @@ final class Lucene70NormsProducer extends NormsProducer {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return disi.advanceExact(target);
+ }
+
+ @Override
public int nextDoc() throws IOException {
return disi.nextDoc();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
index 66397e4..6d23cf1 100644
--- a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
@@ -19,13 +19,12 @@ package org.apache.lucene.index;
import java.io.IOException;
-import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.util.BytesRef;
/**
* A per-document numeric value.
*/
-public abstract class BinaryDocValues extends DocIdSetIterator {
+public abstract class BinaryDocValues extends DocValuesIterator {
/** Sole constructor. (For invocation by subclass
* constructors, typically implicit.) */
@@ -33,6 +32,8 @@ public abstract class BinaryDocValues extends DocIdSetIterator {
/**
* Returns the binary value for the current document ID.
+ * It is illegal to call this method after {@link #advanceExact(int)}
+ * returned {@code false}.
* @return binary value
*/
public abstract BytesRef binaryValue() throws IOException;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/BinaryDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValuesWriter.java
index ff2e67c..9611a03 100644
--- a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValuesWriter.java
@@ -154,6 +154,11 @@ class BinaryDocValuesWriter extends DocValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return docsWithField.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
index aec7537..f3d3562 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
@@ -2062,13 +2062,83 @@ public final class CheckIndex implements Closeable {
return status;
}
+ @FunctionalInterface
+ private static interface DocValuesIteratorSupplier {
+ DocValuesIterator get(FieldInfo fi) throws IOException;
+ }
+
+ private static void checkDVIterator(FieldInfo fi, int maxDoc, DocValuesIteratorSupplier producer) throws IOException {
+ String field = fi.name;
+
+ // Check advance
+ DocValuesIterator it1 = producer.get(fi);
+ DocValuesIterator it2 = producer.get(fi);
+ int i = 0;
+ for (int doc = it1.nextDoc(); ; doc = it1.nextDoc()) {
+
+ if (i++ % 10 == 1) {
+ int doc2 = it2.advance(doc - 1);
+ if (doc2 < doc - 1) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + (doc-1) + " went backwords (got: " + doc2 + ")");
+ }
+ if (doc2 == doc - 1) {
+ doc2 = it2.nextDoc();
+ }
+ if (doc2 != doc) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + doc + " was not found through advance() (got: " + doc2 + ")");
+ }
+ if (it2.docID() != doc) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + doc + " reports wrong doc ID (got: " + it2.docID() + ")");
+ }
+ }
+
+ if (doc == NO_MORE_DOCS) {
+ break;
+ }
+ }
+
+ // Check advanceExact
+ it1 = producer.get(fi);
+ it2 = producer.get(fi);
+ i = 0;
+ int lastDoc = -1;
+ for (int doc = it1.nextDoc(); doc != NO_MORE_DOCS ; doc = it1.nextDoc()) {
+
+ if (i++ % 13 == 1) {
+ boolean found = it2.advanceExact(doc - 1);
+ if ((doc - 1 == lastDoc) != found) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + (doc-1) + " disagrees about whether document exists (got: " + found + ")");
+ }
+ if (it2.docID() != doc - 1) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + (doc-1) + " reports wrong doc ID (got: " + it2.docID() + ")");
+ }
+
+ boolean found2 = it2.advanceExact(doc - 1);
+ if (found != found2) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + (doc-1) + " has unstable advanceExact");
+ }
+
+ if (i % 1 == 0) {
+ int doc2 = it2.nextDoc();
+ if (doc != doc2) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + doc + " was not found through advance() (got: " + doc2 + ")");
+ }
+ if (it2.docID() != doc) {
+ throw new RuntimeException("dv iterator field=" + field + ": doc=" + doc + " reports wrong doc ID (got: " + it2.docID() + ")");
+ }
+ }
+ }
+
+ lastDoc = doc;
+ }
+ }
+
private static void checkBinaryDocValues(String fieldName, int maxDoc, BinaryDocValues bdv) throws IOException {
int doc;
if (bdv.docID() != -1) {
throw new RuntimeException("binary dv iterator for field: " + fieldName + " should start at docID=-1, but got " + bdv.docID());
}
// TODO: we could add stats to DVs, e.g. total doc count w/ a value for this field
- // TODO: check advance too
while ((doc = bdv.nextDoc()) != NO_MORE_DOCS) {
BytesRef value = bdv.binaryValue();
value.isValid();
@@ -2083,7 +2153,6 @@ public final class CheckIndex implements Closeable {
FixedBitSet seenOrds = new FixedBitSet(dv.getValueCount());
int maxOrd2 = -1;
int docID;
- // TODO: check advance too
while ((docID = dv.nextDoc()) != NO_MORE_DOCS) {
int ord = dv.ordValue();
if (ord == -1) {
@@ -2119,7 +2188,6 @@ public final class CheckIndex implements Closeable {
LongBitSet seenOrds = new LongBitSet(dv.getValueCount());
long maxOrd2 = -1;
int docID;
- // TODO: check advance too
while ((docID = dv.nextDoc()) != NO_MORE_DOCS) {
long lastOrd = -1;
long ord;
@@ -2164,7 +2232,6 @@ public final class CheckIndex implements Closeable {
if (ndv.docID() != -1) {
throw new RuntimeException("dv iterator for field: " + fieldName + " should start at docID=-1, but got " + ndv.docID());
}
- // TODO: check advance too
while (true) {
int docID = ndv.nextDoc();
if (docID == NO_MORE_DOCS) {
@@ -2191,7 +2258,6 @@ public final class CheckIndex implements Closeable {
throw new RuntimeException("dv iterator for field: " + fieldName + " should start at docID=-1, but got " + ndv.docID());
}
// TODO: we could add stats to DVs, e.g. total doc count w/ a value for this field
- // TODO: check advance too
while ((doc = ndv.nextDoc()) != NO_MORE_DOCS) {
ndv.longValue();
}
@@ -2201,23 +2267,28 @@ public final class CheckIndex implements Closeable {
switch(fi.getDocValuesType()) {
case SORTED:
status.totalSortedFields++;
+ checkDVIterator(fi, maxDoc, dvReader::getSorted);
checkBinaryDocValues(fi.name, maxDoc, dvReader.getSorted(fi));
checkSortedDocValues(fi.name, maxDoc, dvReader.getSorted(fi));
break;
case SORTED_NUMERIC:
status.totalSortedNumericFields++;
+ checkDVIterator(fi, maxDoc, dvReader::getSortedNumeric);
checkSortedNumericDocValues(fi.name, maxDoc, dvReader.getSortedNumeric(fi));
break;
case SORTED_SET:
status.totalSortedSetFields++;
+ checkDVIterator(fi, maxDoc, dvReader::getSortedSet);
checkSortedSetDocValues(fi.name, maxDoc, dvReader.getSortedSet(fi));
break;
case BINARY:
status.totalBinaryFields++;
+ checkDVIterator(fi, maxDoc, dvReader::getBinary);
checkBinaryDocValues(fi.name, maxDoc, dvReader.getBinary(fi));
break;
case NUMERIC:
status.totalNumericFields++;
+ checkDVIterator(fi, maxDoc, dvReader::getNumeric);
checkNumericDocValues(fi.name, dvReader.getNumeric(fi));
break;
default:
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/DocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocValues.java b/lucene/core/src/java/org/apache/lucene/index/DocValues.java
index 3377f45..b25d484 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocValues.java
@@ -35,26 +35,27 @@ public final class DocValues {
*/
public static final BinaryDocValues emptyBinary() {
return new BinaryDocValues() {
- private boolean exhausted = false;
+ private int doc = -1;
@Override
public int advance(int target) {
- assert exhausted == false;
- assert target >= 0;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return true;
}
@Override
public int docID() {
- return exhausted ? NO_MORE_DOCS : -1;
+ return doc;
}
@Override
public int nextDoc() {
- assert exhausted == false;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
}
@Override
@@ -75,26 +76,27 @@ public final class DocValues {
*/
public static final NumericDocValues emptyNumeric() {
return new NumericDocValues() {
- private boolean exhausted = false;
+ private int doc = -1;
@Override
public int advance(int target) {
- assert exhausted == false;
- assert target >= 0;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return false;
}
@Override
public int docID() {
- return exhausted ? NO_MORE_DOCS : -1;
+ return doc;
}
@Override
public int nextDoc() {
- assert exhausted == false;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
}
@Override
@@ -140,26 +142,27 @@ public final class DocValues {
final BytesRef empty = new BytesRef();
return new SortedDocValues() {
- private boolean exhausted = false;
+ private int doc = -1;
@Override
public int advance(int target) {
- assert exhausted == false;
- assert target >= 0;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return false;
}
@Override
public int docID() {
- return exhausted ? NO_MORE_DOCS : -1;
+ return doc;
}
@Override
public int nextDoc() {
- assert exhausted == false;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
}
@Override
@@ -191,26 +194,27 @@ public final class DocValues {
public static final SortedNumericDocValues emptySortedNumeric(int maxDoc) {
return new SortedNumericDocValues() {
- private boolean exhausted = false;
+ private int doc = -1;
@Override
public int advance(int target) {
- assert exhausted == false;
- assert target >= 0;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return false;
}
@Override
public int docID() {
- return exhausted ? NO_MORE_DOCS : -1;
+ return doc;
}
@Override
public int nextDoc() {
- assert exhausted == false;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
}
@Override
@@ -237,26 +241,27 @@ public final class DocValues {
final BytesRef empty = new BytesRef();
return new SortedSetDocValues() {
- private boolean exhausted = false;
+ private int doc = -1;
@Override
public int advance(int target) {
- assert exhausted == false;
- assert target >= 0;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ doc = target;
+ return false;
}
@Override
public int docID() {
- return exhausted ? NO_MORE_DOCS : -1;
+ return doc;
}
@Override
public int nextDoc() {
- assert exhausted == false;
- exhausted = true;
- return NO_MORE_DOCS;
+ return doc = NO_MORE_DOCS;
}
@Override
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java b/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java
new file mode 100644
index 0000000..d53e26a
--- /dev/null
+++ b/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.lucene.index;
+
+import java.io.IOException;
+
+import org.apache.lucene.search.DocIdSetIterator;
+
+abstract class DocValuesIterator extends DocIdSetIterator {
+
+ /** Advance the iterator to exactly {@code target} and return whether
+ * {@code target} has a value.
+ * {@code target} must be greater than or equal to the current
+ * {@link #docID() doc ID} and must be a valid doc ID, ie. ≥ 0 and
+ * < {@code maxDoc}.
+ * After this method returns, {@link #docID()} retuns {@code target}. */
+ public abstract boolean advanceExact(int target) throws IOException;
+
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java b/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
index 66c4323..650ad04 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
@@ -50,6 +50,11 @@ public abstract class FilterBinaryDocValues extends BinaryDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return in.advanceExact(target);
+ }
+
+ @Override
public long cost() {
return in.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/FilterNumericDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterNumericDocValues.java b/lucene/core/src/java/org/apache/lucene/index/FilterNumericDocValues.java
index 0058fa6..bd00cf2 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterNumericDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterNumericDocValues.java
@@ -48,6 +48,11 @@ public abstract class FilterNumericDocValues extends NumericDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ return in.advanceExact(target);
+ }
+
+ @Override
public long cost() {
return in.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/LegacyBinaryDocValuesWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LegacyBinaryDocValuesWrapper.java b/lucene/core/src/java/org/apache/lucene/index/LegacyBinaryDocValuesWrapper.java
index 13bc207..919b1ff 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LegacyBinaryDocValuesWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LegacyBinaryDocValuesWrapper.java
@@ -17,6 +17,8 @@
package org.apache.lucene.index;
+import java.io.IOException;
+
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
@@ -71,6 +73,12 @@ public final class LegacyBinaryDocValuesWrapper extends BinaryDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return docsWithField.get(target);
+ }
+
+ @Override
public long cost() {
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/LegacyNumericDocValuesWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LegacyNumericDocValuesWrapper.java b/lucene/core/src/java/org/apache/lucene/index/LegacyNumericDocValuesWrapper.java
index a72efe8..aaccc05 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LegacyNumericDocValuesWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LegacyNumericDocValuesWrapper.java
@@ -17,6 +17,8 @@
package org.apache.lucene.index;
+import java.io.IOException;
+
import org.apache.lucene.util.Bits;
/**
@@ -70,6 +72,13 @@ public final class LegacyNumericDocValuesWrapper extends NumericDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ value = values.get(docID);
+ return value != 0 || docsWithField.get(docID);
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/LegacySortedDocValuesWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LegacySortedDocValuesWrapper.java b/lucene/core/src/java/org/apache/lucene/index/LegacySortedDocValuesWrapper.java
index d8ef2f4..ecc114b 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LegacySortedDocValuesWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LegacySortedDocValuesWrapper.java
@@ -17,6 +17,8 @@
package org.apache.lucene.index;
+import java.io.IOException;
+
import org.apache.lucene.util.BytesRef;
/**
@@ -71,6 +73,13 @@ public final class LegacySortedDocValuesWrapper extends SortedDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ ord = values.getOrd(docID);
+ return ord != -1;
+ }
+
+ @Override
public long cost() {
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/LegacySortedNumericDocValuesWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LegacySortedNumericDocValuesWrapper.java b/lucene/core/src/java/org/apache/lucene/index/LegacySortedNumericDocValuesWrapper.java
index bf3c6cd..cfb61e3 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LegacySortedNumericDocValuesWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LegacySortedNumericDocValuesWrapper.java
@@ -17,6 +17,8 @@
package org.apache.lucene.index;
+import java.io.IOException;
+
/**
* Wraps a {@link LegacySortedNumericDocValues} into a {@link SortedNumericDocValues}.
*
@@ -72,6 +74,13 @@ public final class LegacySortedNumericDocValuesWrapper extends SortedNumericDocV
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ values.setDocument(docID);
+ return values.count() != 0;
+ }
+
+ @Override
public long cost() {
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/LegacySortedSetDocValuesWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LegacySortedSetDocValuesWrapper.java b/lucene/core/src/java/org/apache/lucene/index/LegacySortedSetDocValuesWrapper.java
index 45d12d2..0e96e02 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LegacySortedSetDocValuesWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LegacySortedSetDocValuesWrapper.java
@@ -17,6 +17,8 @@
package org.apache.lucene.index;
+import java.io.IOException;
+
import org.apache.lucene.util.BytesRef;
/**
@@ -72,6 +74,14 @@ public final class LegacySortedSetDocValuesWrapper extends SortedSetDocValues {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ values.setDocument(docID);
+ ord = values.nextOrd();
+ return ord != NO_MORE_ORDS;
+ }
+
+ @Override
public long cost() {
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java b/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
index aeb49c5..51d684d 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
@@ -139,6 +139,27 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID <= docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, leaves);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == leaves.size()) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentLeaf = leaves.get(readerIndex);
+ currentValues = currentLeaf.reader().getNormValues(field);
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentLeaf.docBase);
+ }
+
+ @Override
public long longValue() throws IOException {
return currentValues.longValue();
}
@@ -244,6 +265,26 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID <= docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, leaves);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == leaves.size()) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentLeaf = leaves.get(readerIndex);
+ currentValues = currentLeaf.reader().getNumericDocValues(field);
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentLeaf.docBase);
+ }
+ @Override
public long longValue() throws IOException {
return currentValues.longValue();
}
@@ -348,6 +389,27 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID <= docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, leaves);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == leaves.size()) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentLeaf = leaves.get(readerIndex);
+ currentValues = currentLeaf.reader().getBinaryDocValues(field);
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentLeaf.docBase);
+ }
+
+ @Override
public BytesRef binaryValue() throws IOException {
return currentValues.binaryValue();
}
@@ -462,6 +524,27 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID <= docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, leaves);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == leaves.size()) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentLeaf = leaves.get(readerIndex);
+ currentValues = values[readerIndex];
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentLeaf.docBase);
+ }
+
+ @Override
public long cost() {
return finalTotalCost;
}
@@ -923,6 +1006,27 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID <= docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, docStarts);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == values.length) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentDocStart = docStarts[readerIndex];
+ currentValues = values[readerIndex];
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentDocStart);
+ }
+
+ @Override
public int ordValue() {
return (int) mapping.getGlobalOrds(nextLeaf-1).get(currentValues.ordValue());
}
@@ -1029,6 +1133,27 @@ public class MultiDocValues {
}
@Override
+ public boolean advanceExact(int targetDocID) throws IOException {
+ if (targetDocID < docID) {
+ throw new IllegalArgumentException("can only advance beyond current document: on docID=" + docID + " but targetDocID=" + targetDocID);
+ }
+ int readerIndex = ReaderUtil.subIndex(targetDocID, docStarts);
+ if (readerIndex >= nextLeaf) {
+ if (readerIndex == values.length) {
+ throw new IllegalArgumentException("Out of range: " + targetDocID);
+ }
+ currentDocStart = docStarts[readerIndex];
+ currentValues = values[readerIndex];
+ nextLeaf = readerIndex+1;
+ }
+ docID = targetDocID;
+ if (currentValues == null) {
+ return false;
+ }
+ return currentValues.advanceExact(targetDocID - currentDocStart);
+ }
+
+ @Override
public long nextOrd() throws IOException {
long segmentOrd = currentValues.nextOrd();
if (segmentOrd == NO_MORE_ORDS) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/NormValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/NormValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/NormValuesWriter.java
index 46b8c1c..b0d05e4 100644
--- a/lucene/core/src/java/org/apache/lucene/index/NormValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/NormValuesWriter.java
@@ -133,6 +133,11 @@ class NormValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return docsWithField.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/NumericDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/NumericDocValues.java b/lucene/core/src/java/org/apache/lucene/index/NumericDocValues.java
index 5ae2e47..29b9918 100644
--- a/lucene/core/src/java/org/apache/lucene/index/NumericDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/NumericDocValues.java
@@ -19,12 +19,10 @@ package org.apache.lucene.index;
import java.io.IOException;
-import org.apache.lucene.search.DocIdSetIterator;
-
/**
* A per-document numeric value.
*/
-public abstract class NumericDocValues extends DocIdSetIterator {
+public abstract class NumericDocValues extends DocValuesIterator {
/** Sole constructor. (For invocation by subclass
* constructors, typically implicit.) */
@@ -32,7 +30,10 @@ public abstract class NumericDocValues extends DocIdSetIterator {
/**
* Returns the numeric value for the current document ID.
+ * It is illegal to call this method after {@link #advanceExact(int)}
+ * returned {@code false}.
* @return numeric value
*/
public abstract long longValue() throws IOException;
+
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/NumericDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/NumericDocValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/NumericDocValuesWriter.java
index adfa706..24a7010 100644
--- a/lucene/core/src/java/org/apache/lucene/index/NumericDocValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/NumericDocValuesWriter.java
@@ -119,6 +119,11 @@ class NumericDocValuesWriter extends DocValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return docsWithField.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/ReadersAndUpdates.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/ReadersAndUpdates.java b/lucene/core/src/java/org/apache/lucene/index/ReadersAndUpdates.java
index 894c81a..3cd465c 100644
--- a/lucene/core/src/java/org/apache/lucene/index/ReadersAndUpdates.java
+++ b/lucene/core/src/java/org/apache/lucene/index/ReadersAndUpdates.java
@@ -360,6 +360,11 @@ class ReadersAndUpdates {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
// TODO
return 0;
@@ -462,6 +467,11 @@ class ReadersAndUpdates {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return currentValues.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SingletonSortedNumericDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedNumericDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedNumericDocValues.java
index d95f0c0..5dbdec8 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedNumericDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedNumericDocValues.java
@@ -27,7 +27,6 @@ import java.io.IOException;
*/
final class SingletonSortedNumericDocValues extends SortedNumericDocValues {
private final NumericDocValues in;
- private long value;
public SingletonSortedNumericDocValues(NumericDocValues in) {
if (in.docID() != -1) {
@@ -51,30 +50,27 @@ final class SingletonSortedNumericDocValues extends SortedNumericDocValues {
@Override
public int nextDoc() throws IOException {
- int docID = in.nextDoc();
- if (docID != NO_MORE_DOCS) {
- value = in.longValue();
- }
- return docID;
+ return in.nextDoc();
}
@Override
public int advance(int target) throws IOException {
- int docID = in.advance(target);
- if (docID != NO_MORE_DOCS) {
- value = in.longValue();
- }
- return docID;
+ return in.advance(target);
+ }
+
+ @Override
+ public boolean advanceExact(int target) throws IOException {
+ return in.advanceExact(target);
}
-
+
@Override
public long cost() {
return in.cost();
}
@Override
- public long nextValue() {
- return value;
+ public long nextValue() throws IOException {
+ return in.longValue();
}
@Override
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
index cc7360e..f16cdf1 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
@@ -29,7 +29,6 @@ import org.apache.lucene.util.BytesRef;
*/
final class SingletonSortedSetDocValues extends SortedSetDocValues {
private final SortedDocValues in;
- private long currentOrd;
private long ord;
/** Creates a multi-valued view over the provided SortedDocValues */
@@ -55,8 +54,8 @@ final class SingletonSortedSetDocValues extends SortedSetDocValues {
@Override
public long nextOrd() {
- long v = currentOrd;
- currentOrd = NO_MORE_ORDS;
+ long v = ord;
+ ord = NO_MORE_ORDS;
return v;
}
@@ -64,7 +63,7 @@ final class SingletonSortedSetDocValues extends SortedSetDocValues {
public int nextDoc() throws IOException {
int docID = in.nextDoc();
if (docID != NO_MORE_DOCS) {
- currentOrd = ord = in.ordValue();
+ ord = in.ordValue();
}
return docID;
}
@@ -73,12 +72,21 @@ final class SingletonSortedSetDocValues extends SortedSetDocValues {
public int advance(int target) throws IOException {
int docID = in.advance(target);
if (docID != NO_MORE_DOCS) {
- currentOrd = ord = in.ordValue();
+ ord = in.ordValue();
}
return docID;
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ ord = in.ordValue();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public BytesRef lookupOrd(long ord) throws IOException {
// cast is ok: single-valued cannot exceed Integer.MAX_VALUE
return in.lookupOrd((int) ord);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
index 7ff084f..e2d7dfd 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
@@ -40,6 +40,8 @@ public abstract class SortedDocValues extends BinaryDocValues {
/**
* Returns the ordinal for the current docID.
+ * It is illegal to call this method after {@link #advanceExact(int)}
+ * returned {@code false}.
* @return ordinal for the document: this is dense, starts at 0, then
* increments by 1 for the next value in sorted order.
*/
@@ -107,4 +109,5 @@ public abstract class SortedDocValues extends BinaryDocValues {
public TermsEnum termsEnum() throws IOException {
return new SortedDocValuesTermsEnum(this);
}
+
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java
index 885ee89..7e43e49 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java
@@ -166,6 +166,11 @@ class SortedDocValuesWriter extends DocValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long cost() {
return docsWithField.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValues.java
index 8c11495..a76b46d 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValues.java
@@ -18,14 +18,12 @@ package org.apache.lucene.index;
import java.io.IOException;
-import org.apache.lucene.search.DocIdSetIterator;
-
/**
* A list of per-document numeric values, sorted
* according to {@link Long#compare(long, long)}.
*/
-public abstract class SortedNumericDocValues extends DocIdSetIterator {
+public abstract class SortedNumericDocValues extends DocValuesIterator {
/** Sole constructor. (For invocation by subclass
* constructors, typically implicit.) */
@@ -40,6 +38,8 @@ public abstract class SortedNumericDocValues extends DocIdSetIterator {
/**
* Retrieves the number of values for the current document. This must always
* be greater than zero.
+ * It is illegal to call this method after {@link #advanceExact(int)}
+ * returned {@code false}.
*/
public abstract int docValueCount();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValuesWriter.java
index e154547..3f50623 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedNumericDocValuesWriter.java
@@ -155,6 +155,11 @@ class SortedNumericDocValuesWriter extends DocValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public int docValueCount() {
return valueCount;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
index 439843b..6d02c25 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
@@ -19,7 +19,6 @@ package org.apache.lucene.index;
import java.io.IOException;
-import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.util.BytesRef;
/**
@@ -30,7 +29,7 @@ import org.apache.lucene.util.BytesRef;
* dictionary value (ordinal) can be retrieved for each document. Ordinals
* are dense and in increasing sorted order.
*/
-public abstract class SortedSetDocValues extends DocIdSetIterator {
+public abstract class SortedSetDocValues extends DocValuesIterator {
/** Sole constructor. (For invocation by subclass
* constructors, typically implicit.) */
@@ -43,6 +42,8 @@ public abstract class SortedSetDocValues extends DocIdSetIterator {
/**
* Returns the next ordinal for the current document.
+ * It is illegal to call this method after {@link #advanceExact(int)}
+ * returned {@code false}.
* @return next ordinal for the document, or {@link #NO_MORE_ORDS}.
* ordinals are dense, start at 0, then increment by 1 for
* the next value in sorted order.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValuesWriter.java
index e7d915f..35157d4 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValuesWriter.java
@@ -226,6 +226,11 @@ class SortedSetDocValuesWriter extends DocValuesWriter {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public long getValueCount() {
return ordMap.length;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java b/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
index 8139ed1..4fb5027 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
@@ -186,6 +186,12 @@ class SortingLeafReader extends FilterLeafReader {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return dvs.docsWithField.get(target);
+ }
+
+ @Override
public BytesRef binaryValue() {
return dvs.values[docID];
}
@@ -255,6 +261,12 @@ class SortingLeafReader extends FilterLeafReader {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return dvs.docsWithField.get(target);
+ }
+
+ @Override
public long longValue() {
return dvs.values[docID];
}
@@ -395,6 +407,12 @@ class SortingLeafReader extends FilterLeafReader {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ return ords[target] != -1;
+ }
+
+ @Override
public int ordValue() {
return ords[docID];
}
@@ -468,6 +486,13 @@ class SortingLeafReader extends FilterLeafReader {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ ordUpto = 0;
+ return ords[docID] != null;
+ }
+
+ @Override
public long nextOrd() {
if (ordUpto == ords[docID].length) {
return NO_MORE_ORDS;
@@ -539,6 +564,13 @@ class SortingLeafReader extends FilterLeafReader {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ docID = target;
+ upto = 0;
+ return values[docID] != null;
+ }
+
+ @Override
public long nextValue() {
if (upto == values[docID].length) {
throw new AssertionError();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
index b6c17c0..8216201 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
@@ -178,11 +178,7 @@ public abstract class FieldComparator<T> {
}
private double getValueForDoc(int doc) throws IOException {
- int curDocID = currentReaderValues.docID();
- if (doc > curDocID) {
- curDocID = currentReaderValues.advance(doc);
- }
- if (doc == curDocID) {
+ if (currentReaderValues.advanceExact(doc)) {
return Double.longBitsToDouble(currentReaderValues.longValue());
} else {
return missingValue;
@@ -242,11 +238,7 @@ public abstract class FieldComparator<T> {
}
private float getValueForDoc(int doc) throws IOException {
- int curDocID = currentReaderValues.docID();
- if (doc > curDocID) {
- curDocID = currentReaderValues.advance(doc);
- }
- if (doc == curDocID) {
+ if (currentReaderValues.advanceExact(doc)) {
return Float.intBitsToFloat((int) currentReaderValues.longValue());
} else {
return missingValue;
@@ -308,11 +300,7 @@ public abstract class FieldComparator<T> {
}
private int getValueForDoc(int doc) throws IOException {
- int curDocID = currentReaderValues.docID();
- if (doc > curDocID) {
- curDocID = currentReaderValues.advance(doc);
- }
- if (doc == curDocID) {
+ if (currentReaderValues.advanceExact(doc)) {
return (int) currentReaderValues.longValue();
} else {
return missingValue;
@@ -372,11 +360,7 @@ public abstract class FieldComparator<T> {
}
private long getValueForDoc(int doc) throws IOException {
- int curDocID = currentReaderValues.docID();
- if (doc > curDocID) {
- curDocID = currentReaderValues.advance(doc);
- }
- if (doc == curDocID) {
+ if (currentReaderValues.advanceExact(doc)) {
return currentReaderValues.longValue();
} else {
return missingValue;
@@ -656,15 +640,11 @@ public abstract class FieldComparator<T> {
}
private int getOrdForDoc(int doc) throws IOException {
- int curDocID = termsIndex.docID();
- if (doc > curDocID) {
- if (termsIndex.advance(doc) == doc) {
- return termsIndex.ordValue();
- }
- } else if (doc == curDocID) {
+ if (termsIndex.advanceExact(doc)) {
return termsIndex.ordValue();
+ } else {
+ return -1;
}
- return -1;
}
@Override
@@ -864,11 +844,7 @@ public abstract class FieldComparator<T> {
}
private BytesRef getValueForDoc(int doc) throws IOException {
- int curDocID = docTerms.docID();
- if (doc > curDocID) {
- curDocID = docTerms.advance(doc);
- }
- if (doc == curDocID) {
+ if (docTerms.advanceExact(doc)) {
return docTerms.binaryValue();
} else {
return null;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/SortedNumericSelector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SortedNumericSelector.java b/lucene/core/src/java/org/apache/lucene/search/SortedNumericSelector.java
index 43e97e7..705454e 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SortedNumericSelector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SortedNumericSelector.java
@@ -132,6 +132,15 @@ public class SortedNumericSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ value = in.nextValue();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}
@@ -182,6 +191,15 @@ public class SortedNumericSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ setValue();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9aca4c9d/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java b/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
index f10dbf7..2d6c351 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
@@ -118,6 +118,15 @@ public class SortedSetSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ setOrd();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}
@@ -180,6 +189,15 @@ public class SortedSetSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ setOrd();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}
@@ -249,6 +267,15 @@ public class SortedSetSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ setOrd();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}
@@ -330,6 +357,15 @@ public class SortedSetSelector {
}
@Override
+ public boolean advanceExact(int target) throws IOException {
+ if (in.advanceExact(target)) {
+ setOrd();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public long cost() {
return in.cost();
}