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 2013/01/24 22:07:36 UTC
svn commit: r1438195 - in
/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene:
codecs/lucene40/Lucene40DocValuesReader.java index/CheckIndex.java
Author: rmuir
Date: Thu Jan 24 21:07:36 2013
New Revision: 1438195
URL: http://svn.apache.org/viewvc?rev=1438195&view=rev
Log:
LUCENE-4717: detect and mask bug in lucene4.0/4.1 indexes
Modified:
lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesReader.java
lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
Modified: lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesReader.java?rev=1438195&r1=1438194&r2=1438195&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesReader.java (original)
+++ lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesReader.java Thu Jan 24 21:07:36 2013
@@ -499,7 +499,7 @@ class Lucene40DocValuesReader extends Do
data.readBytes(bytes, 0, bytes.length);
final PackedInts.Reader reader = PackedInts.getReader(index);
- return new SortedDocValues() {
+ return correctBuggyOrds(new SortedDocValues() {
@Override
public int getOrd(int docID) {
return (int) reader.get(docID);
@@ -516,7 +516,7 @@ class Lucene40DocValuesReader extends Do
public int getValueCount() {
return valueCount;
}
- };
+ });
}
private SortedDocValues loadBytesVarSorted(FieldInfo field, IndexInput data, IndexInput index) throws IOException {
@@ -537,7 +537,7 @@ class Lucene40DocValuesReader extends Do
final int valueCount = addressReader.size() - 1;
- return new SortedDocValues() {
+ return correctBuggyOrds(new SortedDocValues() {
@Override
public int getOrd(int docID) {
return (int)ordsReader.get(docID);
@@ -556,6 +556,34 @@ class Lucene40DocValuesReader extends Do
public int getValueCount() {
return valueCount;
}
+ });
+ }
+
+ // detects and corrects LUCENE-4717 in old indexes
+ private SortedDocValues correctBuggyOrds(final SortedDocValues in) {
+ final int maxDoc = state.segmentInfo.getDocCount();
+ for (int i = 0; i < maxDoc; i++) {
+ if (in.getOrd(i) == 0) {
+ return in; // ok
+ }
+ }
+
+ // we had ord holes, return an ord-shifting-impl that corrects the bug
+ return new SortedDocValues() {
+ @Override
+ public int getOrd(int docID) {
+ return in.getOrd(docID) - 1;
+ }
+
+ @Override
+ public void lookupOrd(int ord, BytesRef result) {
+ in.lookupOrd(ord+1, result);
+ }
+
+ @Override
+ public int getValueCount() {
+ return in.getValueCount() - 1;
+ }
};
}
Modified: lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java?rev=1438195&r1=1438194&r2=1438195&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java (original)
+++ lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java Thu Jan 24 21:07:36 2013
@@ -1339,8 +1339,7 @@ public class CheckIndex {
throw new RuntimeException("dv for field: " + fieldName + " reports wrong maxOrd=" + maxOrd + " but this is not the case: " + maxOrd2);
}
if (seenOrds.cardinality() != dv.getValueCount()) {
- // nocommit: looks like maybe a bug in 4.0 indexes? dig on this (and think if we can correct it somehow...)
- // throw new RuntimeException("dv for field: " + fieldName + " has holes in its ords, valueCount=" + dv.getValueCount() + " but only used: " + seenOrds.cardinality());
+ throw new RuntimeException("dv for field: " + fieldName + " has holes in its ords, valueCount=" + dv.getValueCount() + " but only used: " + seenOrds.cardinality());
}
BytesRef lastValue = null;
BytesRef scratch = new BytesRef();