You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mv...@apache.org on 2012/06/15 00:41:10 UTC
svn commit: r1350418 - in /lucene/dev/branches/branch_4x/lucene: CHANGES.txt
join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
join/src/test/org/apache/lucene/search/join/TestBlockJoin.java
Author: mvg
Date: Thu Jun 14 22:41:10 2012
New Revision: 1350418
URL: http://svn.apache.org/viewvc?rev=1350418&view=rev
Log:
LUCENE-4082
Modified:
lucene/dev/branches/branch_4x/lucene/CHANGES.txt
lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.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=1350418&r1=1350417&r2=1350418&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Thu Jun 14 22:41:10 2012
@@ -898,6 +898,9 @@ New features
* LUCENE-3440: Add ordered fragments feature with IDF-weighted terms for FVH.
(Sebastian Lutze via Koji Sekiguchi)
+* LUCENE-4082: Added explain to ToParentBlockJoinQuery.
+ (Christoph Kaser, Martijn van Groningen)
+
Optimizations
* LUCENE-2588: Don't store unnecessary suffixes when writing the terms
Modified: lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java?rev=1350418&r1=1350417&r2=1350418&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java (original)
+++ lucene/dev/branches/branch_4x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java Thu Jun 14 22:41:10 2012
@@ -26,6 +26,7 @@ import org.apache.lucene.index.AtomicRea
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter; // javadocs
import org.apache.lucene.index.Term;
+import org.apache.lucene.search.ComplexExplanation;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Explanation;
@@ -179,7 +180,8 @@ public class ToParentBlockJoinQuery exte
// acceptDocs when we score:
final DocIdSet parents = parentsFilter.getDocIdSet(readerContext, null);
- if (parents == null) {
+ if (parents == null
+ || parents.iterator().docID() == DocIdSetIterator.NO_MORE_DOCS) { // <-- means DocIdSet#EMPTY_DOCIDSET
// No matches
return null;
}
@@ -191,10 +193,14 @@ public class ToParentBlockJoinQuery exte
}
@Override
- public Explanation explain(AtomicReaderContext reader, int doc) throws IOException {
- // TODO
- throw new UnsupportedOperationException(getClass().getName() +
- " cannot explain match on parent document");
+ public Explanation explain(AtomicReaderContext context, int doc) throws IOException {
+ BlockJoinScorer scorer = (BlockJoinScorer) scorer(context, true, false, context.reader().getLiveDocs());
+ if (scorer != null) {
+ if (scorer.advance(doc) == doc) {
+ return scorer.explain(context.docBase);
+ }
+ }
+ return new ComplexExplanation(false, 0.0f, "Not a match");
}
@Override
@@ -209,6 +215,7 @@ public class ToParentBlockJoinQuery exte
private final ScoreMode scoreMode;
private final Bits acceptDocs;
private int parentDoc = -1;
+ private int prevParentDoc;
private float parentScore;
private int nextChildDoc;
@@ -365,7 +372,7 @@ public class ToParentBlockJoinQuery exte
return nextDoc();
}
- final int prevParentDoc = parentBits.prevSetBit(parentTarget-1);
+ prevParentDoc = parentBits.prevSetBit(parentTarget-1);
//System.out.println(" rolled back to prevParentDoc=" + prevParentDoc + " vs parentDoc=" + parentDoc);
assert prevParentDoc >= parentDoc;
@@ -383,6 +390,15 @@ public class ToParentBlockJoinQuery exte
//System.out.println(" return nextParentDoc=" + nd);
return nd;
}
+
+ public Explanation explain(int docBase) throws IOException {
+ int start = docBase + prevParentDoc + 1; // +1 b/c prevParentDoc is previous parent doc
+ int end = docBase + parentDoc - 1; // -1 b/c parentDoc is parent doc
+ return new ComplexExplanation(
+ true, score(), String.format("Score based on child doc range from %d to %d", start, end)
+ );
+ }
+
}
@Override
Modified: lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java?rev=1350418&r1=1350417&r2=1350418&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java (original)
+++ lucene/dev/branches/branch_4x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java Thu Jun 14 22:41:10 2012
@@ -631,6 +631,15 @@ public class TestBlockJoin extends Lucen
assertNull(joinResults);
} else {
compareHits(r, joinR, results, joinResults);
+ TopDocs b = joinS.search(childJoinQuery, 10);
+ for (ScoreDoc hit : b.scoreDocs) {
+ Explanation explanation = joinS.explain(childJoinQuery, hit.doc);
+ Document document = joinS.doc(hit.doc - 1);
+ int childId = Integer.parseInt(document.get("childID"));
+ assertTrue(explanation.isMatch());
+ assertEquals(hit.score, explanation.getValue(), 0.0f);
+ assertEquals(String.format("Score based on child doc range from %d to %d", hit.doc - 1 - childId, hit.doc - 1), explanation.getDescription());
+ }
}
// Test joining in the opposite direction (parent to