mirror of https://github.com/apache/lucene.git
LUCENE-7452: block join queries' exception message to suggest how to
find a doc which violate orthogonality restriction.
This commit is contained in:
parent
4733488ed5
commit
4ab8e9c262
|
@ -55,6 +55,9 @@ Optimizations
|
||||||
|
|
||||||
Other
|
Other
|
||||||
|
|
||||||
|
* LUCENE-7452: Block join query exception suggests how to find a doc, which
|
||||||
|
violates orthogonality requirement. (Mikhail Khludnev)
|
||||||
|
|
||||||
Build
|
Build
|
||||||
|
|
||||||
* LUCENE-7292: Fix build to use "--release 8" instead of "-release 8" on
|
* LUCENE-7292: Fix build to use "--release 8" instead of "-release 8" on
|
||||||
|
|
|
@ -43,9 +43,10 @@ import org.apache.lucene.util.BitSet;
|
||||||
public class ToChildBlockJoinQuery extends Query {
|
public class ToChildBlockJoinQuery extends Query {
|
||||||
|
|
||||||
/** Message thrown from {@link
|
/** Message thrown from {@link
|
||||||
* ToChildBlockJoinScorer#validateParentDoc} on mis-use,
|
* ToChildBlockJoinScorer#validateParentDoc} on misuse,
|
||||||
* when the parent query incorrectly returns child docs. */
|
* when the parent query incorrectly returns child docs. */
|
||||||
static final String INVALID_QUERY_MESSAGE = "Parent query yields document which is not matched by parents filter, docID=";
|
static final String INVALID_QUERY_MESSAGE = "Parent query must not match any docs besides parent filter. "
|
||||||
|
+ "Combine them as must (+) and must-not (-) clauses to find a problem doc. docID=";
|
||||||
static final String ILLEGAL_ADVANCE_ON_PARENT = "Expect to be advanced on child docs only. got docID=";
|
static final String ILLEGAL_ADVANCE_ON_PARENT = "Expect to be advanced on child docs only. got docID=";
|
||||||
|
|
||||||
private final BitSetProducer parentsFilter;
|
private final BitSetProducer parentsFilter;
|
||||||
|
|
|
@ -283,9 +283,7 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
|
|
||||||
// Parent & child docs are supposed to be
|
// Parent & child docs are supposed to be
|
||||||
// orthogonal:
|
// orthogonal:
|
||||||
if (nextChildDoc == parentDoc) {
|
checkOrthogonal(nextChildDoc, parentDoc);
|
||||||
throw new IllegalStateException("child query must only match non-parent docs, but parent docID=" + nextChildDoc + " matched childScorer=" + childScorer.getClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
//System.out.println(" parentDoc=" + parentDoc);
|
//System.out.println(" parentDoc=" + parentDoc);
|
||||||
assert parentDoc != DocIdSetIterator.NO_MORE_DOCS;
|
assert parentDoc != DocIdSetIterator.NO_MORE_DOCS;
|
||||||
|
@ -326,9 +324,7 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
|
|
||||||
// Parent & child docs are supposed to be
|
// Parent & child docs are supposed to be
|
||||||
// orthogonal:
|
// orthogonal:
|
||||||
if (nextChildDoc == parentDoc) {
|
checkOrthogonal(nextChildDoc, parentDoc);
|
||||||
throw new IllegalStateException("child query must only match non-parent docs, but parent docID=" + nextChildDoc + " matched childScorer=" + childScorer.getClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(scoreMode) {
|
switch(scoreMode) {
|
||||||
case Avg:
|
case Avg:
|
||||||
|
@ -381,9 +377,7 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parent & child docs are supposed to be orthogonal:
|
// Parent & child docs are supposed to be orthogonal:
|
||||||
if (nextChildDoc == prevParentDoc) {
|
checkOrthogonal(nextChildDoc, prevParentDoc);
|
||||||
throw new IllegalStateException("child query must only match non-parent docs, but parent docID=" + nextChildDoc + " matched childScorer=" + childScorer.getClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
final int nd = nextDoc();
|
final int nd = nextDoc();
|
||||||
//System.out.println(" return nextParentDoc=" + nd);
|
//System.out.println(" return nextParentDoc=" + nd);
|
||||||
|
@ -402,6 +396,15 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkOrthogonal(int childDoc, int parentDoc) {
|
||||||
|
if (childDoc==parentDoc) {
|
||||||
|
throw new IllegalStateException("Child query must not match same docs with parent filter. "
|
||||||
|
+ "Combine them as must clauses (+) to find a problem doc. "
|
||||||
|
+ "docId=" + nextChildDoc + ", " + childScorer.getClass());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int docID() {
|
public int docID() {
|
||||||
return parentDoc;
|
return parentDoc;
|
||||||
|
|
|
@ -84,7 +84,7 @@ public class TestBlockJoinValidation extends LuceneTestCase {
|
||||||
IllegalStateException expected = expectThrows(IllegalStateException.class, () -> {
|
IllegalStateException expected = expectThrows(IllegalStateException.class, () -> {
|
||||||
indexSearcher.search(blockJoinQuery, 1);
|
indexSearcher.search(blockJoinQuery, 1);
|
||||||
});
|
});
|
||||||
assertTrue(expected.getMessage() != null && expected.getMessage().contains("child query must only match non-parent docs"));
|
assertTrue(expected.getMessage() != null && expected.getMessage().contains("Child query must not match same docs with parent filter"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAdvanceValidationForToParentBjq() throws Exception {
|
public void testAdvanceValidationForToParentBjq() throws Exception {
|
||||||
|
@ -103,7 +103,7 @@ public class TestBlockJoinValidation extends LuceneTestCase {
|
||||||
IllegalStateException expected = expectThrows(IllegalStateException.class, () -> {
|
IllegalStateException expected = expectThrows(IllegalStateException.class, () -> {
|
||||||
indexSearcher.search(conjunctionQuery.build(), 1);
|
indexSearcher.search(conjunctionQuery.build(), 1);
|
||||||
});
|
});
|
||||||
assertTrue(expected.getMessage() != null && expected.getMessage().contains("child query must only match non-parent docs"));
|
assertTrue(expected.getMessage() != null && expected.getMessage().contains("Child query must not match same docs with parent filter"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNextDocValidationForToChildBjq() throws Exception {
|
public void testNextDocValidationForToChildBjq() throws Exception {
|
||||||
|
|
Loading…
Reference in New Issue