@Override
 public Query rewrite(IndexReader reader) throws IOException {
   Query rewritten = super.rewrite(reader);
   if (rewritten != this) {
     return rewritten;
   }
   if (termArrays.isEmpty()) {
     return new MatchNoDocsQuery();
   }
   MultiPhraseQuery.Builder query = new MultiPhraseQuery.Builder();
   query.setSlop(slop);
   int sizeMinus1 = termArrays.size() - 1;
   for (int i = 0; i < sizeMinus1; i++) {
     query.add(termArrays.get(i), positions.get(i));
   }
   Term[] suffixTerms = termArrays.get(sizeMinus1);
   int position = positions.get(sizeMinus1);
   ObjectHashSet<Term> terms = new ObjectHashSet<>();
   for (Term term : suffixTerms) {
     getPrefixTerms(terms, term, reader);
     if (terms.size() > maxExpansions) {
       break;
     }
   }
   if (terms.isEmpty()) {
     return Queries.newMatchNoDocsQuery();
   }
   query.add(terms.toArray(Term.class), position);
   return query.build();
 }