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