Index: src/java/org/apache/lucene/index/CheckIndex.java =================================================================== --- src/java/org/apache/lucene/index/CheckIndex.java (revision 929470) +++ src/java/org/apache/lucene/index/CheckIndex.java (working copy) @@ -593,31 +593,59 @@ if (infoStream != null) { infoStream.print(" test: terms, freq, prox..."); } + + final Fields fields = reader.fields(); + if (fields == null) { + msg("OK [no fields/terms]"); + return status; + } - final FieldsEnum fields = reader.fields().iterator(); + final FieldsEnum fieldsEnum = fields.iterator(); while(true) { - final String field = fields.next(); + final String field = fieldsEnum.next(); if (field == null) { break; } - final TermsEnum terms = fields.terms(); + final TermsEnum terms = fieldsEnum.terms(); DocsEnum docs = null; DocsAndPositionsEnum postings = null; + boolean hasOrd = true; + final long termCountStart = status.termCount; + while(true) { final BytesRef term = terms.next(); if (term == null) { break; } + final int docFreq = terms.docFreq(); status.totFreq += docFreq; docs = terms.docs(delDocs, docs); postings = terms.docsAndPositions(delDocs, postings); + if (hasOrd) { + long ord = -1; + try { + ord = terms.ord(); + } catch (UnsupportedOperationException uoe) { + hasOrd = false; + } + + if (hasOrd) { + final long ordExpected = status.termCount - termCountStart; + if (ord != ordExpected) { + throw new RuntimeException("ord mismatch: TermsEnum has ord=" + ord + " vs actual=" + ordExpected); + } + } + } + + status.termCount++; + final DocsEnum docs2; if (postings != null) { docs2 = postings; @@ -625,8 +653,6 @@ docs2 = docs; } - status.termCount++; - int lastDoc = -1; while(true) { final int doc = docs2.nextDoc(); Index: src/java/org/apache/lucene/index/codecs/standard/SimpleStandardTermsIndexReader.java =================================================================== --- src/java/org/apache/lucene/index/codecs/standard/SimpleStandardTermsIndexReader.java (revision 929470) +++ src/java/org/apache/lucene/index/codecs/standard/SimpleStandardTermsIndexReader.java (working copy) @@ -60,7 +60,15 @@ /** @lucene.experimental */ public class SimpleStandardTermsIndexReader extends StandardTermsIndexReader { - private int totalIndexInterval; + // NOTE: long is overkill here, since this number is 128 + // by default and only indexDivisor * 128 if you change + // the indexDivisor at search time. But, we use this in a + // number of places to multiply out the actual ord, and we + // will overflow int during those multiplies. So to avoid + // having to upgrade each multiple to long in multiple + // places (error proned), we use long here: + private long totalIndexInterval; + private int indexDivisor; final private int indexInterval; Index: src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictReader.java =================================================================== --- src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictReader.java (revision 929470) +++ src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictReader.java (working copy) @@ -125,6 +125,7 @@ for(int i=0;i= 0; final long termsStartPointer = in.readLong(); final StandardTermsIndexReader.FieldReader fieldIndexReader; final FieldInfo fieldInfo = fieldInfos.fieldInfo(field); Index: src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictWriter.java =================================================================== --- src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictWriter.java (revision 929470) +++ src/java/org/apache/lucene/index/codecs/standard/StandardTermsDictWriter.java (working copy) @@ -129,7 +129,7 @@ private final FieldInfo fieldInfo; private final StandardPostingsWriter postingsWriter; private final long termsStartPointer; - private int numTerms; + private long numTerms; private final StandardTermsIndexWriter.FieldWriter fieldIndexWriter; TermsWriter(StandardTermsIndexWriter.FieldWriter fieldIndexWriter, FieldInfo fieldInfo, StandardPostingsWriter postingsWriter) {