diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 5d28a1d2072..8cf32e91431 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -19,6 +19,10 @@ Changes in backwards compatibility policy (Nikola Tanković, Uwe Schindler, Chris Male, Mike McCandless, Robert Muir) +* LUCENE-4924: DocIdSetIterator.docID() must now return -1 when the iterator is + not positioned. This change affects all classes that inherit from + DocIdSetIterator, including DocsEnum and DocsAndPositionsEnum. (Adrien Grand) + New Features * LUCENE-4747: Move to Java 7 as minimum Java version. diff --git a/lucene/core/src/java/org/apache/lucene/search/DocIdSet.java b/lucene/core/src/java/org/apache/lucene/search/DocIdSet.java index 6df23b17bd2..901fe7f2364 100644 --- a/lucene/core/src/java/org/apache/lucene/search/DocIdSet.java +++ b/lucene/core/src/java/org/apache/lucene/search/DocIdSet.java @@ -29,20 +29,36 @@ public abstract class DocIdSet { /** An empty {@code DocIdSet} instance for easy use, e.g. in Filters that hit no documents. */ public static final DocIdSet EMPTY_DOCIDSET = new DocIdSet() { - private final DocIdSetIterator iterator = new DocIdSetIterator() { - @Override - public int advance(int target) { return NO_MORE_DOCS; } - @Override - public int docID() { return NO_MORE_DOCS; } - @Override - public int nextDoc() { return NO_MORE_DOCS; } - @Override - public long cost() { return 0; } - }; - @Override public DocIdSetIterator iterator() { - return iterator; + return new DocIdSetIterator() { + boolean exhausted = false; + + @Override + public int advance(int target) { + assert !exhausted; + assert target >= 0; + exhausted = true; + return NO_MORE_DOCS; + } + + @Override + public int docID() { + return exhausted ? NO_MORE_DOCS : -1; + } + + @Override + public int nextDoc() { + assert !exhausted; + exhausted = true; + return NO_MORE_DOCS; + } + + @Override + public long cost() { + return 0; + } + }; } @Override @@ -56,7 +72,7 @@ public abstract class DocIdSet { return null; } }; - + /** Provides a {@link DocIdSetIterator} to access the set. * This implementation can return null or * {@linkplain #EMPTY_DOCIDSET}.iterator() if there diff --git a/lucene/core/src/java/org/apache/lucene/search/DocIdSetIterator.java b/lucene/core/src/java/org/apache/lucene/search/DocIdSetIterator.java index 6aa870ee411..e1e328b7129 100644 --- a/lucene/core/src/java/org/apache/lucene/search/DocIdSetIterator.java +++ b/lucene/core/src/java/org/apache/lucene/search/DocIdSetIterator.java @@ -37,7 +37,7 @@ public abstract class DocIdSetIterator { /** * Returns the following: *