Index: solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java =================================================================== --- solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java (revision 1198049) +++ solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java (working copy) @@ -726,8 +726,11 @@ Terms terms = fields.terms(t.field()); if (terms == null) return -1; BytesRef termBytes = t.bytes(); - DocsEnum docs = terms.docs(MultiFields.getLiveDocs(r), termBytes, null); - if (docs == null) return -1; + final TermsEnum termsEnum = terms.iterator(); + if (!termsEnum.seekExact(termBytes, false)) { + return -1; + } + DocsEnum docs = termsEnum.docs(MultiFields.getLiveDocs(r), null); int id = docs.nextDoc(); if (id != DocIdSetIterator.NO_MORE_DOCS) { int next = docs.nextDoc(); Index: solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java =================================================================== --- solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (revision 1198049) +++ solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (working copy) @@ -497,7 +497,11 @@ Terms terms = fields.terms(t.field()); if (terms == null) return -1; BytesRef termBytes = t.bytes(); - DocsEnum docs = terms.docs(MultiFields.getLiveDocs(reader), termBytes, null); + final TermsEnum termsEnum = terms.iterator(); + if (!termsEnum.seekExact(termBytes, false)) { + return -1; + } + DocsEnum docs = termsEnum.docs(MultiFields.getLiveDocs(reader), null); if (docs == null) return -1; int id = docs.nextDoc(); return id == DocIdSetIterator.NO_MORE_DOCS ? -1 : id; @@ -889,7 +893,13 @@ BytesRef termBytes = t.bytes(); Bits liveDocs = reader.getLiveDocs(); - DocsEnum docsEnum = terms==null ? null : terms.docs(liveDocs, termBytes, null); + DocsEnum docsEnum = null; + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(termBytes, false)) { + docsEnum = termsEnum.docs(MultiFields.getLiveDocs(reader), null); + } + } if (docsEnum != null) { DocsEnum.BulkReadResult readResult = docsEnum.getBulkResult(); Index: modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java =================================================================== --- modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java (revision 1198049) +++ modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java (working copy) @@ -51,7 +51,18 @@ public void reset() throws IOException { // no one should call us for deleted docs? - docs = terms == null ? null : terms.docs(null, indexedBytes, null); + + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(indexedBytes, false)) { + docs = termsEnum.docs(null, null); + } else { + docs = null; + } + } else { + docs = null; + } + if (docs == null) { docs = new DocsEnum() { @Override Index: modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java =================================================================== --- modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java (revision 1198049) +++ modules/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java (working copy) @@ -59,7 +59,17 @@ public void reset() throws IOException { // no one should call us for deleted docs? - docs = terms==null ? null : terms.docs(null, indexedBytes, null); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(indexedBytes, false)) { + docs = termsEnum.docs(null, null); + } else { + docs = null; + } + } else { + docs = null; + } + if (docs == null) { docs = new DocsEnum() { @Override Index: lucene/contrib/misc/src/java/org/apache/lucene/misc/GetTermInfo.java =================================================================== --- lucene/contrib/misc/src/java/org/apache/lucene/misc/GetTermInfo.java (revision 1198049) +++ lucene/contrib/misc/src/java/org/apache/lucene/misc/GetTermInfo.java (working copy) @@ -21,7 +21,6 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.BytesRef; -import org.apache.lucene.index.Terms; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiFields; @@ -50,10 +49,9 @@ public static void getTermInfo(Directory dir, String field, BytesRef termtext) throws Exception { IndexReader reader = IndexReader.open(dir); - Terms terms =MultiFields.getTerms(reader, field); long totalTF = HighFreqTerms.getTotalTermFreq(reader, field, termtext); System.out.printf("%s:%s \t totalTF = %,d \t doc freq = %,d \n", - field, termtext.utf8ToString(), totalTF, terms.docFreq(termtext)); + field, termtext.utf8ToString(), totalTF, MultiFields.docFreq(reader, field, termtext)); } private static void usage() { Index: lucene/src/test/org/apache/lucene/index/TestDocumentWriter.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestDocumentWriter.java (revision 1198049) +++ lucene/src/test/org/apache/lucene/index/TestDocumentWriter.java (working copy) @@ -199,7 +199,7 @@ writer.close(); SegmentReader reader = SegmentReader.get(true, info, IndexReader.DEFAULT_TERMS_INDEX_DIVISOR, newIOContext(random)); - DocsAndPositionsEnum termPositions = reader.fields().terms("f1").docsAndPositions(reader.getLiveDocs(), new BytesRef("a"), null); + DocsAndPositionsEnum termPositions = MultiFields.getTermPositionsEnum(reader, reader.getLiveDocs(), "f1", new BytesRef("a")); assertTrue(termPositions.nextDoc() != termPositions.NO_MORE_DOCS); int freq = termPositions.freq(); assertEquals(3, freq); @@ -243,18 +243,18 @@ writer.close(); SegmentReader reader = SegmentReader.get(true, info, IndexReader.DEFAULT_TERMS_INDEX_DIVISOR, newIOContext(random)); - DocsAndPositionsEnum termPositions = reader.fields().terms("preanalyzed").docsAndPositions(reader.getLiveDocs(), new BytesRef("term1"), null); + DocsAndPositionsEnum termPositions = reader.termPositionsEnum(reader.getLiveDocs(), "preanalyzed", new BytesRef("term1")); assertTrue(termPositions.nextDoc() != termPositions.NO_MORE_DOCS); assertEquals(1, termPositions.freq()); assertEquals(0, termPositions.nextPosition()); - termPositions = reader.fields().terms("preanalyzed").docsAndPositions(reader.getLiveDocs(), new BytesRef("term2"), null); + termPositions = reader.termPositionsEnum(reader.getLiveDocs(), "preanalyzed", new BytesRef("term2")); assertTrue(termPositions.nextDoc() != termPositions.NO_MORE_DOCS); assertEquals(2, termPositions.freq()); assertEquals(1, termPositions.nextPosition()); assertEquals(3, termPositions.nextPosition()); - termPositions = reader.fields().terms("preanalyzed").docsAndPositions(reader.getLiveDocs(), new BytesRef("term3"), null); + termPositions = reader.termPositionsEnum(reader.getLiveDocs(), "preanalyzed", new BytesRef("term3")); assertTrue(termPositions.nextDoc() != termPositions.NO_MORE_DOCS); assertEquals(1, termPositions.freq()); assertEquals(2, termPositions.nextPosition()); Index: lucene/src/test/org/apache/lucene/index/TestOmitTf.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestOmitTf.java (revision 1198049) +++ lucene/src/test/org/apache/lucene/index/TestOmitTf.java (working copy) @@ -445,8 +445,8 @@ iw.addDocument(doc); IndexReader ir = iw.getReader(); iw.close(); + assertEquals(-1, MultiFields.totalTermFreq(ir, "foo", new BytesRef("bar"))); Terms terms = MultiFields.getTerms(ir, "foo"); - assertEquals(-1, terms.totalTermFreq(new BytesRef("bar"))); assertEquals(-1, terms.getSumTotalTermFreq()); ir.close(); dir.close(); Index: lucene/src/test/org/apache/lucene/index/TestIndexReader.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestIndexReader.java (revision 1198049) +++ lucene/src/test/org/apache/lucene/index/TestIndexReader.java (working copy) @@ -1345,13 +1345,12 @@ writer.addDocument(d); IndexReader r = writer.getReader(); writer.close(); - Terms terms = MultiFields.getTerms(r, "f"); try { // Make sure codec impls totalTermFreq (eg PreFlex doesn't) - Assume.assumeTrue(terms.totalTermFreq(new BytesRef("b")) != -1); - assertEquals(1, terms.totalTermFreq(new BytesRef("b"))); - assertEquals(2, terms.totalTermFreq(new BytesRef("a"))); - assertEquals(1, terms.totalTermFreq(new BytesRef("b"))); + Assume.assumeTrue(MultiFields.totalTermFreq(r, "f", new BytesRef("b")) != -1); + assertEquals(1, MultiFields.totalTermFreq(r, "f", new BytesRef("b"))); + assertEquals(2, MultiFields.totalTermFreq(r, "f", new BytesRef("a"))); + assertEquals(1, MultiFields.totalTermFreq(r, "f", new BytesRef("b"))); } finally { r.close(); dir.close(); Index: lucene/src/test/org/apache/lucene/index/TestStressIndexing2.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestStressIndexing2.java (revision 1198049) +++ lucene/src/test/org/apache/lucene/index/TestStressIndexing2.java (working copy) @@ -343,6 +343,7 @@ return; } Terms terms2 = fields.terms(idField); + TermsEnum termsEnum2 = terms2.iterator(); DocsEnum termDocs1 = null; DocsEnum termDocs2 = null; @@ -355,7 +356,11 @@ } termDocs1 = termsEnum.docs(liveDocs1, termDocs1); - termDocs2 = terms2.docs(liveDocs2, term, termDocs2); + if (termsEnum2.seekExact(term, false)) { + termDocs2 = termsEnum2.docs(liveDocs2, termDocs2); + } else { + termDocs2 = null; + } if (termDocs1.nextDoc() == DocsEnum.NO_MORE_DOCS) { // This doc is deleted and wasn't replaced @@ -413,7 +418,7 @@ String field1=null, field2=null; TermsEnum termsEnum1 = null; - TermsEnum termsEnum2 = null; + termsEnum2 = null; DocsEnum docs1=null, docs2=null; // pack both doc and freq into single element for easy sorting Index: lucene/src/test/org/apache/lucene/index/TestMultiFields.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestMultiFields.java (revision 1198049) +++ lucene/src/test/org/apache/lucene/index/TestMultiFields.java (working copy) @@ -114,7 +114,6 @@ for(int delDoc : deleted) { assertFalse(liveDocs.get(delDoc)); } - Terms terms2 = MultiFields.getTerms(reader, "field"); for(int i=0;i<100;i++) { BytesRef term = terms.get(random.nextInt(terms.size())); @@ -122,7 +121,7 @@ System.out.println("TEST: seek term="+ UnicodeUtil.toHexString(term.utf8ToString()) + " " + term); } - DocsEnum docsEnum = terms2.docs(liveDocs, term, null); + DocsEnum docsEnum = MultiFields.getTermDocsEnum(reader, liveDocs, "field", term); assertNotNull(docsEnum); for(int docID : docs.get(term)) { Index: lucene/src/java/org/apache/lucene/search/PhraseQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/PhraseQuery.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/search/PhraseQuery.java (working copy) @@ -27,7 +27,6 @@ import org.apache.lucene.index.DocsAndPositionsEnum; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.TermState; -import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.search.similarities.Similarity.SloppyDocScorer; @@ -266,8 +265,7 @@ private boolean termNotInReader(IndexReader reader, String field, BytesRef bytes) throws IOException { // only called from assert - final Terms terms = reader.terms(field); - return terms == null || terms.docFreq(bytes) == 0; + return reader.docFreq(field, bytes) == 0; } @Override Index: lucene/src/java/org/apache/lucene/search/TermQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/TermQuery.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/search/TermQuery.java (working copy) @@ -23,7 +23,6 @@ import org.apache.lucene.index.DocsEnum; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.TermState; -import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.index.IndexReader.AtomicReaderContext; import org.apache.lucene.index.IndexReader.ReaderContext; @@ -116,8 +115,7 @@ private boolean termNotInReader(IndexReader reader, String field, BytesRef bytes) throws IOException { // only called from assert //System.out.println("TQ.termNotInReader reader=" + reader + " term=" + field + ":" + bytes.utf8ToString()); - final Terms terms = reader.terms(field); - return terms == null || terms.docFreq(bytes) == 0; + return reader.docFreq(field, bytes) == 0; } @Override Index: lucene/src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentReader.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -35,7 +35,6 @@ import org.apache.lucene.store.IOContext; import org.apache.lucene.util.BitVector; import org.apache.lucene.util.Bits; -import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.CloseableThreadLocal; import org.apache.lucene.util.StringHelper; @@ -472,17 +471,6 @@ } @Override - public int docFreq(String field, BytesRef term) throws IOException { - ensureOpen(); - Terms terms = core.fields.terms(field); - if (terms != null) { - return terms.docFreq(term); - } else { - return 0; - } - } - - @Override public int numDocs() { // Don't call ensureOpen() here (it could affect performance) if (liveDocs != null) { Index: lucene/src/java/org/apache/lucene/index/Terms.java =================================================================== --- lucene/src/java/org/apache/lucene/index/Terms.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/Terms.java (working copy) @@ -20,9 +20,7 @@ import java.io.IOException; import java.util.Comparator; -import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.CloseableThreadLocal; import org.apache.lucene.util.automaton.CompiledAutomaton; /** @@ -32,10 +30,6 @@ public abstract class Terms { - // Privately cache a TermsEnum per-thread for looking up - // docFreq and getting a private DocsEnum - private final CloseableThreadLocal threadEnums = new CloseableThreadLocal(); - /** Returns an iterator that will step through all * terms. This method will not return null.*/ public abstract TermsEnum iterator() throws IOException; @@ -80,81 +74,6 @@ * reuse it. */ public abstract Comparator getComparator() throws IOException; - /** Returns the number of documents containing the - * specified term text. Returns 0 if the term does not - * exist. */ - public int docFreq(BytesRef text) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - if (termsEnum.seekExact(text, true)) { - return termsEnum.docFreq(); - } else { - return 0; - } - } - - /** Returns the total number of occurrences of this term - * across all documents (the sum of the freq() for each - * doc that has this term). This will be -1 if the - * codec doesn't support this measure. Note that, like - * other term measures, this measure does not take - * deleted documents into account. */ - public long totalTermFreq(BytesRef text) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - if (termsEnum.seekExact(text, true)) { - return termsEnum.totalTermFreq(); - } else { - return 0; - } - } - - /** Get {@link DocsEnum} for the specified term. This - * method may return null if the term does not exist. */ - public DocsEnum docs(Bits liveDocs, BytesRef text, DocsEnum reuse) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - if (termsEnum.seekExact(text, true)) { - return termsEnum.docs(liveDocs, reuse); - } else { - return null; - } - } - - /** Get {@link DocsEnum} for the specified term. This - * method will may return null if the term does not - * exists, or positions were not indexed. */ - public DocsAndPositionsEnum docsAndPositions(Bits liveDocs, BytesRef text, DocsAndPositionsEnum reuse) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - if (termsEnum.seekExact(text, true)) { - return termsEnum.docsAndPositions(liveDocs, reuse); - } else { - return null; - } - } - - /** - * Expert: Get {@link DocsEnum} for the specified {@link TermState}. - * This method may return null if the term does not exist. - * - * @see TermsEnum#termState() - * @see TermsEnum#seekExact(BytesRef, TermState) */ - public DocsEnum docs(Bits liveDocs, BytesRef term, TermState termState, DocsEnum reuse) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - termsEnum.seekExact(term, termState); - return termsEnum.docs(liveDocs, reuse); - } - - /** - * Get {@link DocsEnum} for the specified {@link TermState}. This - * method will may return null if the term does not exists, or positions were - * not indexed. - * - * @see TermsEnum#termState() - * @see TermsEnum#seekExact(BytesRef, TermState) */ - public DocsAndPositionsEnum docsAndPositions(Bits liveDocs, BytesRef term, TermState termState, DocsAndPositionsEnum reuse) throws IOException { - final TermsEnum termsEnum = getThreadTermsEnum(); - termsEnum.seekExact(term, termState); - return termsEnum.docsAndPositions(liveDocs, reuse); - } - /** Returns the number of terms for this field, or -1 if this * measure isn't stored by the codec. Note that, just like * other term measures, this measure does not take deleted @@ -199,17 +118,8 @@ * @lucene.internal */ public TermsEnum getThreadTermsEnum() throws IOException { - TermsEnum termsEnum = threadEnums.get(); - if (termsEnum == null) { - termsEnum = iterator(); - threadEnums.set(termsEnum); - } - return termsEnum; + return iterator(); } - // subclass must close when done: - protected void close() { - threadEnums.close(); - } public final static Terms[] EMPTY_ARRAY = new Terms[0]; } Index: lucene/src/java/org/apache/lucene/index/FilterIndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/FilterIndexReader.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/FilterIndexReader.java (working copy) @@ -81,21 +81,6 @@ } @Override - public int docFreq(BytesRef text) throws IOException { - return in.docFreq(text); - } - - @Override - public DocsEnum docs(Bits liveDocs, BytesRef text, DocsEnum reuse) throws IOException { - return in.docs(liveDocs, text, reuse); - } - - @Override - public DocsAndPositionsEnum docsAndPositions(Bits liveDocs, BytesRef text, DocsAndPositionsEnum reuse) throws IOException { - return in.docsAndPositions(liveDocs, text, reuse); - } - - @Override public long getUniqueTermCount() throws IOException { return in.getUniqueTermCount(); } Index: lucene/src/java/org/apache/lucene/index/IndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexReader.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/IndexReader.java (working copy) @@ -28,7 +28,6 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.DocumentStoredFieldVisitor; -import org.apache.lucene.index.codecs.PostingsFormat; import org.apache.lucene.index.codecs.PerDocValues; import org.apache.lucene.index.values.IndexDocValues; import org.apache.lucene.search.FieldCache; // javadocs @@ -1035,7 +1034,12 @@ if (terms == null) { return 0; } - return terms.docFreq(term); + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.docFreq(); + } else { + return 0; + } } /** Returns the number of documents containing the term @@ -1052,7 +1056,12 @@ if (terms == null) { return 0; } - return terms.totalTermFreq(term); + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.totalTermFreq(); + } else { + return 0; + } } /** This may return null if the field does not exist.*/ @@ -1071,15 +1080,16 @@ assert field != null; assert term != null; final Fields fields = fields(); - if (fields == null) { - return null; + if (fields != null) { + final Terms terms = fields.terms(field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.docs(liveDocs, null); + } + } } - final Terms terms = fields.terms(field); - if (terms != null) { - return terms.docs(liveDocs, term, null); - } else { - return null; - } + return null; } /** Returns {@link DocsAndPositionsEnum} for the specified @@ -1090,15 +1100,16 @@ assert field != null; assert term != null; final Fields fields = fields(); - if (fields == null) { - return null; + if (fields != null) { + final Terms terms = fields.terms(field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.docsAndPositions(liveDocs, null); + } + } } - final Terms terms = fields.terms(field); - if (terms != null) { - return terms.docsAndPositions(liveDocs, term, null); - } else { - return null; - } + return null; } /** @@ -1110,15 +1121,15 @@ assert state != null; assert field != null; final Fields fields = fields(); - if (fields == null) { - return null; + if (fields != null) { + final Terms terms = fields.terms(field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + termsEnum.seekExact(term, state); + return termsEnum.docs(liveDocs, null); + } } - final Terms terms = fields.terms(field); - if (terms != null) { - return terms.docs(liveDocs, term, state, null); - } else { - return null; - } + return null; } /** @@ -1130,15 +1141,15 @@ assert state != null; assert field != null; final Fields fields = fields(); - if (fields == null) { - return null; + if (fields != null) { + final Terms terms = fields.terms(field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + termsEnum.seekExact(term, state); + return termsEnum.docsAndPositions(liveDocs, null); + } } - final Terms terms = fields.terms(field); - if (terms != null) { - return terms.docsAndPositions(liveDocs, term, state, null); - } else { - return null; - } + return null; } Index: lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java (working copy) @@ -18,7 +18,6 @@ */ import java.io.ByteArrayOutputStream; -import java.io.Closeable; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; @@ -197,9 +196,6 @@ try { IOUtils.close(in, postingsReader); } finally { - for(FieldReader field : fields.values()) { - field.close(); - } // Clear so refs to terms index is GCable even if // app hangs onto us: fields.clear(); @@ -390,7 +386,7 @@ final Outputs fstOutputs = ByteSequenceOutputs.getSingleton(); final BytesRef NO_OUTPUT = fstOutputs.getNoOutput(); - public final class FieldReader extends Terms implements Closeable { + public final class FieldReader extends Terms { final long numTerms; final FieldInfo fieldInfo; final long sumTotalTermFreq; @@ -449,11 +445,6 @@ } @Override - public void close() { - super.close(); - } - - @Override public TermsEnum iterator() throws IOException { return new SegmentTermsEnum(); } @@ -914,8 +905,6 @@ for(int idx=0;idx<=target.length;idx++) { - boolean lastIsSubBlock = false; - while (true) { final int savePos = currentFrame.suffixesReader.getPosition(); final int saveStartBytePos = currentFrame.startBytePos; @@ -950,7 +939,6 @@ return; } } - lastIsSubBlock = isSubBlock; continue; } else if (cmp == 0) { //if (DEBUG) System.out.println(" return term=" + brToString(term)); Index: lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java (working copy) @@ -17,7 +17,6 @@ * limitations under the License. */ -import java.io.Closeable; import java.io.IOException; import java.util.Collection; import java.util.Comparator; @@ -182,14 +181,8 @@ } } } finally { - try { - if (postingsReader != null) { - postingsReader.close(); - } - } finally { - for(FieldReader field : fields.values()) { - field.close(); - } + if (postingsReader != null) { + postingsReader.close(); } } } @@ -234,7 +227,7 @@ } } - private class FieldReader extends Terms implements Closeable { + private class FieldReader extends Terms { final long numTerms; final FieldInfo fieldInfo; final long termsStartPointer; @@ -258,11 +251,6 @@ } @Override - public void close() { - super.close(); - } - - @Override public TermsEnum iterator() throws IOException { return new SegmentTermsEnum(); } Index: lucene/src/java/org/apache/lucene/index/MultiFields.java =================================================================== --- lucene/src/java/org/apache/lucene/index/MultiFields.java (revision 1198049) +++ lucene/src/java/org/apache/lucene/index/MultiFields.java (working copy) @@ -156,10 +156,12 @@ assert term != null; final Terms terms = getTerms(r, field); if (terms != null) { - return terms.docs(liveDocs, term, null); - } else { - return null; + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.docs(liveDocs, null); + } } + return null; } /** Returns {@link DocsAndPositionsEnum} for the specified @@ -170,10 +172,12 @@ assert term != null; final Terms terms = getTerms(r, field); if (terms != null) { - return terms.docsAndPositions(liveDocs, term, null); - } else { - return null; + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(term, true)) { + return termsEnum.docsAndPositions(liveDocs, null); + } } + return null; } public MultiFields(Fields[] subs, ReaderUtil.Slice[] subSlices) { @@ -231,5 +235,27 @@ return result; } + + public static int docFreq(IndexReader r, String field, BytesRef text) throws IOException { + final Terms terms = getTerms(r, field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(text, true)) { + return termsEnum.docFreq(); + } + } + return 0; + } + + public static long totalTermFreq(IndexReader r, String field, BytesRef text) throws IOException { + final Terms terms = getTerms(r, field); + if (terms != null) { + final TermsEnum termsEnum = terms.iterator(); + if (termsEnum.seekExact(text, true)) { + return termsEnum.totalTermFreq(); + } + } + return 0; + } }