You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2013/02/12 13:33:11 UTC

svn commit: r1445138 - in /lucene/dev/branches/LUCENE-2878/lucene/core/src: java/org/apache/lucene/search/ test/org/apache/lucene/search/intervals/

Author: romseygeek
Date: Tue Feb 12 12:33:10 2013
New Revision: 1445138

URL: http://svn.apache.org/r1445138
Log:
ReqOptSumScorer implements next/start/endPosition()

Modified:
    lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java
    lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
    lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/PositionQueue.java
    lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
    lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/IntervalTestBase.java
    lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/TestBasicIntervals.java

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java Tue Feb 12 12:33:10 2013
@@ -152,6 +152,31 @@ class BooleanScorer2 extends Scorer {
     public IntervalIterator intervals(boolean collectIntervals) throws IOException {
       return scorer.intervals(collectIntervals);
     }
+
+    @Override
+    public int nextPosition() throws IOException {
+      return scorer.nextPosition();
+    }
+
+    @Override
+    public int startPosition() throws IOException {
+      return scorer.startPosition();
+    }
+
+    @Override
+    public int endPosition() throws IOException {
+      return scorer.endPosition();
+    }
+
+    @Override
+    public int startOffset() throws IOException {
+      return scorer.startOffset();
+    }
+
+    @Override
+    public int endOffset() throws IOException {
+      return scorer.endOffset();
+    }
   }
 
   private Scorer countingDisjunctionSumScorer(final List<Scorer> scorers,

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java Tue Feb 12 12:33:10 2013
@@ -17,21 +17,22 @@ package org.apache.lucene.search;
  * limitations under the License.
  */
 
+import org.apache.lucene.search.intervals.ConjunctionIntervalIterator;
+import org.apache.lucene.search.intervals.IntervalIterator;
+import org.apache.lucene.util.ArrayUtil;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
 
-import org.apache.lucene.search.intervals.ConjunctionIntervalIterator;
-import org.apache.lucene.search.intervals.IntervalIterator;
-import org.apache.lucene.util.ArrayUtil;
-
 /** Scorer for conjunctions, sets of queries, all of which are required. */
 class ConjunctionScorer extends Scorer {
   
   private final Scorer[] scorersOrdered;
   private final Scorer[] scorers;
   private int lastDoc = -1;
+  final PositionQueue posQueue;
 
   public ConjunctionScorer(Weight weight, Collection<Scorer> scorers) throws IOException {
     this(weight, scorers.toArray(new Scorer[scorers.size()]));
@@ -42,6 +43,7 @@ class ConjunctionScorer extends Scorer {
     scorersOrdered = new Scorer[scorers.length];
     System.arraycopy(scorers, 0, scorersOrdered, 0, scorers.length);
     this.scorers = scorers;
+    posQueue = new PositionQueue(scorers);
     
     for (int i = 0; i < scorers.length; i++) {
       if (scorers[i].nextDoc() == NO_MORE_DOCS) {
@@ -105,6 +107,7 @@ class ConjunctionScorer extends Scorer {
       doc = firstScorer.advance(doc);
       first = first == scorers.length - 1 ? 0 : first + 1;
     }
+    posQueue.advanceTo(doc);
     return doc;
   }
   
@@ -160,6 +163,31 @@ class ConjunctionScorer extends Scorer {
   }
 
   @Override
+  public int nextPosition() throws IOException {
+    return posQueue.nextPosition();
+  }
+
+  @Override
+  public int startPosition() throws IOException {
+    return posQueue.startPosition();
+  }
+
+  @Override
+  public int endPosition() throws IOException {
+    return posQueue.endPosition();
+  }
+
+  @Override
+  public int startOffset() throws IOException {
+    return posQueue.startOffset();
+  }
+
+  @Override
+  public int endOffset() throws IOException {
+    return posQueue.endOffset();
+  }
+
+  @Override
   public Collection<ChildScorer> getChildren() {
     ArrayList<ChildScorer> children = new ArrayList<ChildScorer>(scorers.length);
     for (Scorer scorer : scorers) {

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/PositionQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/PositionQueue.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/PositionQueue.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/PositionQueue.java Tue Feb 12 12:33:10 2013
@@ -47,7 +47,7 @@ public class PositionQueue extends Prior
   Interval current = new Interval();
   int docId = -1;
 
-  public PositionQueue(DocsEnum[] subDocsEnums) {
+  public PositionQueue(DocsEnum... subDocsEnums) {
     super(subDocsEnums.length);
     for (int i = 0; i < subDocsEnums.length; i++) {
       add(new DocsEnumRef(subDocsEnums[i]));

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java Tue Feb 12 12:33:10 2013
@@ -34,6 +34,7 @@ class ReqOptSumScorer extends Scorer {
    */
   private Scorer reqScorer;
   private Scorer optScorer;
+  private PositionQueue posQueue;
 
   /** Construct a <code>ReqOptScorer</code>.
    * @param reqScorer The required scorer. This must match.
@@ -48,16 +49,21 @@ class ReqOptSumScorer extends Scorer {
     assert optScorer != null;
     this.reqScorer = reqScorer;
     this.optScorer = optScorer;
+    posQueue = new PositionQueue(reqScorer, optScorer);
   }
 
   @Override
   public int nextDoc() throws IOException {
-    return reqScorer.nextDoc();
+    int doc = reqScorer.nextDoc();
+    posQueue.advanceTo(doc);
+    return doc;
   }
   
   @Override
   public int advance(int target) throws IOException {
-    return reqScorer.advance(target);
+    int doc = reqScorer.advance(target);
+    posQueue.advanceTo(doc);
+    return doc;
   }
   
   @Override
@@ -101,6 +107,34 @@ class ReqOptSumScorer extends Scorer {
   }
 
   @Override
+  public int nextPosition() throws IOException {
+    int optDoc = optScorer.docID();
+    if (optDoc < reqScorer.docID())
+      optScorer.advance(reqScorer.docID());
+    return posQueue.nextPosition();
+  }
+
+  @Override
+  public int startPosition() throws IOException {
+    return posQueue.startPosition();
+  }
+
+  @Override
+  public int endPosition() throws IOException {
+    return posQueue.endPosition();
+  }
+
+  @Override
+  public int startOffset() throws IOException {
+    return posQueue.startOffset();
+  }
+
+  @Override
+  public int endOffset() throws IOException {
+    return posQueue.endOffset();
+  }
+
+  @Override
   public Collection<ChildScorer> getChildren() {
     ArrayList<ChildScorer> children = new ArrayList<ChildScorer>(2);
     children.add(new ChildScorer(reqScorer, "MUST"));

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/IntervalTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/IntervalTestBase.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/IntervalTestBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/IntervalTestBase.java Tue Feb 12 12:33:10 2013
@@ -106,7 +106,7 @@ public abstract class IntervalTestBase e
         String expectation = "Expected match at docid " + docid + ", position " + expectedDocMatches[j];
         Assert.assertTrue(expectation, matchIt.hasNext());
         Interval match = matchIt.next();
-        System.err.println(match);
+        System.err.println(docid + ":" + match);
         Assert.assertEquals("Incorrect docid", matches[i].doc, docid);
         Assert.assertEquals("Incorrect match start position", expectedDocMatches[j], match.begin);
         Assert.assertEquals("Incorrect match end position", expectedDocMatches[j + 1], match.end);
@@ -168,6 +168,18 @@ public abstract class IntervalTestBase e
     return q;
   }
 
+  protected Query makeBooleanQuery(BooleanClause... clauses) {
+    BooleanQuery q = new BooleanQuery();
+    for (BooleanClause clause : clauses) {
+      q.add(clause);
+    }
+    return q;
+  }
+
+  protected BooleanClause makeBooleanClause(String text, BooleanClause.Occur occur) {
+    return new BooleanClause(makeTermQuery(text), occur);
+  }
+
   public static class Match implements Comparable<TestDisjunctionIntervalIterator.Match> {
 
     public final int docid;

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/TestBasicIntervals.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/TestBasicIntervals.java?rev=1445138&r1=1445137&r2=1445138&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/TestBasicIntervals.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/test/org/apache/lucene/search/intervals/TestBasicIntervals.java Tue Feb 12 12:33:10 2013
@@ -20,6 +20,7 @@ package org.apache.lucene.search.interva
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.Query;
 
 import java.io.IOException;
@@ -63,7 +64,6 @@ public class TestBasicIntervals extends 
     });
   }
 
-  /*
   public void testNestedConjunctions() throws IOException {
     Query q = makeAndQuery(makeTermQuery("v2"), makeOrQuery(makeTermQuery("v3"), makeTermQuery("v4")));
     checkIntervals(q, searcher, new int[][]{
@@ -72,7 +72,17 @@ public class TestBasicIntervals extends 
         { 14, 0, 0, 1, 1, 2, 2, 3, 3 }
     });
   }
-  */
+
+  public void testSingleRequiredManyOptional() throws IOException {
+    Query q = makeBooleanQuery(makeBooleanClause("v2", BooleanClause.Occur.MUST),
+                               makeBooleanClause("v3", BooleanClause.Occur.SHOULD),
+                               makeBooleanClause("v4", BooleanClause.Occur.SHOULD));
+    checkIntervals(q, searcher, new int[][]{
+        { 12, 1, 1, 2, 2 },
+        { 13, 1, 1, 2, 2, 3, 3, 4, 4 },
+        { 14, 0, 0, 1, 1, 2, 2, 3, 3 }
+    });
+  }
 
   public void testSimpleTerm() throws IOException {
     Query q = makeTermQuery("u2");