private void scoreWindowMultipleScorers( LeafCollector collector, Bits acceptDocs, int windowBase, int windowMin, int windowMax, int maxFreq) throws IOException { while (maxFreq < minShouldMatch && maxFreq + tail.size() >= minShouldMatch) { // a match is still possible final BulkScorerAndDoc candidate = tail.pop(); candidate.advance(windowMin); if (candidate.next < windowMax) { leads[maxFreq++] = candidate; } else { head.add(candidate); } } if (maxFreq >= minShouldMatch) { // There might be matches in other scorers from the tail too for (int i = 0; i < tail.size(); ++i) { leads[maxFreq++] = tail.get(i); } tail.clear(); scoreWindowIntoBitSetAndReplay( collector, acceptDocs, windowBase, windowMin, windowMax, leads, maxFreq); } // Push back scorers into head and tail for (int i = 0; i < maxFreq; ++i) { final BulkScorerAndDoc evicted = head.insertWithOverflow(leads[i]); if (evicted != null) { tail.add(evicted); } } }