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 2011/11/17 16:20:50 UTC

svn commit: r1203216 - in /lucene/dev/trunk/lucene/src: java/org/apache/lucene/index/codecs/ java/org/apache/lucene/index/codecs/simpletext/ test/org/apache/lucene/index/

Author: rmuir
Date: Thu Nov 17 15:20:50 2011
New Revision: 1203216

URL: http://svn.apache.org/viewvc?rev=1203216&view=rev
Log:
LUCENE-3580: fix TVs to obey DISI contract for docID() before next/advance

Modified:
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/simpletext/SimpleTextTermVectorsReader.java
    lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermVectorsReader.java

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java?rev=1203216&r1=1203215&r2=1203216&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java Thu Nov 17 15:20:50 2011
@@ -547,6 +547,7 @@ public class DefaultTermVectorsReader ex
   // freq() already by TermsEnum.totalTermFreq
   private static class TVDocsEnum extends DocsEnum {
     private boolean didNext;
+    private int doc = -1;
     private int freq;
     private Bits liveDocs;
 
@@ -557,16 +558,16 @@ public class DefaultTermVectorsReader ex
 
     @Override
     public int docID() {
-      return 0;
+      return doc;
     }
 
     @Override
     public int nextDoc() {
       if (!didNext && (liveDocs == null || liveDocs.get(0))) {
         didNext = true;
-        return 0;
+        return (doc = 0);
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -575,13 +576,14 @@ public class DefaultTermVectorsReader ex
       if (!didNext && target == 0) {
         return nextDoc();
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
     public void reset(Bits liveDocs, int freq) {
       this.liveDocs = liveDocs;
       this.freq = freq;
+      this.doc = -1;
       didNext = false;
     }
   }
@@ -589,6 +591,7 @@ public class DefaultTermVectorsReader ex
   private static class TVDocsAndPositionsEnum extends DocsAndPositionsEnum {
     private final OffsetAttribute offsetAtt;
     private boolean didNext;
+    private int doc = -1;
     private int nextPos;
     private Bits liveDocs;
     private int[] positions;
@@ -619,16 +622,16 @@ public class DefaultTermVectorsReader ex
 
     @Override
     public int docID() {
-      return 0;
+      return doc;
     }
 
     @Override
     public int nextDoc() {
       if (!didNext && (liveDocs == null || liveDocs.get(0))) {
         didNext = true;
-        return 0;
+        return (doc = 0);
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -637,7 +640,7 @@ public class DefaultTermVectorsReader ex
       if (!didNext && target == 0) {
         return nextDoc();
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -647,6 +650,7 @@ public class DefaultTermVectorsReader ex
       this.startOffsets = startOffsets;
       assert (offsetAtt != null) == (startOffsets != null);
       this.endOffsets = endOffsets;
+      this.doc = -1;
       didNext = false;
       nextPos = 0;
     }

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/simpletext/SimpleTextTermVectorsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/simpletext/SimpleTextTermVectorsReader.java?rev=1203216&r1=1203215&r2=1203216&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/simpletext/SimpleTextTermVectorsReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/simpletext/SimpleTextTermVectorsReader.java Thu Nov 17 15:20:50 2011
@@ -392,6 +392,7 @@ public class SimpleTextTermVectorsReader
   // note: these two enum classes are exactly like the Default impl...
   private static class SimpleTVDocsEnum extends DocsEnum {
     private boolean didNext;
+    private int doc = -1;
     private int freq;
     private Bits liveDocs;
 
@@ -402,16 +403,16 @@ public class SimpleTextTermVectorsReader
 
     @Override
     public int docID() {
-      return 0;
+      return doc;
     }
 
     @Override
     public int nextDoc() {
       if (!didNext && (liveDocs == null || liveDocs.get(0))) {
         didNext = true;
-        return 0;
+        return (doc = 0);
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -420,13 +421,14 @@ public class SimpleTextTermVectorsReader
       if (!didNext && target == 0) {
         return nextDoc();
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
     public void reset(Bits liveDocs, int freq) {
       this.liveDocs = liveDocs;
       this.freq = freq;
+      this.doc = -1;
       didNext = false;
     }
   }
@@ -434,6 +436,7 @@ public class SimpleTextTermVectorsReader
   private static class SimpleTVDocsAndPositionsEnum extends DocsAndPositionsEnum {
     private final OffsetAttribute offsetAtt;
     private boolean didNext;
+    private int doc = -1;
     private int nextPos;
     private Bits liveDocs;
     private int[] positions;
@@ -464,16 +467,16 @@ public class SimpleTextTermVectorsReader
 
     @Override
     public int docID() {
-      return 0;
+      return doc;
     }
 
     @Override
     public int nextDoc() {
       if (!didNext && (liveDocs == null || liveDocs.get(0))) {
         didNext = true;
-        return 0;
+        return (doc = 0);
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -482,7 +485,7 @@ public class SimpleTextTermVectorsReader
       if (!didNext && target == 0) {
         return nextDoc();
       } else {
-        return NO_MORE_DOCS;
+        return (doc = NO_MORE_DOCS);
       }
     }
 
@@ -492,6 +495,7 @@ public class SimpleTextTermVectorsReader
       this.startOffsets = startOffsets;
       assert (offsetAtt != null) == (startOffsets != null);
       this.endOffsets = endOffsets;
+      this.doc = -1;
       didNext = false;
       nextPos = 0;
     }

Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermVectorsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermVectorsReader.java?rev=1203216&r1=1203215&r2=1203216&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermVectorsReader.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermVectorsReader.java Thu Nov 17 15:20:50 2011
@@ -34,6 +34,7 @@ import org.apache.lucene.document.TextFi
 import org.apache.lucene.index.codecs.Codec;
 import org.apache.lucene.index.codecs.DefaultTermVectorsReader;
 import org.apache.lucene.index.codecs.TermVectorsReader;
+import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
@@ -215,6 +216,33 @@ public class TestTermVectorsReader exten
     }
     reader.close();
   }
+  
+  public void testDocsEnum() throws IOException {
+    TermVectorsReader reader = Codec.getDefault().termVectorsFormat().vectorsReader(dir, seg, fieldInfos, newIOContext(random));
+    for (int j = 0; j < 5; j++) {
+      Terms vector = reader.get(j).terms(testFields[0]);
+      assertNotNull(vector);
+      assertEquals(testTerms.length, vector.getUniqueTermCount());
+      TermsEnum termsEnum = vector.iterator(null);
+      DocsEnum docsEnum = null;
+      for (int i = 0; i < testTerms.length; i++) {
+        final BytesRef text = termsEnum.next();
+        assertNotNull(text);
+        String term = text.utf8ToString();
+        //System.out.println("Term: " + term);
+        assertEquals(testTerms[i], term);
+        
+        docsEnum = termsEnum.docs(null, docsEnum);
+        assertNotNull(docsEnum);
+        int doc = docsEnum.docID();
+        assertTrue(doc == -1 || doc == DocIdSetIterator.NO_MORE_DOCS);
+        assertTrue(docsEnum.nextDoc() != DocsEnum.NO_MORE_DOCS);
+        assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsEnum.nextDoc());
+      }
+      assertNull(termsEnum.next());
+    }
+    reader.close();
+  }
 
   public void testPositionReader() throws IOException {
     TermVectorsReader reader = Codec.getDefault().termVectorsFormat().vectorsReader(dir, seg, fieldInfos, newIOContext(random));
@@ -233,6 +261,8 @@ public class TestTermVectorsReader exten
 
       dpEnum = termsEnum.docsAndPositions(null, dpEnum);
       assertNotNull(dpEnum);
+      int doc = dpEnum.docID();
+      assertTrue(doc == -1 || doc == DocIdSetIterator.NO_MORE_DOCS);
       assertTrue(dpEnum.nextDoc() != DocsEnum.NO_MORE_DOCS);
       assertEquals(dpEnum.freq(), positions[i].length);
       for (int j = 0; j < positions[i].length; j++) {
@@ -241,6 +271,8 @@ public class TestTermVectorsReader exten
       assertEquals(DocsEnum.NO_MORE_DOCS, dpEnum.nextDoc());
 
       dpEnum = termsEnum.docsAndPositions(null, dpEnum);
+      doc = dpEnum.docID();
+      assertTrue(doc == -1 || doc == DocIdSetIterator.NO_MORE_DOCS);
       assertTrue(dpEnum.nextDoc() != DocsEnum.NO_MORE_DOCS);
       assertNotNull(dpEnum);
       final OffsetAttribute offsetAtt = dpEnum.attributes().getAttribute(OffsetAttribute.class);