You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2012/06/12 15:42:50 UTC

svn commit: r1349349 - in /lucene/dev/trunk: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/CheckIndex.java

Author: rmuir
Date: Tue Jun 12 13:42:50 2012
New Revision: 1349349

URL: http://svn.apache.org/viewvc?rev=1349349&view=rev
Log:
sanity check offsets in checkindex

Modified:
    lucene/dev/trunk/   (props changed)
    lucene/dev/trunk/lucene/   (props changed)
    lucene/dev/trunk/lucene/core/   (props changed)
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java?rev=1349349&r1=1349348&r2=1349349&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java Tue Jun 12 13:42:50 2012
@@ -681,6 +681,7 @@ public class CheckIndex {
     DocsEnum docs = null;
     DocsEnum docsAndFreqs = null;
     DocsAndPositionsEnum postings = null;
+    DocsAndPositionsEnum offsets = null;
     
     String lastField = null;
     final FieldsEnum fieldsEnum = fields.iterator();
@@ -756,6 +757,7 @@ public class CheckIndex {
         docs = termsEnum.docs(liveDocs, docs, false);
         docsAndFreqs = termsEnum.docs(liveDocs, docsAndFreqs, true);
         postings = termsEnum.docsAndPositions(liveDocs, postings, false);
+        offsets = termsEnum.docsAndPositions(liveDocs, offsets, true);
         
         if (hasOrd) {
           long ord = -1;
@@ -779,19 +781,29 @@ public class CheckIndex {
         final DocsEnum docsAndFreqs2;
         final boolean hasPositions;
         final boolean hasFreqs;
-        if (postings != null) {
+        final boolean hasOffsets;
+        if (offsets != null) {
+          docs2 = postings = offsets;
+          docsAndFreqs2 = postings = offsets;
+          hasOffsets = true;
+          hasPositions = true;
+          hasFreqs = true;
+        } else if (postings != null) {
           docs2 = postings;
           docsAndFreqs2 = postings;
+          hasOffsets = false;
           hasPositions = true;
           hasFreqs = true;
         } else if (docsAndFreqs != null) {
           docs2 = docsAndFreqs;
           docsAndFreqs2 = docsAndFreqs;
+          hasOffsets = false;
           hasPositions = false;
           hasFreqs = true;
         } else {
           docs2 = docs;
           docsAndFreqs2 = null;
+          hasOffsets = false;
           hasPositions = false;
           hasFreqs = false;
         }
@@ -826,6 +838,7 @@ public class CheckIndex {
           lastDoc = doc;
           
           int lastPos = -1;
+          int lastOffset = 0;
           if (hasPositions) {
             for(int j=0;j<freq;j++) {
               final int pos = postings.nextPosition();
@@ -846,6 +859,23 @@ public class CheckIndex {
               if (postings.hasPayload()) {
                 postings.getPayload();
               }
+              if (hasOffsets) {
+                int startOffset = postings.startOffset();
+                int endOffset = postings.endOffset();
+                if (startOffset < 0) {
+                  throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " is out of bounds");
+                }
+                if (startOffset < lastOffset) {
+                  throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " < lastStartOffset " + lastOffset);
+                }
+                if (endOffset < 0) {
+                  throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " is out of bounds");
+                }
+                if (endOffset < startOffset) {
+                  throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " < startOffset " + startOffset);
+                }
+                lastOffset = startOffset;
+              }
             }
           }
         }
@@ -892,7 +922,7 @@ public class CheckIndex {
         if (hasPositions) {
           for(int idx=0;idx<7;idx++) {
             final int skipDocID = (int) (((idx+1)*(long) maxDoc)/8);
-            postings = termsEnum.docsAndPositions(liveDocs, postings, false);
+            postings = termsEnum.docsAndPositions(liveDocs, postings, hasOffsets);
             final int docID = postings.advance(skipDocID);
             if (docID == DocIdSetIterator.NO_MORE_DOCS) {
               break;
@@ -905,6 +935,7 @@ public class CheckIndex {
                 throw new RuntimeException("termFreq " + freq + " is out of bounds");
               }
               int lastPosition = -1;
+              int lastOffset = 0;
               for(int posUpto=0;posUpto<freq;posUpto++) {
                 final int pos = postings.nextPosition();
                 // NOTE: pos=-1 is allowed because of ancient bug
@@ -921,6 +952,23 @@ public class CheckIndex {
                   throw new RuntimeException("position " + pos + " is < lastPosition " + lastPosition);
                 }
                 lastPosition = pos;
+                if (hasOffsets) {
+                  int startOffset = postings.startOffset();
+                  int endOffset = postings.endOffset();
+                  if (startOffset < 0) {
+                    throw new RuntimeException("term " + term + ": doc " + docID + ": pos " + pos + ": startOffset " + startOffset + " is out of bounds");
+                  }
+                  if (startOffset < lastOffset) {
+                    throw new RuntimeException("term " + term + ": doc " + docID + ": pos " + pos + ": startOffset " + startOffset + " < lastStartOffset " + lastOffset);
+                  }
+                  if (endOffset < 0) {
+                    throw new RuntimeException("term " + term + ": doc " + docID + ": pos " + pos + ": endOffset " + endOffset + " is out of bounds");
+                  }
+                  if (endOffset < startOffset) {
+                    throw new RuntimeException("term " + term + ": doc " + docID + ": pos " + pos + ": endOffset " + endOffset + " < startOffset " + startOffset);
+                  }
+                  lastOffset = startOffset;
+                }
               } 
               
               final int nextDocID = postings.nextDoc();