You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2010/07/27 12:51:54 UTC
svn commit: r979637 -
/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java
Author: mikemccand
Date: Tue Jul 27 10:51:54 2010
New Revision: 979637
URL: http://svn.apache.org/viewvc?rev=979637&view=rev
Log:
LUCENE-2569: in Sep codec, make sure reused Docs/AndPositionsEnum can in fact be reused
Modified:
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java?rev=979637&r1=979636&r2=979637&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java Tue Jul 27 10:51:54 2010
@@ -217,22 +217,40 @@ public class SepPostingsReaderImpl exten
@Override
public DocsEnum docs(FieldInfo fieldInfo, TermState _termState, Bits skipDocs, DocsEnum reuse) throws IOException {
final SepTermState termState = (SepTermState) _termState;
- if (reuse == null) {
- return (new SepDocsEnum()).init(fieldInfo, termState, skipDocs);
+ SepDocsEnum docsEnum;
+ if (reuse == null || !(reuse instanceof SepDocsEnum)) {
+ docsEnum = new SepDocsEnum();
} else {
- return ((SepDocsEnum) reuse).init(fieldInfo, termState, skipDocs);
+ docsEnum = (SepDocsEnum) reuse;
+ if (docsEnum.startDocIn != docIn) {
+ // If you are using ParellelReader, and pass in a
+ // reused DocsAndPositionsEnum, it could have come
+ // from another reader also using sep codec
+ docsEnum = new SepDocsEnum();
+ }
}
+
+ return docsEnum.init(fieldInfo, termState, skipDocs);
}
@Override
public DocsAndPositionsEnum docsAndPositions(FieldInfo fieldInfo, TermState _termState, Bits skipDocs, DocsAndPositionsEnum reuse) throws IOException {
assert !fieldInfo.omitTermFreqAndPositions;
final SepTermState termState = (SepTermState) _termState;
- if (reuse == null) {
- return (new SepDocsAndPositionsEnum()).init(fieldInfo, termState, skipDocs);
+ SepDocsAndPositionsEnum postingsEnum;
+ if (reuse == null || !(reuse instanceof SepDocsAndPositionsEnum)) {
+ postingsEnum = new SepDocsAndPositionsEnum();
} else {
- return ((SepDocsAndPositionsEnum) reuse).init(fieldInfo, termState, skipDocs);
+ postingsEnum = (SepDocsAndPositionsEnum) reuse;
+ if (postingsEnum.startDocIn != docIn) {
+ // If you are using ParellelReader, and pass in a
+ // reused DocsAndPositionsEnum, it could have come
+ // from another reader also using sep codec
+ postingsEnum = new SepDocsAndPositionsEnum();
+ }
}
+
+ return postingsEnum.init(fieldInfo, termState, skipDocs);
}
class SepDocsEnum extends DocsEnum {
@@ -253,6 +271,7 @@ public class SepPostingsReaderImpl exten
private final IntIndexInput.Index docIndex;
private final IntIndexInput.Index freqIndex;
private final IntIndexInput.Index posIndex;
+ private final IntIndexInput startDocIn;
// TODO: -- should we do hasProx with 2 different enum classes?
@@ -260,6 +279,7 @@ public class SepPostingsReaderImpl exten
SepSkipListReader skipper;
SepDocsEnum() throws IOException {
+ startDocIn = docIn;
docReader = docIn.reader();
docIndex = docIn.index();
if (freqIn != null) {
@@ -439,6 +459,8 @@ public class SepPostingsReaderImpl exten
private final IntIndexInput.Index docIndex;
private final IntIndexInput.Index freqIndex;
private final IntIndexInput.Index posIndex;
+ private final IntIndexInput startDocIn;
+
private long payloadOffset;
private int pendingPosCount;
@@ -452,6 +474,7 @@ public class SepPostingsReaderImpl exten
private boolean posSeekPending;
SepDocsAndPositionsEnum() throws IOException {
+ startDocIn = docIn;
docReader = docIn.reader();
docIndex = docIn.index();
freqReader = freqIn.reader();