Index: lucene/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java (revision 1040141) +++ lucene/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java (working copy) @@ -22,6 +22,7 @@ import org.apache.lucene.document.Field; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.MultiReader; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; @@ -157,7 +158,7 @@ final MultiTermQuery mtq = new MultiTermQuery("data") { @Override protected TermsEnum getTermsEnum(IndexReader reader, AttributeSource atts) throws IOException { - return new TermRangeTermsEnum(reader, field, "2", "7", true, true, null) { + return new TermRangeTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), "2", "7", true, true, null) { final BoostAttribute boostAtt = attributes().addAttribute(BoostAttribute.class); Index: lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java (revision 1040141) +++ lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java (working copy) @@ -27,6 +27,7 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.index.RandomIndexWriter; @@ -104,15 +105,15 @@ @Override protected TermsEnum getTermsEnum(IndexReader reader, AttributeSource atts) throws IOException { - return new SimpleAutomatonTermsEnum(reader, field); + return new SimpleAutomatonTermsEnum(MultiFields.getTerms(reader, getField()).iterator()); } private class SimpleAutomatonTermsEnum extends FilteredTermsEnum { CharacterRunAutomaton runAutomaton = new CharacterRunAutomaton(automaton); UnicodeUtil.UTF16Result utf16 = new UnicodeUtil.UTF16Result(); - private SimpleAutomatonTermsEnum(IndexReader reader, String field) throws IOException { - super(reader, field); + private SimpleAutomatonTermsEnum(TermsEnum tenum) throws IOException { + super(tenum); setInitialSeekTerm(new BytesRef("")); } Index: lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java (revision 1040141) +++ lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java (working copy) @@ -24,6 +24,7 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.index.RandomIndexWriter; @@ -87,15 +88,14 @@ @Override protected TermsEnum getTermsEnum(IndexReader reader, AttributeSource atts) throws IOException { - return new SimplePrefixTermsEnum(reader, field, prefix); + return new SimplePrefixTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), prefix); } private class SimplePrefixTermsEnum extends FilteredTermsEnum { private final BytesRef prefix; - private SimplePrefixTermsEnum(IndexReader reader, - String field, BytesRef prefix) throws IOException { - super(reader, field); + private SimplePrefixTermsEnum(TermsEnum tenum, BytesRef prefix) throws IOException { + super(tenum); this.prefix = prefix; setInitialSeekTerm(new BytesRef("")); } Index: lucene/src/java/org/apache/lucene/search/FuzzyQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/FuzzyQuery.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/FuzzyQuery.java (working copy) @@ -18,6 +18,7 @@ */ import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.AttributeSource; @@ -138,9 +139,9 @@ @Override protected TermsEnum getTermsEnum(IndexReader reader, AttributeSource atts) throws IOException { if (!termLongEnough) { // can only match if it's exact - return new SingleTermsEnum(reader, term); + return new SingleTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), term); } - return new FuzzyTermsEnum(reader, atts, getTerm(), minimumSimilarity, prefixLength); + return new FuzzyTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), atts, getTerm(), minimumSimilarity, prefixLength); } /** Index: lucene/src/java/org/apache/lucene/search/PrefixTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/PrefixTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/PrefixTermsEnum.java (working copy) @@ -19,8 +19,8 @@ import java.io.IOException; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; /** @@ -34,8 +34,8 @@ private final BytesRef prefixRef; - public PrefixTermsEnum(IndexReader reader, Term prefix) throws IOException { - super(reader, prefix.field()); + public PrefixTermsEnum(TermsEnum tenum, Term prefix) throws IOException { + super(tenum); setInitialSeekTerm(prefixRef = prefix.bytes()); } Index: lucene/src/java/org/apache/lucene/search/FilteredTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/FilteredTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/FilteredTermsEnum.java (working copy) @@ -20,11 +20,8 @@ import java.io.IOException; import java.util.Comparator; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.util.BytesRef; import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.index.Terms; -import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.DocsEnum; import org.apache.lucene.index.DocsAndPositionsEnum; import org.apache.lucene.util.AttributeSource; @@ -62,22 +59,11 @@ protected abstract AcceptStatus accept(BytesRef term) throws IOException; /** - * Creates a filtered {@link TermsEnum} for the given field name and reader. - */ - public FilteredTermsEnum(final IndexReader reader, final String field) throws IOException { - final Terms terms = MultiFields.getTerms(reader, field); - if (terms != null) { - tenum = terms.iterator(); - } else { - tenum = null; - } - } - - /** * Creates a filtered {@link TermsEnum} on a terms enum. - * @param tenum the terms enumeration to filter, if {@code null} this is the null iterator. + * @param tenum the terms enumeration to filter. */ public FilteredTermsEnum(final TermsEnum tenum) { + assert tenum != null; this.tenum = tenum; } @@ -121,26 +107,21 @@ */ @Override public AttributeSource attributes() { - /* if we have no tenum, we return a new attributes instance, - * to prevent NPE in subclasses that use attributes. - * in all other cases we share the attributes with our delegate. */ - return (tenum == null) ? super.attributes() : tenum.attributes(); + return tenum.attributes(); } @Override public BytesRef term() throws IOException { - assert tenum != null; return tenum.term(); } @Override public Comparator getComparator() throws IOException { - return (tenum == null) ? null : tenum.getComparator(); + return tenum.getComparator(); } @Override public int docFreq() { - assert tenum != null; return tenum.docFreq(); } @@ -162,19 +143,16 @@ @Override public long ord() throws IOException { - assert tenum != null; return tenum.ord(); } @Override public DocsEnum docs(Bits bits, DocsEnum reuse) throws IOException { - assert tenum != null; return tenum.docs(bits, reuse); } @Override public DocsAndPositionsEnum docsAndPositions(Bits bits, DocsAndPositionsEnum reuse) throws IOException { - assert tenum != null; return tenum.docsAndPositions(bits, reuse); } @@ -186,8 +164,6 @@ @SuppressWarnings("fallthrough") @Override public BytesRef next() throws IOException { - if (tenum == null) - return null; for (;;) { // Seek or forward the iterator if (doSeek) { Index: lucene/src/java/org/apache/lucene/search/PrefixQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/PrefixQuery.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/PrefixQuery.java (working copy) @@ -54,7 +54,7 @@ final Terms terms = MultiFields.getTerms(reader, getField()); return (terms != null) ? terms.iterator() : TermsEnum.EMPTY; } - return new PrefixTermsEnum(reader, prefix); + return new PrefixTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), prefix); } /** Prints a user-readable version of this query. */ Index: lucene/src/java/org/apache/lucene/search/TermRangeTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/TermRangeTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/TermRangeTermsEnum.java (working copy) @@ -22,6 +22,7 @@ import java.util.Comparator; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; /** @@ -51,9 +52,8 @@ * (you can't select all but the first or last term without * explicitly specifying the term to exclude.) * - * @param reader - * @param field - * An interned field that holds both lower and upper terms. + * @param tenum + * TermsEnum to filter * @param lowerTermText * The term text at the lower end of the range * @param upperTermText @@ -69,9 +69,9 @@ * * @throws IOException */ - public TermRangeTermsEnum(IndexReader reader, String field, String lowerTermText, String upperTermText, + public TermRangeTermsEnum(TermsEnum tenum, String lowerTermText, String upperTermText, boolean includeLower, boolean includeUpper, Collator collator) throws IOException { - super(reader, field); + super(tenum); this.collator = collator; this.upperTermText = upperTermText; this.lowerTermText = lowerTermText; Index: lucene/src/java/org/apache/lucene/search/NumericRangeQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/NumericRangeQuery.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/NumericRangeQuery.java (working copy) @@ -26,6 +26,7 @@ import org.apache.lucene.util.NumericUtils; import org.apache.lucene.util.ToStringUtils; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.util.AttributeSource; import org.apache.lucene.util.BytesRef; import org.apache.lucene.index.TermsEnum; @@ -306,7 +307,7 @@ // very strange: java.lang.Number itsself is not Comparable, but all subclasses used here are return (min != null && max != null && ((Comparable) min).compareTo(max) > 0) ? TermsEnum.EMPTY : - new NumericRangeTermsEnum(reader); + new NumericRangeTermsEnum(MultiFields.getTerms(reader, getField()).iterator()); } /** Returns true if the lower endpoint is inclusive */ @@ -385,8 +386,8 @@ private final LinkedList rangeBounds = new LinkedList(); private final Comparator termComp; - NumericRangeTermsEnum(final IndexReader reader) throws IOException { - super(reader, getField()); + NumericRangeTermsEnum(final TermsEnum tenum) throws IOException { + super(tenum); switch (valSize) { case 64: { // lower Index: lucene/src/java/org/apache/lucene/search/TermRangeQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/TermRangeQuery.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/TermRangeQuery.java (working copy) @@ -141,7 +141,7 @@ final Terms terms = MultiFields.getTerms(reader, field); return (terms != null) ? terms.iterator() : null; } - return new TermRangeTermsEnum(reader, field, + return new TermRangeTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), lowerTerm, upperTerm, includeLower, includeUpper, collator); } Index: lucene/src/java/org/apache/lucene/search/AutomatonTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/AutomatonTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/AutomatonTermsEnum.java (working copy) @@ -21,6 +21,7 @@ import java.util.Comparator; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.IntsRef; import org.apache.lucene.util.automaton.Automaton; @@ -73,7 +74,7 @@ /** * Expert ctor: * Construct an enumerator based upon an automaton, enumerating the specified - * field, working on a supplied reader. + * field, working on a supplied TermsEnum *

* @lucene.experimental *

@@ -81,10 +82,10 @@ * @param finite true if the automaton accepts a finite language */ public AutomatonTermsEnum(ByteRunAutomaton runAutomaton, - String field, IndexReader reader, + TermsEnum tenum, boolean finite, BytesRef commonSuffixRef) throws IOException { - super(reader, field); + super(tenum); this.automaton = runAutomaton.getAutomaton(); this.finite = finite; @@ -110,13 +111,13 @@ /** * Construct an enumerator based upon an automaton, enumerating the specified - * field, working on a supplied reader. + * field, working on a supplied TermsEnum *

* It will automatically calculate whether or not the automaton is finite */ - public AutomatonTermsEnum(Automaton automaton, String field, IndexReader reader) + public AutomatonTermsEnum(Automaton automaton, TermsEnum tenum) throws IOException { - this(new ByteRunAutomaton(automaton), field, reader, SpecialOperations.isFinite(automaton), null); + this(new ByteRunAutomaton(automaton), tenum, SpecialOperations.isFinite(automaton), null); } /** Index: lucene/src/java/org/apache/lucene/search/SingleTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/SingleTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/SingleTermsEnum.java (working copy) @@ -19,8 +19,8 @@ import java.io.IOException; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; /** @@ -39,8 +39,8 @@ * After calling the constructor the enumeration is already pointing to the term, * if it exists. */ - public SingleTermsEnum(IndexReader reader, Term singleTerm) throws IOException { - super(reader, singleTerm.field()); + public SingleTermsEnum(TermsEnum tenum, Term singleTerm) throws IOException { + super(tenum); singleRef = singleTerm.bytes(); setInitialSeekTerm(singleRef); } Index: lucene/src/java/org/apache/lucene/search/FuzzyTermsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/search/FuzzyTermsEnum.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/FuzzyTermsEnum.java (working copy) @@ -19,7 +19,6 @@ import org.apache.lucene.index.DocsAndPositionsEnum; import org.apache.lucene.index.DocsEnum; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.Attribute; @@ -71,7 +70,7 @@ private int maxEdits; private final boolean raw; - private final IndexReader reader; + private final TermsEnum tenum; private final Term term; private final int termText[]; private final int realPrefixLength; @@ -84,7 +83,7 @@ * After calling the constructor the enumeration is already pointing to the first * valid term if such a term exists. * - * @param reader Delivers terms. + * @param tenum Delivers terms. * @param atts {@link AttributeSource} created by the rewrite method of {@link MultiTermQuery} * thats contains information about competitive boosts during rewrite. It is also used * to cache DFAs between segment transitions. @@ -93,7 +92,7 @@ * @param prefixLength Length of required common prefix. Default value is 0. * @throws IOException */ - public FuzzyTermsEnum(IndexReader reader, AttributeSource atts, Term term, + public FuzzyTermsEnum(TermsEnum tenum, AttributeSource atts, Term term, final float minSimilarity, final int prefixLength) throws IOException { if (minSimilarity >= 1.0f && minSimilarity != (int)minSimilarity) throw new IllegalArgumentException("fractional edit distances are not allowed"); @@ -101,7 +100,7 @@ throw new IllegalArgumentException("minimumSimilarity cannot be less than 0"); if(prefixLength < 0) throw new IllegalArgumentException("prefixLength cannot be less than 0"); - this.reader = reader; + this.tenum = tenum; this.term = term; // convert the string into a utf32 int[] representation for fast comparisons @@ -304,7 +303,7 @@ public AutomatonFuzzyTermsEnum(ByteRunAutomaton matchers[], BytesRef lastTerm) throws IOException { - super(matchers[matchers.length - 1], term.field(), reader, true, null); + super(matchers[matchers.length - 1], tenum, true, null); this.matchers = matchers; this.lastTerm = lastTerm; termRef = new BytesRef(term.text()); @@ -343,7 +342,7 @@ /** defers to superclass, except can start at an arbitrary location */ @Override protected BytesRef nextSeekTerm(BytesRef term) throws IOException { - if (term == null) + if (term == null) // TODO: is this really necessary? we should be positioned already? term = lastTerm; return super.nextSeekTerm(term); } @@ -380,7 +379,7 @@ * @throws IOException */ public LinearFuzzyTermsEnum() throws IOException { - super(reader, term.field()); + super(tenum); this.text = new int[termLength - realPrefixLength]; System.arraycopy(termText, realPrefixLength, text, 0, text.length); Index: lucene/src/java/org/apache/lucene/search/AutomatonQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/AutomatonQuery.java (revision 1040141) +++ lucene/src/java/org/apache/lucene/search/AutomatonQuery.java (working copy) @@ -102,27 +102,27 @@ // matches a fixed string in singleton representation String singleton = automaton.getSingleton(); if (singleton != null) - return new SingleTermsEnum(reader, term.createTerm(singleton)); + return new SingleTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), term.createTerm(singleton)); // matches a fixed string in expanded representation final String commonPrefix = SpecialOperations.getCommonPrefix(automaton); if (commonPrefix.length() > 0) { if (BasicOperations.sameLanguage(automaton, BasicAutomata.makeString(commonPrefix))) { - return new SingleTermsEnum(reader, term.createTerm(commonPrefix)); + return new SingleTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), term.createTerm(commonPrefix)); } // matches a constant prefix Automaton prefixAutomaton = BasicOperations.concatenate(BasicAutomata .makeString(commonPrefix), BasicAutomata.makeAnyString()); if (BasicOperations.sameLanguage(automaton, prefixAutomaton)) { - return new PrefixTermsEnum(reader, term.createTerm(commonPrefix)); + return new PrefixTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), term.createTerm(commonPrefix)); } } compileAutomaton(); - return new AutomatonTermsEnum(runAutomaton, term.field(), reader, isFinite, commonSuffixRef); + return new AutomatonTermsEnum(runAutomaton, MultiFields.getTerms(reader, getField()).iterator(), isFinite, commonSuffixRef); } @Override Index: lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/DirectSpellChecker.java =================================================================== --- lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/DirectSpellChecker.java (revision 1040141) +++ lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/DirectSpellChecker.java (working copy) @@ -26,6 +26,7 @@ import java.util.PriorityQueue; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.search.FuzzyTermsEnum; import org.apache.lucene.search.BoostAttribute; @@ -392,7 +393,7 @@ AttributeSource atts = new AttributeSource(); MaxNonCompetitiveBoostAttribute maxBoostAtt = atts.addAttribute(MaxNonCompetitiveBoostAttribute.class); - FuzzyTermsEnum e = new FuzzyTermsEnum(ir, atts, term, editDistance, Math.max(minPrefix, editDistance-1)); + FuzzyTermsEnum e = new FuzzyTermsEnum(MultiFields.getTerms(ir, term.field()).iterator(), atts, term, editDistance, Math.max(minPrefix, editDistance-1)); final PriorityQueue stQueue = new PriorityQueue(); BytesRef queryTerm = new BytesRef(term.text()); Index: lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexQuery.java =================================================================== --- lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexQuery.java (revision 1040141) +++ lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexQuery.java (working copy) @@ -19,6 +19,7 @@ import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.FilteredTermsEnum; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexReader; import org.apache.lucene.util.AttributeSource; @@ -62,7 +63,7 @@ @Override protected FilteredTermsEnum getTermsEnum(IndexReader reader, AttributeSource atts) throws IOException { - return new RegexTermsEnum(reader, term, regexImpl); + return new RegexTermsEnum(MultiFields.getTerms(reader, getField()).iterator(), term, regexImpl); } @Override Index: lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexTermsEnum.java =================================================================== --- lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexTermsEnum.java (revision 1040141) +++ lucene/contrib/queries/src/java/org/apache/lucene/search/regex/RegexTermsEnum.java (working copy) @@ -18,8 +18,8 @@ */ import org.apache.lucene.search.FilteredTermsEnum; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; import java.io.IOException; @@ -37,8 +37,8 @@ private RegexCapabilities.RegexMatcher regexImpl; private final BytesRef prefixRef; - public RegexTermsEnum(IndexReader reader, Term term, RegexCapabilities regexCap) throws IOException { - super(reader, term.field()); + public RegexTermsEnum(TermsEnum tenum, Term term, RegexCapabilities regexCap) throws IOException { + super(tenum); String text = term.text(); this.regexImpl = regexCap.compile(text); Index: lucene/contrib/queries/src/java/org/apache/lucene/search/FuzzyLikeThisQuery.java =================================================================== --- lucene/contrib/queries/src/java/org/apache/lucene/search/FuzzyLikeThisQuery.java (revision 1040141) +++ lucene/contrib/queries/src/java/org/apache/lucene/search/FuzzyLikeThisQuery.java (working copy) @@ -28,6 +28,7 @@ import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Term; import org.apache.lucene.util.AttributeSource; import org.apache.lucene.util.BytesRef; @@ -203,7 +204,7 @@ AttributeSource atts = new AttributeSource(); MaxNonCompetitiveBoostAttribute maxBoostAtt = atts.addAttribute(MaxNonCompetitiveBoostAttribute.class); - FuzzyTermsEnum fe = new FuzzyTermsEnum(reader, atts, startTerm, f.minSimilarity, f.prefixLength); + FuzzyTermsEnum fe = new FuzzyTermsEnum(MultiFields.getTerms(reader, startTerm.field()).iterator(), atts, startTerm, f.minSimilarity, f.prefixLength); //store the df so all variants use same idf int df = reader.docFreq(startTerm); int numVariants=0;