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 08:52:37 UTC

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

Author: romseygeek
Date: Tue Feb 12 07:52:36 2013
New Revision: 1445045

URL: http://svn.apache.org/r1445045
Log:
LUCENE-2878: ConjunctionTermScorer implements next/start/endPosition()

Modified:
    lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionTermScorer.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/intervals/Interval.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/ConjunctionTermScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionTermScorer.java?rev=1445045&r1=1445044&r2=1445045&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionTermScorer.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/ConjunctionTermScorer.java Tue Feb 12 07:52:36 2013
@@ -36,6 +36,7 @@ class ConjunctionTermScorer extends Scor
   protected final DocsAndFreqs[] docsAndFreqs;
   private final DocsAndFreqs lead;
   private DocsAndFreqs[] origDocsAndFreqs;
+  final PositionQueue posQueue;
 
   ConjunctionTermScorer(Weight weight, float coord, DocsAndFreqs[] docsAndFreqs) {
     super(weight);
@@ -51,10 +52,18 @@ class ConjunctionTermScorer extends Scor
         return o1.docFreq - o2.docFreq;
       }
     });
-
+    posQueue = new PositionQueue(makeDocsEnumArray(docsAndFreqs));
     lead = docsAndFreqs[0]; // least frequent DocsEnum leads the intersection
   }
 
+  private DocsEnum[] makeDocsEnumArray(DocsAndFreqs[] docsAndFreqs) {
+    DocsEnum[] docsEnums = new DocsEnum[docsAndFreqs.length];
+    for (int i = 0; i < docsAndFreqs.length; i++) {
+      docsEnums[i] = docsAndFreqs[i].docs;
+    }
+    return docsEnums;
+  }
+
   private int doNext(int doc) throws IOException {
     do {
       if (lead.doc == DocIdSetIterator.NO_MORE_DOCS) {
@@ -71,6 +80,7 @@ class ConjunctionTermScorer extends Scor
           }
         }
         // success - all DocsEnums are on the same doc
+        posQueue.advanceTo(doc);
         return doc;
       } while (true);
       // advance head for next iteration
@@ -113,6 +123,31 @@ class ConjunctionTermScorer extends Scor
   }
 
   @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>(docsAndFreqs.length);
     for (DocsAndFreqs docs : docsAndFreqs) {

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=1445045&r1=1445044&r2=1445045&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 07:52:36 2013
@@ -21,23 +21,23 @@ import java.io.IOException;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-public class PositionQueue extends PriorityQueue<PositionQueue.ScorerRef> {
+public class PositionQueue extends PriorityQueue<PositionQueue.DocsEnumRef> {
 
-  class ScorerRef {
+  class DocsEnumRef {
 
-    public final Scorer scorer;
+    public final DocsEnum docsEnum;
     public Interval interval = new Interval();
 
-    public ScorerRef(Scorer scorer) {
-      this.scorer = scorer;
+    public DocsEnumRef(DocsEnum docsEnum) {
+      this.docsEnum = docsEnum;
     }
 
     public int nextPosition() throws IOException {
-      if (scorer.docID() == DocsEnum.NO_MORE_DOCS || scorer.docID() != docId
-            || scorer.nextPosition() == DocsEnum.NO_MORE_POSITIONS)
+      if (docsEnum.docID() == DocsEnum.NO_MORE_DOCS || docsEnum.docID() != docId
+            || docsEnum.nextPosition() == DocsEnum.NO_MORE_POSITIONS)
         interval.update(Interval.EXHAUSTED_INTERVAL);
       else
-        interval.update(this.scorer);
+        interval.update(this.docsEnum);
       return interval.begin;
     }
 
@@ -47,10 +47,10 @@ public class PositionQueue extends Prior
   Interval current = new Interval();
   int docId = -1;
 
-  public PositionQueue(Scorer[] subScorers) {
-    super(subScorers.length);
-    for (int i = 0; i < subScorers.length; i++) {
-      add(new ScorerRef(subScorers[i]));
+  public PositionQueue(DocsEnum[] subDocsEnums) {
+    super(subDocsEnums.length);
+    for (int i = 0; i < subDocsEnums.length; i++) {
+      add(new DocsEnumRef(subDocsEnums[i]));
     }
   }
 
@@ -58,7 +58,7 @@ public class PositionQueue extends Prior
     if (!positioned) {
       for (Object scorerRef : getHeapArray()) {
         if (scorerRef != null)
-          ((ScorerRef) scorerRef).nextPosition();
+          ((DocsEnumRef) scorerRef).nextPosition();
       }
       positioned = true;
       updateTop();
@@ -74,10 +74,10 @@ public class PositionQueue extends Prior
   }
 
   @Override
-  protected boolean lessThan(ScorerRef a, ScorerRef b) {
-    if (a.scorer.docID() < b.scorer.docID())
+  protected boolean lessThan(DocsEnumRef a, DocsEnumRef b) {
+    if (a.docsEnum.docID() < b.docsEnum.docID())
       return true;
-    if (a.scorer.docID() > b.scorer.docID())
+    if (a.docsEnum.docID() > b.docsEnum.docID())
       return false;
     return a.interval.begin < b.interval.begin;
   }

Modified: lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/intervals/Interval.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/intervals/Interval.java?rev=1445045&r1=1445044&r2=1445045&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/intervals/Interval.java (original)
+++ lucene/dev/branches/LUCENE-2878/lucene/core/src/java/org/apache/lucene/search/intervals/Interval.java Tue Feb 12 07:52:36 2013
@@ -17,7 +17,6 @@ package org.apache.lucene.search.interva
  */
 
 import org.apache.lucene.index.DocsEnum;
-import org.apache.lucene.search.Scorer;
 
 import java.io.IOException;
 
@@ -187,11 +186,11 @@ public class Interval implements Cloneab
         + end + "(" + offsetEnd + ")]";
   }
 
-  public void update(Scorer scorer) throws IOException {
-    offsetBegin = scorer.startOffset();
-    offsetEnd = scorer.endOffset();
-    begin = scorer.startPosition();
-    end = scorer.endPosition();
+  public void update(DocsEnum docsEnum) throws IOException {
+    offsetBegin = docsEnum.startOffset();
+    offsetEnd = docsEnum.endOffset();
+    begin = docsEnum.startPosition();
+    end = docsEnum.endPosition();
   }
 
   public void update(Interval interval) {

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=1445045&r1=1445044&r2=1445045&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 07:52:36 2013
@@ -160,6 +160,14 @@ public abstract class IntervalTestBase e
     return q;
   }
 
+  protected Query makeAndQuery(Query... queries) {
+    BooleanQuery q = new BooleanQuery();
+    for (Query subquery : queries) {
+      q.add(subquery, BooleanClause.Occur.MUST);
+    }
+    return q;
+  }
+
   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=1445045&r1=1445044&r2=1445045&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 07:52:36 2013
@@ -55,6 +55,25 @@ public class TestBasicIntervals extends 
       "v4 v2 v2 v4",//14
       "v3 v4 v3"};//15
 
+  public void testSimpleConjunction() throws IOException {
+    Query q = makeAndQuery(makeTermQuery("v2"), makeTermQuery("v4"));
+    checkIntervals(q, searcher, new int[][]{
+        { 13, 2, 2, 4, 4 },
+        { 14, 0, 0, 1, 1, 2, 2, 3, 3 }
+    });
+  }
+
+  /*
+  public void testNestedConjunctions() throws IOException {
+    Query q = makeAndQuery(makeTermQuery("v2"), makeOrQuery(makeTermQuery("v3"), makeTermQuery("v4")));
+    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");
     checkIntervals(q, searcher, new int[][]{