You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/01/20 18:54:07 UTC

svn commit: r1061419 - /lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java

Author: simonw
Date: Thu Jan 20 17:54:07 2011
New Revision: 1061419

URL: http://svn.apache.org/viewvc?rev=1061419&view=rev
Log:
LUCENE-2723: Several fixes to SepPostingsReaderImpl positions block reading

Modified:
    lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java

Modified: lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java?rev=1061419&r1=1061418&r2=1061419&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java (original)
+++ lucene/dev/branches/bulkpostings/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java Thu Jan 20 17:54:07 2011
@@ -834,6 +834,7 @@ public class SepPostingsReaderImpl exten
     // are also encoded into the position deltas
     private final class PosPayloadReader extends BulkPostingsEnum.BlockReader {
       final BulkPostingsEnum.BlockReader other;
+      private boolean fillPending;
       private int pendingOffset;
       private int limit;
       private boolean skipNext;
@@ -842,7 +843,11 @@ public class SepPostingsReaderImpl exten
         this.other = other;
       }
 
-      void doAfterSeek() {}
+      void doAfterSeek() {
+        limit = 0;
+        skipNext = false;
+        fillPending = false;
+      }
 
       @Override
       public int[] getBuffer() {
@@ -868,23 +873,33 @@ public class SepPostingsReaderImpl exten
         // any changes in payload length.  NOTE: this is a
         // perf hit on indices that encode payloads, even if
         // they use "normal" positional queries
-        final int otherLimit = other.fill();
         limit = 0;
-        final int[] buffer = other.getBuffer();
-        for(int i=pendingOffset;i<otherLimit;i++) {
-          if (skipNext) {
-            skipNext = false;
-          } else {
-            final int code = buffer[i];
-            buffer[limit++] = code >>> 1;
-            if ((code & 1) != 0) {
-              // skip the payload length
-              skipNext = true;
+        boolean skippedLast = false;
+        do { 
+          final int otherLimit = fillPending ? other.fill() : other.end();
+          fillPending = true;
+          assert otherLimit > pendingOffset;
+          final int[] buffer = other.getBuffer();
+          for(int i=pendingOffset;i<otherLimit;i++) {
+            if (skipNext) {
+              skipNext = false;
+              skippedLast = true;
+            } else {
+              skippedLast = false;
+              final int code = buffer[i];
+              buffer[limit++] = code >>> 1;
+              if ((code & 1) != 0) {
+                // skip the payload length
+                skipNext = true;
+              }
             }
           }
-        }
-        pendingOffset = 0;
-
+          pendingOffset = 0;
+          /*
+           *  some readers will only fill a single element of the buffer
+           *  if that single element is skipped we need to do another round.
+           */
+        }while(limit == 0 && skippedLast);
         return limit;
       }
 
@@ -1014,9 +1029,14 @@ public class SepPostingsReaderImpl exten
             skipper.getFreqIndex().seek(freqReader);
           }
           if (posReader != null) {
-            skipper.getPosIndex().seek(posReader);
+            if (storePayloads) {
+              PosPayloadReader posPayloadReader = (PosPayloadReader) posReader;
+              skipper.getPosIndex().seek(posPayloadReader.other);
+              posPayloadReader.doAfterSeek();
+            } else {
+              skipper.getPosIndex().seek(posReader);
+            }
           }
-
           jumpResult.count = newCount;
           jumpResult.docID = skipper.getDoc();
           return jumpResult;