@Override public void setScorer(Scorer scorer) { // System.out.println("C.setScorer scorer=" + scorer); // Since we invoke .score(), and the comparators likely // do as well, cache it so it's only "really" computed // once: this.scorer = new ScoreCachingWrappingScorer(scorer); for (int compIDX = 0; compIDX < comparators.length; compIDX++) { comparators[compIDX].setScorer(this.scorer); } Arrays.fill(joinScorers, null); Queue<Scorer> queue = new LinkedList<>(); // System.out.println("\nqueue: add top scorer=" + scorer); queue.add(scorer); while ((scorer = queue.poll()) != null) { // System.out.println(" poll: " + scorer + "; " + scorer.getWeight().getQuery()); if (scorer instanceof ToParentBlockJoinQuery.BlockJoinScorer) { enroll( (ToParentBlockJoinQuery) scorer.getWeight().getQuery(), (ToParentBlockJoinQuery.BlockJoinScorer) scorer); } for (ChildScorer sub : scorer.getChildren()) { // System.out.println(" add sub: " + sub.child + "; " + sub.child.getWeight().getQuery()); queue.add(sub.child); } } }