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();