Index: lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinCollector.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinCollector.java (date 1379444024000) +++ lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinCollector.java (revision ) @@ -283,6 +283,7 @@ } private void enroll(ToParentBlockJoinQuery query, ToParentBlockJoinQuery.BlockJoinScorer scorer) { + scorer.trackPendingChildHits(); final Integer slot = joinQueryID.get(query); if (slot == null) { joinQueryID.put(query, joinScorers.length); Index: lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java (date 1379444024000) +++ lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java (revision ) @@ -17,15 +17,9 @@ * limitations under the License. */ -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Locale; -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.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.ComplexExplanation; import org.apache.lucene.search.DocIdSet; @@ -41,6 +35,12 @@ import org.apache.lucene.util.Bits; import org.apache.lucene.util.FixedBitSet; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Locale; +import java.util.Set; + /** * This query requires that you index * children and parent docs as a single block, using the @@ -218,8 +218,7 @@ private float parentScore; private int parentFreq; private int nextChildDoc; - - private int[] pendingChildDocs = new int[5]; + private int[] pendingChildDocs; private float[] pendingChildScores; private int childDocUpto; @@ -230,9 +229,6 @@ this.childScorer = childScorer; this.scoreMode = scoreMode; this.acceptDocs = acceptDocs; - if (scoreMode != ScoreMode.None) { - pendingChildScores = new float[5]; - } nextChildDoc = firstChildDoc; } @@ -321,18 +317,22 @@ do { //System.out.println(" c=" + nextChildDoc); - if (pendingChildDocs.length == childDocUpto) { + if (pendingChildDocs != null && pendingChildDocs.length == childDocUpto) { pendingChildDocs = ArrayUtil.grow(pendingChildDocs); } - if (scoreMode != ScoreMode.None && pendingChildScores.length == childDocUpto) { + if (pendingChildScores != null && scoreMode != ScoreMode.None && pendingChildScores.length == childDocUpto) { pendingChildScores = ArrayUtil.grow(pendingChildScores); } + if (pendingChildDocs != null) { - pendingChildDocs[childDocUpto] = nextChildDoc; + pendingChildDocs[childDocUpto] = nextChildDoc; + } if (scoreMode != ScoreMode.None) { // TODO: specialize this into dedicated classes per-scoreMode final float childScore = childScorer.score(); final int childFreq = childScorer.freq(); + if (pendingChildScores != null) { - pendingChildScores[childDocUpto] = childScore; + pendingChildScores[childDocUpto] = childScore; + } maxScore = Math.max(childScore, maxScore); totalScore += childScore; parentFreq += childFreq; @@ -431,6 +431,13 @@ @Override public long cost() { return childScorer.cost(); + } + + public void trackPendingChildHits() { + pendingChildDocs = new int[5]; + if (scoreMode != ScoreMode.None) { + pendingChildScores = new float[5]; + } } }