@Override
  public Query rewrite(final IndexReader reader, final MultiNodeTermQuery query)
      throws IOException {

    // Disabled cutoffs
    final int docCountCutoff = Integer.MAX_VALUE;
    final int termCountLimit = Integer.MAX_VALUE;

    final CutOffTermCollector col = new CutOffTermCollector(docCountCutoff, termCountLimit);
    this.collectTerms(reader, query, col);
    final int size = col.pendingTerms.size();

    if (col.hasCutOff) {
      return MultiNodeTermQuery.CONSTANT_SCORE_FILTER_REWRITE.rewrite(reader, query);
    } else if (size == 0) {
      return this.getTopLevelQuery(query);
    } else {
      final NodeBooleanQuery bq = this.getTopLevelQuery(query);
      final BytesRefHash pendingTerms = col.pendingTerms;
      final int sort[] = pendingTerms.sort(col.termsEnum.getComparator());
      for (int i = 0; i < size; i++) {
        final int pos = sort[i];
        // docFreq is not used for constant score here, we pass 1
        // to explicitely set a fake value, so it's not calculated
        this.addClause(
            bq,
            new Term(query.field, pendingTerms.get(pos, new BytesRef())),
            1,
            1.0f,
            col.array.termState[pos]);
      }
      // Strip scores
      final NodeQuery result = new NodeConstantScoreQuery(bq);
      result.setBoost(query.getBoost());
      return result;
    }
  }