You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2014/01/15 11:17:28 UTC

svn commit: r1558336 - in /lucene/dev/branches/lucene_solr_4_6: ./ lucene/ lucene/join/ lucene/join/src/java/org/apache/lucene/search/join/ lucene/join/src/test/org/apache/lucene/search/join/

Author: mikemccand
Date: Wed Jan 15 10:17:27 2014
New Revision: 1558336

URL: http://svn.apache.org/r1558336
Log:
LUCENE-5375: ToChildBlockJoinQuery works harder to detect mis-use, where the parent query incorrectly returns child docs

Added:
    lucene/dev/branches/lucene_solr_4_6/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java
      - copied unchanged from r1558335, lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java
Modified:
    lucene/dev/branches/lucene_solr_4_6/   (props changed)
    lucene/dev/branches/lucene_solr_4_6/lucene/   (props changed)
    lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt
    lucene/dev/branches/lucene_solr_4_6/lucene/join/   (props changed)
    lucene/dev/branches/lucene_solr_4_6/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java

Modified: lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt?rev=1558336&r1=1558335&r2=1558336&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt Wed Jan 15 10:17:27 2014
@@ -23,6 +23,10 @@ Bug fixes
 * LUCENE-5394: Fix TokenSources.getTokenStream to return payloads if
   they were indexed with the term vectors. (Mike McCandless)
 
+* LUCENE-5375: ToChildBlockJoinQuery works harder to detect mis-use,
+  when the parent query incorrectly returns child documents, and throw
+  a clear exception saying so. (Dr. Oleg Savrasov via Mike McCandless)
+
 ======================= Lucene 4.6.0 =======================
 
 New Features

Modified: lucene/dev/branches/lucene_solr_4_6/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_6/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java?rev=1558336&r1=1558335&r2=1558336&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_6/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java (original)
+++ lucene/dev/branches/lucene_solr_4_6/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java Wed Jan 15 10:17:27 2014
@@ -24,7 +24,6 @@ import java.util.Set;
 
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;       // javadocs
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.Explanation;
@@ -32,7 +31,6 @@ import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Scorer;
-import org.apache.lucene.search.Scorer.ChildScorer;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.FixedBitSet;
@@ -48,6 +46,8 @@ import org.apache.lucene.util.FixedBitSe
 
 public class ToChildBlockJoinQuery extends Query {
 
+  public static final String INVALID_QUERY_MESSAGE = "Parent query yields document which is not matched by parents filter, docID=";
+
   private final Filter parentsFilter;
   private final Query parentQuery;
 
@@ -203,6 +203,7 @@ public class ToChildBlockJoinQuery exten
           // children:
           while (true) {
             parentDoc = parentScorer.nextDoc();
+            validateParentDoc();
 
             if (parentDoc == 0) {
               // Degenerate but allowed: parent has no children
@@ -211,6 +212,7 @@ public class ToChildBlockJoinQuery exten
               // tricky because scorer must return -1 for
               // .doc() on init...
               parentDoc = parentScorer.nextDoc();
+              validateParentDoc();
             }
 
             if (parentDoc == NO_MORE_DOCS) {
@@ -248,6 +250,14 @@ public class ToChildBlockJoinQuery exten
       }
     }
 
+    /** Detect mis-use, where provided parent query in fact
+     *  sometimes returns child documents.  */
+    private void validateParentDoc() {
+      if (parentDoc != NO_MORE_DOCS && !parentBits.get(parentDoc)) {
+        throw new IllegalStateException(INVALID_QUERY_MESSAGE + parentDoc);
+      }
+    }
+
     @Override
     public int docID() {
       return childDoc;
@@ -277,6 +287,7 @@ public class ToChildBlockJoinQuery exten
       if (childDoc == -1 || childTarget > parentDoc) {
         // Advance to new parent:
         parentDoc = parentScorer.advance(childTarget);
+        validateParentDoc();
         //System.out.println("  advance to parentDoc=" + parentDoc);
         assert parentDoc > childTarget;
         if (parentDoc == NO_MORE_DOCS) {