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/07/15 16:49:51 UTC

svn commit: r1147171 [2/2] - in /lucene/dev/branches/positions/lucene: contrib/highlighter/src/java/org/apache/lucene/search/poshighlight/ contrib/highlighter/src/test/org/apache/lucene/search/poshighlight/ src/java/org/apache/lucene/search/ src/java/o...

Modified: lucene/dev/branches/positions/lucene/src/java/org/apache/lucene/search/spans/SpansScorerWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/java/org/apache/lucene/search/spans/SpansScorerWrapper.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/java/org/apache/lucene/search/spans/SpansScorerWrapper.java (original)
+++ lucene/dev/branches/positions/lucene/src/java/org/apache/lucene/search/spans/SpansScorerWrapper.java Fri Jul 15 14:49:47 2011
@@ -40,17 +40,18 @@ public class SpansScorerWrapper extends 
   public boolean next() throws IOException {
     if (doc == -1) {
       doc = scorer.nextDoc();
+      positions.advanceTo(doc);
     }
 
     if (doc == Scorer.NO_MORE_DOCS) {
       return false;
     }
-
     if ((current = positions.next()) == null) {
       doc = scorer.nextDoc();
       if (doc == Scorer.NO_MORE_DOCS) {
         return false;
       }
+      positions.advanceTo(doc);
       return (current = positions.next()) != null;
     }
     return true;
@@ -62,6 +63,7 @@ public class SpansScorerWrapper extends 
     if (doc == Scorer.NO_MORE_DOCS) {
       return false;
     }
+    positions.advanceTo(doc);
     return (current = positions.next()) != null;
   }
 

Modified: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java (original)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java Fri Jul 15 14:49:47 2011
@@ -33,6 +33,10 @@ import org.apache.lucene.search.BooleanC
 import org.apache.lucene.search.positions.PositionFilterQuery;
 import org.apache.lucene.search.positions.RangePositionsIterator;
 import org.apache.lucene.search.positions.WithinPositionIterator;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.positions.PositionFilterQuery;
+import org.apache.lucene.search.positions.RangePositionsIterator;
+import org.apache.lucene.search.positions.WithinPositionIterator;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.NamedThreadFactory;

Modified: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestTermQuery.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestTermQuery.java (original)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/TestTermQuery.java Fri Jul 15 14:49:47 2011
@@ -22,20 +22,22 @@ import java.util.Arrays;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
-import org.apache.lucene.analysis.MockPayloadAnalyzer;
 import org.apache.lucene.analysis.MockTokenFilter;
 import org.apache.lucene.analysis.MockTokenizer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.index.DocsAndPositionsEnum;
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.Term;
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader.ReaderContext;
+import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.Term;
 import org.apache.lucene.search.Weight.ScorerContext;
 import org.apache.lucene.search.positions.PositionIntervalIterator;
 import org.apache.lucene.search.positions.PositionIntervalIterator.PositionInterval;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.ReaderUtil;
 
@@ -44,24 +46,18 @@ import org.apache.lucene.util.ReaderUtil
  */
 public class TestTermQuery extends LuceneTestCase {
 
-  private String fieldName;
-  private boolean usePayload;
-
-  public void setUp() throws Exception {
-    super.setUp();
-    fieldName = "field" + random.nextInt();
-    usePayload = random.nextBoolean();
-  }
+  private String fieldName = "field";
 
   /**
    * Simple testcase for {@link TermScorer#positions()}
    */
   public void testPositionsSimple() throws IOException {
     Directory directory = newDirectory();
-   
-    final Analyzer analyzer = new MockAnalyzer(random, MockTokenizer.WHITESPACE, false, MockTokenFilter.EMPTY_STOPSET, true);
+
+    final Analyzer analyzer = new MockAnalyzer(random,
+        MockTokenizer.WHITESPACE, false, MockTokenFilter.EMPTY_STOPSET, true);
     RandomIndexWriter writer = new RandomIndexWriter(random, directory,
-        newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer ));
+        newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer));
     for (int i = 0; i < 39; i++) {
       Document doc = new Document();
       doc.add(newField(fieldName, "1 2 3 4 5 6 7 8 9 10 "
@@ -70,6 +66,12 @@ public class TestTermQuery extends Lucen
       writer.addDocument(doc);
     }
     IndexReader reader = writer.getReader();
+    DocsAndPositionsEnum docsAndPositions = MultiFields.getTerms(reader,
+        fieldName).docsAndPositions(null, new BytesRef("1"), null);
+    docsAndPositions.nextDoc();
+    docsAndPositions.nextPosition();
+    boolean payloadsIndexed = docsAndPositions.hasPayload();
+
     IndexSearcher searcher = new IndexSearcher(reader);
     writer.close();
 
@@ -80,42 +82,43 @@ public class TestTermQuery extends Lucen
       Weight weight = one.createWeight(searcher);
       for (AtomicReaderContext atomicReaderContext : leaves) {
         Scorer scorer = weight.scorer(atomicReaderContext, ScorerContext.def()
-            .needsPositions(true).needsPayloads(usePayload));
+            .needsPositions(true).needsPayloads(payloadsIndexed));
         assertNotNull(scorer);
         final int advance = scorer.advance(1 + random.nextInt(27));
         PositionIntervalIterator positions = scorer.positions();
 
         do {
+          assertEquals(scorer.docID(), positions.advanceTo(scorer.docID()));
+
           PositionInterval interval = null;
           String msg = "Advanced to: " + advance + " current doc: "
-              + scorer.docID() + " usePayloads: " + usePayload;
+              + scorer.docID() + " usePayloads: " + payloadsIndexed;
           assertNotNull(msg, (interval = positions.next()));
           assertEquals(msg, 4.0f, positions.getScorer().freq(), 0.0f);
 
           assertEquals(msg, 0, interval.begin);
           assertEquals(msg, 0, interval.end);
-          checkPayload(0, interval);
+          checkPayload(0, interval, payloadsIndexed);
 
           assertNotNull(msg, (interval = positions.next()));
           assertEquals(msg, 4.0f, positions.getScorer().freq(), 0.0f);
           assertEquals(msg, 10, interval.begin);
           assertEquals(msg, 10, interval.end);
-          checkPayload(10, interval);
+          checkPayload(10, interval, payloadsIndexed);
 
           assertNotNull(msg, (interval = positions.next()));
           assertEquals(msg, 4.0f, positions.getScorer().freq(), 0.0f);
           assertEquals(msg, 20, interval.begin);
           assertEquals(msg, 20, interval.end);
-          checkPayload(20, interval);
+          checkPayload(20, interval, payloadsIndexed);
 
           assertNotNull(msg, (interval = positions.next()));
           assertEquals(msg, 4.0f, positions.getScorer().freq(), 0.0f);
           assertEquals(msg, 30, interval.begin);
           assertEquals(msg, 30, interval.end);
-          checkPayload(30, interval);
+          checkPayload(30, interval, payloadsIndexed);
 
           assertNull(msg, (interval = positions.next()));
-
         } while (scorer.nextDoc() != Scorer.NO_MORE_DOCS);
       }
     }
@@ -124,14 +127,19 @@ public class TestTermQuery extends Lucen
     directory.close();
   }
 
-  public final void checkPayload(int pos, PositionInterval interval) throws IOException {
-    if (usePayload) {
-      // nocommit enable this with mockanalyzer
-//      assertTrue(interval.payloadAvailable());
-//      BytesRef bytes = new BytesRef();
-//      assertTrue(interval.nextPayload(bytes));
-//      assertFalse(interval.payloadAvailable());
-//      assertEquals("pos: " + pos, bytes.utf8ToString());
+  public final void checkPayload(int pos, PositionInterval interval,
+      boolean payloadsIndexed) throws IOException {
+    if (payloadsIndexed) {
+      boolean wasPayloadAvailable = interval.payloadAvailable();
+      BytesRef bytes = new BytesRef();
+      assertTrue(interval.nextPayload(bytes));
+      assertFalse(interval.payloadAvailable());
+      if (!wasPayloadAvailable) {
+        // if payload has 0 length interval or rather docs&pos enum will treat is as not existing
+        assertEquals(0, bytes.length);
+      } else {
+        assertTrue(bytes.length > 0);
+      }
     } else {
       assertFalse(interval.payloadAvailable());
     }
@@ -198,20 +206,20 @@ public class TestTermQuery extends Lucen
           }
           PositionIntervalIterator positions = scorer.positions();
           Integer[] pos = positionsInDoc[atomicReaderContext.docBase + docID];
-          
-          assertEquals((float)pos.length, positions.getScorer().freq(), 0.0f);
+
+          assertEquals((float) pos.length, positions.getScorer().freq(), 0.0f);
           // number of positions read should be random - don't read all of them
           // allways
           final int howMany = random.nextInt(20) == 0 ? pos.length
               - random.nextInt(pos.length) : pos.length;
           PositionInterval interval = null;
-
+          assertEquals(scorer.docID(), positions.advanceTo(scorer.docID()));
           for (int j = 0; j < howMany; j++) {
             assertNotNull((interval = positions.next()));
             assertEquals("iteration: " + i + " initDoc: " + initDoc + " doc: "
                 + docID + " base: " + atomicReaderContext.docBase
-                + " positions: " + Arrays.toString(pos) + " usePayloads: "
-                + usePayload, pos[j].intValue(), interval.begin);
+                + " positions: " + Arrays.toString(pos), pos[j].intValue(),
+                interval.begin);
             assertEquals(pos[j].intValue(), interval.end);
           }
           if (howMany == pos.length) {
@@ -278,22 +286,24 @@ public class TestTermQuery extends Lucen
         } else {
           initDoc = scorer.advance(random.nextInt(maxDoc));
         }
-        String msg = "Iteration: " + i + " initDoc: " + initDoc + " payloads: "
-            + usePayload;
+        String msg = "Iteration: " + i + " initDoc: " + initDoc;
         PositionIntervalIterator positions = scorer.positions();
         assertEquals(howMany / 2.f, positions.getScorer().freq(), 0.0);
+        assertEquals(scorer.docID(), positions.advanceTo(scorer.docID()));
         for (int j = 0; j < howMany; j += 2) {
           assertNotNull("next returned nullat index: " + j + " with freq: "
-              + positions.getScorer().freq() + " -- " + msg,(interval = positions.next()));
+              + positions.getScorer().freq() + " -- " + msg,
+              (interval = positions.next()));
           assertEquals("position missmatch index: " + j + " with freq: "
               + positions.getScorer().freq() + " -- " + msg, j, interval.begin);
         }
-        assertNull("next returned nonNull -- " + msg,(interval = positions.next()));
+        assertNull("next returned nonNull -- " + msg,
+            (interval = positions.next()));
 
       }
     }
     reader.close();
     dir.close();
   }
-  
+
 }
\ No newline at end of file

Modified: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestBlockPositionsIterator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestBlockPositionsIterator.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestBlockPositionsIterator.java (original)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestBlockPositionsIterator.java Fri Jul 15 14:49:47 2011
@@ -134,6 +134,7 @@ public class TestBlockPositionsIterator 
         int nextDoc = scorer.nextDoc();
         assertEquals(0, nextDoc);
         PositionIntervalIterator positions = new BlockPositionIterator(scorer.positions());
+        assertEquals(0, positions.advanceTo(0));
         PositionInterval interval = null;
         int[] start = new int[] {0, 31};
         int[] end = new int[] {2, 33};
@@ -152,6 +153,7 @@ public class TestBlockPositionsIterator 
         int nextDoc = scorer.nextDoc();
         assertEquals(1, nextDoc);
         PositionIntervalIterator positions =  new BlockPositionIterator(scorer.positions());
+        assertEquals(1, positions.advanceTo(1));
         PositionInterval interval = null;
         int[] start = new int[] {3, 34};
         int[] end = new int[] {5, 36};

Modified: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestConjunctionPositionsIterator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestConjunctionPositionsIterator.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestConjunctionPositionsIterator.java (original)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestConjunctionPositionsIterator.java Fri Jul 15 14:49:47 2011
@@ -121,6 +121,7 @@ public class TestConjunctionPositionsIte
         int nextDoc = scorer.nextDoc();
         assertEquals(0, nextDoc);
         PositionIntervalIterator positions = scorer.positions();
+        assertEquals(0, positions.advanceTo(nextDoc));
         PositionInterval interval = null;
         int[] start = new int[] {0, 1, 2, 3, 4, 6, 7, 31, 32, 33};
         int[] end = new int[] {2, 3, 4, 33, 33, 33, 33, 33, 34, 35};
@@ -129,7 +130,7 @@ public class TestConjunctionPositionsIte
         // like it cold, Some like it in the pot nine days old! {7}Pease {8}porridge {9}hot!{3,4,5,6,7} Pease{8} porridge{9} cold!",
         for (int j = 0; j < end.length; j++) {
           interval = positions.next();
-          assertNotNull(interval);
+          assertNotNull("" + j, interval);
           assertEquals(start[j], interval.begin);
           assertEquals(end[j], interval.end);
         }
@@ -139,6 +140,7 @@ public class TestConjunctionPositionsIte
         int nextDoc = scorer.nextDoc();
         assertEquals(1, nextDoc);
         PositionIntervalIterator positions = scorer.positions();
+        assertEquals(1, positions.advanceTo(nextDoc));
         PositionInterval interval = null;
         int[] start = new int[] {0, 1, 3, 4, 5, 6, 7, 31, 32, 34 };
         int[] end = new int[] {5, 5, 5, 6, 7, 36, 36, 36, 36, 36 };

Added: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestDisjunctionPositionIterator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestDisjunctionPositionIterator.java?rev=1147171&view=auto
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestDisjunctionPositionIterator.java (added)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestDisjunctionPositionIterator.java Fri Jul 15 14:49:47 2011
@@ -0,0 +1,232 @@
+package org.apache.lucene.search.positions;
+
+import java.io.IOException;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.CorruptIndexException;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.Weight.ScorerContext;
+import org.apache.lucene.search.positions.PositionIntervalIterator.PositionInterval;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.ReaderUtil;
+
+public class TestDisjunctionPositionIterator extends LuceneTestCase {
+  private static final void addDocs(RandomIndexWriter writer)
+      throws CorruptIndexException, IOException {
+    {
+      Document doc = new Document();
+      doc.add(newField(
+          "field",
+          "Pease porridge hot! Pease porridge cold! Pease porridge in the pot nine days old! Some like it hot, some"
+              + " like it cold, Some like it in the pot nine days old! Pease porridge hot! Pease porridge cold!",
+          Field.Store.YES, Field.Index.ANALYZED));
+      writer.addDocument(doc);
+    }
+
+    {
+      Document doc = new Document();
+      doc.add(newField(
+          "field",
+          "Pease porridge cold! Pease porridge hot! Pease porridge in the pot nine days old! Some like it cold, some"
+              + " like it hot, Some like it in the pot nine days old! Pease porridge cold! Pease porridge hot!",
+          Field.Store.YES, Field.Index.ANALYZED));
+      writer.addDocument(doc);
+    }
+  }
+
+  public void testDisjunctionPositionsBooleanQuery() throws IOException {
+    Directory directory = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random, directory,
+        newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    addDocs(writer);
+
+    IndexReader reader = writer.getReader();
+    IndexSearcher searcher = new IndexSearcher(reader);
+    writer.close();
+    BooleanQuery query = new BooleanQuery();
+    query.add(new BooleanClause(new TermQuery(new Term("field", "porridge")),
+        Occur.SHOULD));
+    query.add(new BooleanClause(new TermQuery(new Term("field", "pease")),
+        Occur.SHOULD));
+    query.add(new BooleanClause(new TermQuery(new Term("field", "hot!")),
+        Occur.SHOULD));
+    {
+      PositionFilterQuery filter = new PositionFilterQuery(query,
+          new RangePositionsIterator(0, 3));
+      TopDocs search = searcher.search(filter, 10);
+      ScoreDoc[] scoreDocs = search.scoreDocs;
+      assertEquals(2, search.totalHits);
+      assertEquals(0, scoreDocs[0].doc);
+    }
+    {
+      PositionFilterQuery filter = new PositionFilterQuery(query,
+          new WithinPositionIterator(3));
+      TopDocs search = searcher.search(filter, 10);
+      ScoreDoc[] scoreDocs = search.scoreDocs;
+      assertEquals(2, search.totalHits);
+      assertEquals(0, scoreDocs[0].doc);
+      assertEquals(1, scoreDocs[1].doc);
+    }
+
+    searcher.close();
+    reader.close();
+    directory.close();
+  }
+
+  public void testBasic() throws IOException {
+    Directory directory = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random, directory,
+        newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    {
+      Document doc = new Document();
+      doc.add(newField("field", "the quick brown fox", Field.Store.YES,
+          Field.Index.ANALYZED));
+      writer.addDocument(doc);
+    }
+    {
+      Document doc = new Document();
+      doc.add(newField("field", "the brown quick fox", Field.Store.YES,
+          Field.Index.ANALYZED));
+      writer.addDocument(doc);
+    }
+
+    IndexReader reader = writer.getReader();
+    IndexSearcher searcher = new IndexSearcher(reader);
+    writer.close();
+    
+    BooleanQuery query = new BooleanQuery();
+    query.add(new BooleanClause(new TermQuery(new Term("field", "quick")),
+        Occur.SHOULD));
+    query.add(new BooleanClause(new TermQuery(new Term("field", "brown")),
+        Occur.SHOULD));
+    
+    Weight weight = query.createWeight(searcher);
+    ReaderContext topReaderContext = searcher.getTopReaderContext();
+    AtomicReaderContext[] leaves = ReaderUtil.leaves(topReaderContext);
+    assertEquals(1, leaves.length);
+    Scorer scorer = weight.scorer(leaves[0],
+        ScorerContext.def().topScorer(true).needsPositions(true));
+    
+    for (int i = 0; i < 2; i++) {
+
+      int nextDoc = scorer.nextDoc();
+      assertEquals(i, nextDoc);
+      PositionIntervalIterator positions = scorer.positions();
+      assertEquals(i, positions.advanceTo(nextDoc));
+      PositionInterval interval = positions.next();
+      assertEquals(1, interval.begin);
+      assertEquals(1, interval.end);
+
+      interval = positions.next();
+      assertEquals(2, interval.begin);
+      assertEquals(2, interval.end);
+      assertNull(positions.next());
+    }
+    reader.close();
+    searcher.close();
+    directory.close();
+    
+  }
+
+  public void testDisjunctionPositionIterator() throws IOException {
+    Directory directory = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random, directory,
+        newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    addDocs(writer);
+
+    IndexReader reader = writer.getReader();
+    IndexSearcher searcher = new IndexSearcher(reader);
+    writer.close();
+    BooleanQuery query1 = new BooleanQuery();
+    query1.add(new BooleanClause(new TermQuery(new Term("field", "porridge")),
+        Occur.MUST));
+    query1.add(new BooleanClause(new TermQuery(new Term("field", "pease")),
+        Occur.MUST));
+    query1.add(new BooleanClause(new TermQuery(new Term("field", "hot!")),
+        Occur.MUST));
+
+    BooleanQuery query2 = new BooleanQuery();
+    query2.add(new BooleanClause(new TermQuery(new Term("field", "pease")),
+        Occur.MUST));
+    query2.add(new BooleanClause(new TermQuery(new Term("field", "porridge")),
+        Occur.MUST));
+    query2.add(new BooleanClause(new TermQuery(new Term("field", "hot!")),
+        Occur.MUST));
+
+    BooleanQuery query = new BooleanQuery();
+    query.add(new BooleanClause(query1, Occur.SHOULD));
+    query.add(new BooleanClause(query2, Occur.SHOULD));
+    Weight weight = query.createWeight(searcher);
+    ReaderContext topReaderContext = searcher.getTopReaderContext();
+    AtomicReaderContext[] leaves = ReaderUtil.leaves(topReaderContext);
+    assertEquals(1, leaves.length);
+    for (int i = 0; i < leaves.length; i++) {
+      Scorer scorer = weight.scorer(leaves[0],
+          ScorerContext.def().topScorer(true).needsPositions(true));
+      {
+        int nextDoc = scorer.nextDoc();
+        assertEquals(0, nextDoc);
+        PositionIntervalIterator positions = scorer.positions();
+        assertEquals(0, positions.advanceTo(nextDoc));
+        PositionInterval interval = null;
+        int[] start = new int[] { 0, 1, 2, 3, 4, 6, 7, 31, 32, 33 };
+        int[] end = new int[] { 2, 3, 4, 33, 33, 33, 33, 33, 34, 35 };
+        // {start}term{end} - end is pos+1
+        // {0}Pease {1}porridge {2}hot!{0} {3}Pease{1} {4}porridge{2} cold!
+        // {5}Pease {6}porridge in the pot nine days old! Some like it hot,
+        // some"
+        // like it cold, Some like it in the pot nine days old! {7}Pease
+        // {8}porridge {9}hot!{3,4,5,6,7} Pease{8} porridge{9} cold!",
+        for (int j = 0; j < end.length; j++) {
+          interval = positions.next();
+          assertNotNull("" + j, interval);
+          assertEquals(start[j], interval.begin);
+          assertEquals(end[j], interval.end);
+        }
+        assertNull(positions.next());
+      }
+      {
+        int nextDoc = scorer.nextDoc();
+        assertEquals(1, nextDoc);
+        PositionIntervalIterator positions = scorer.positions();
+        assertEquals(1, positions.advanceTo(nextDoc));
+        PositionInterval interval = null;
+        int[] start = new int[] { 0, 1, 3, 4, 5, 6, 7, 31, 32, 34 };
+        int[] end = new int[] { 5, 5, 5, 6, 7, 36, 36, 36, 36, 36 };
+        // {start}term{end} - end is pos+1
+        // {0}Pease {1}porridge cold! {2}Pease {3}porridge {4}hot!{0, 1, 2, 3}
+        // {5}Pease {4, 6}porridge in the pot nine days old! Some like it cold,
+        // some
+        // like it hot, Some like it in the pot nine days old! {7}Pease
+        // {8}porridge cold! {9}Pease porridge hot{5, 6, 7, 8, 9}!
+        for (int j = 0; j < end.length; j++) {
+          interval = positions.next();
+          assertNotNull(interval);
+          assertEquals(j + "", start[j], interval.begin);
+          assertEquals(j + "", end[j], interval.end);
+        }
+        assertNull(positions.next());
+      }
+    }
+    searcher.close();
+    reader.close();
+    directory.close();
+  }
+}
+

Modified: lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestOrderedConjunctionPositionsIterator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestOrderedConjunctionPositionsIterator.java?rev=1147171&r1=1147170&r2=1147171&view=diff
==============================================================================
--- lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestOrderedConjunctionPositionsIterator.java (original)
+++ lucene/dev/branches/positions/lucene/src/test/org/apache/lucene/search/positions/TestOrderedConjunctionPositionsIterator.java Fri Jul 15 14:49:47 2011
@@ -126,6 +126,7 @@ public class TestOrderedConjunctionPosit
         int nextDoc = scorer.nextDoc();
         assertEquals(0, nextDoc);
         PositionIntervalIterator positions = new OrderedConjunctionPositionIterator(scorer.positions());
+        assertEquals(0, positions.advanceTo(nextDoc));
         PositionInterval interval = null;
         int[] start = new int[] {0, 31};
         int[] end = new int[] {2, 33};
@@ -146,6 +147,7 @@ public class TestOrderedConjunctionPosit
         int nextDoc = scorer.nextDoc();
         assertEquals(1, nextDoc);
         PositionIntervalIterator positions = new OrderedConjunctionPositionIterator(scorer.positions());
+        assertEquals(1, positions.advanceTo(nextDoc));
         PositionInterval interval = null;
         int[] start = new int[] {3, 34};
         int[] end = new int[] {5, 36};