public TopDocs execute(SearchContext context) throws IOException {
   ScanCollector collector =
       new ScanCollector(readerStates, context.from(), context.size(), context.trackScores());
   Query query = new FilteredQuery(context.query(), new ScanFilter(readerStates, collector));
   try {
     context.searcher().search(query, collector);
   } catch (ScanCollector.StopCollectingException e) {
     // all is well
   }
   return collector.topDocs();
 }
 @Override
 public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptedDocs) throws IOException {
   ReaderState readerState = readerStates.get(context.reader());
   if (readerState != null && readerState.done) {
     scanCollector.incCounter(readerState.count);
     return null;
   }
   return BitsFilteredDocIdSet.wrap(new AllDocIdSet(context.reader().maxDoc()), acceptedDocs);
 }