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:15:37 UTC
svn commit: r1558335 - in /lucene/dev/branches/branch_4x: ./ 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:15:37 2014
New Revision: 1558335
URL: http://svn.apache.org/r1558335
Log:
LUCENE-5375: ToChildBlockJoinQuery works harder to detect mis-use, where the parent query incorrectly returns child docs
Added:
lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java
- copied, changed from r1558334, lucene/dev/trunk/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt
lucene/dev/branches/branch_4x/lucene/join/ (props changed)
lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java
Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1558335&r1=1558334&r2=1558335&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Wed Jan 15 10:15:37 2014
@@ -96,6 +96,10 @@ Bug fixes
* LUCENE-5344: Flexible StandardQueryParser behaves differently than
ClassicQueryParser. (Adriano Crestani)
+* 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)
+
API Changes
* LUCENE-5339: The facet module was simplified/reworked to make the
Modified: lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java?rev=1558335&r1=1558334&r2=1558335&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java (original)
+++ lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java Wed Jan 15 10:15:37 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) {
Copied: lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java (from r1558334, lucene/dev/trunk/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java?p2=lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java&p1=lucene/dev/trunk/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java&r1=1558334&r2=1558335&rev=1558335&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java (original)
+++ lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoinValidation.java Wed Jan 15 10:15:37 2014
@@ -140,11 +140,11 @@ public class TestBlockJoinValidation ext
}
private static List<Document> createDocsForSegment(int segmentNumber) {
- List<List<Document>> blocks = new ArrayList<>(AMOUNT_OF_PARENT_DOCS);
+ List<List<Document>> blocks = new ArrayList<List<Document>>(AMOUNT_OF_PARENT_DOCS);
for (int i = 0; i < AMOUNT_OF_PARENT_DOCS; i++) {
blocks.add(createParentDocWithChildren(segmentNumber, i));
}
- List<Document> result = new ArrayList<>(AMOUNT_OF_DOCS_IN_SEGMENT);
+ List<Document> result = new ArrayList<Document>(AMOUNT_OF_DOCS_IN_SEGMENT);
for (List<Document> block : blocks) {
result.addAll(block);
}
@@ -152,7 +152,7 @@ public class TestBlockJoinValidation ext
}
private static List<Document> createParentDocWithChildren(int segmentNumber, int parentNumber) {
- List<Document> result = new ArrayList<>(AMOUNT_OF_CHILD_DOCS + 1);
+ List<Document> result = new ArrayList<Document>(AMOUNT_OF_CHILD_DOCS + 1);
for (int i = 0; i < AMOUNT_OF_CHILD_DOCS; i++) {
result.add(createChildDoc(segmentNumber, parentNumber, i));
}