You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2013/07/13 15:07:09 UTC
svn commit: r1502784 - in /lucene/dev/trunk/lucene: CHANGES.txt
join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
Author: dsmiley
Date: Sat Jul 13 13:07:08 2013
New Revision: 1502784
URL: http://svn.apache.org/r1502784
Log:
LUCENE-5103: A join on A single-valued field with deleted docs scored too few docs. Did a little refactoring of the inner scorers too.
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1502784&r1=1502783&r2=1502784&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Sat Jul 13 13:07:08 2013
@@ -222,6 +222,9 @@ Bug Fixes
* LUCENE-5068: QueryParserUtil.escape() does not escape forward slash.
(Matias Holte via Steve Rowe)
+* LUCENE-5103: A join on A single-valued field with deleted docs scored too few
+ docs. (David Smiley)
+
Optimizations
* LUCENE-4936: Improve numeric doc values compression in case all values share
Modified: lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java?rev=1502784&r1=1502783&r2=1502784&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java Sat Jul 13 13:07:08 2013
@@ -216,7 +216,7 @@ class TermsIncludingScoreQuery extends Q
return scores[ords[scoreUpto]];
}
- public Explanation explain() throws IOException {
+ Explanation explain() throws IOException {
return new ComplexExplanation(true, score(), "Score based on join value " + termsEnum.term().utf8ToString());
}
@@ -226,16 +226,16 @@ class TermsIncludingScoreQuery extends Q
}
int nextDocOutOfOrder() throws IOException {
- if (docsEnum != null) {
- int docId = docsEnum.nextDoc();
- if (docId == DocIdSetIterator.NO_MORE_DOCS) {
- docsEnum = null;
- } else {
- return doc = docId;
+ while (true) {
+ if (docsEnum != null) {
+ int docId = docsEnumNextDoc();
+ if (docId == DocIdSetIterator.NO_MORE_DOCS) {
+ docsEnum = null;
+ } else {
+ return doc = docId;
+ }
}
- }
- do {
if (upto == terms.size()) {
return doc = DocIdSetIterator.NO_MORE_DOCS;
}
@@ -244,9 +244,11 @@ class TermsIncludingScoreQuery extends Q
if (termsEnum.seekExact(terms.get(ords[upto++], spare), true)) {
docsEnum = reuse = termsEnum.docs(acceptDocs, reuse, DocsEnum.FLAG_NONE);
}
- } while (docsEnum == null);
+ }
+ }
- return doc = docsEnum.nextDoc();
+ protected int docsEnumNextDoc() throws IOException {
+ return docsEnum.nextDoc();
}
@Override
@@ -301,47 +303,14 @@ class TermsIncludingScoreQuery extends Q
}
@Override
- int nextDocOutOfOrder() throws IOException {
- if (docsEnum != null) {
- int docId;
- do {
- docId = docsEnum.nextDoc();
- if (docId == DocIdSetIterator.NO_MORE_DOCS) {
- break;
- }
- } while (alreadyEmittedDocs.get(docId));
+ protected int docsEnumNextDoc() throws IOException {
+ while (true) {
+ int docId = docsEnum.nextDoc();
if (docId == DocIdSetIterator.NO_MORE_DOCS) {
- docsEnum = null;
- } else {
- alreadyEmittedDocs.set(docId);
return docId;
}
- }
-
- for (;;) {
- do {
- if (upto == terms.size()) {
- return DocIdSetIterator.NO_MORE_DOCS;
- }
-
- scoreUpto = upto;
- if (termsEnum.seekExact(terms.get(ords[upto++], spare), true)) {
- docsEnum = reuse = termsEnum.docs(acceptDocs, reuse, DocsEnum.FLAG_NONE);
- }
- } while (docsEnum == null);
-
- int docId;
- do {
- docId = docsEnum.nextDoc();
- if (docId == DocIdSetIterator.NO_MORE_DOCS) {
- break;
- }
- } while (alreadyEmittedDocs.get(docId));
- if (docId == DocIdSetIterator.NO_MORE_DOCS) {
- docsEnum = null;
- } else {
- alreadyEmittedDocs.set(docId);
- return docId;
+ if (!alreadyEmittedDocs.getAndSet(docId)) {
+ return docId;//if it wasn't previously set, return it
}
}
}