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
         }
       }
     }