You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by yo...@apache.org on 2006/12/12 20:52:04 UTC

svn commit: r486295 - in /lucene/java/trunk/src: java/org/apache/lucene/search/spans/SpanOrQuery.java test/org/apache/lucene/search/spans/TestSpans.java

Author: yonik
Date: Tue Dec 12 11:52:03 2006
New Revision: 486295

URL: http://svn.apache.org/viewvc?view=rev&rev=486295
Log:
SpanOrQuery simplification and test: LUCENE-742

Modified:
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java
    lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestSpans.java

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java?view=diff&rev=486295&r1=486294&r2=486295
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java Tue Dec 12 11:52:03 2006
@@ -133,6 +133,7 @@
     return h;
   }
 
+
   private class SpanQueue extends PriorityQueue {
     public SpanQueue(int size) {
       initialize(size);
@@ -159,66 +160,51 @@
       return ((SpanQuery)clauses.get(0)).getSpans(reader);
 
     return new Spans() {
-        private List all = new ArrayList(clauses.size());
-        private SpanQueue queue = new SpanQueue(clauses.size());
+        private SpanQueue queue = null;
 
-        {
+        private boolean initSpanQueue(int target) throws IOException {
+          queue = new SpanQueue(clauses.size());
           Iterator i = clauses.iterator();
-          while (i.hasNext()) {                   // initialize all
-            all.add(((SpanQuery)i.next()).getSpans(reader));
+          while (i.hasNext()) {
+            Spans spans = ((SpanQuery)i.next()).getSpans(reader);
+            if (   ((target == -1) && spans.next())
+                || ((target != -1) && spans.skipTo(target))) {
+              queue.put(spans);
+            }
           }
+          return queue.size() != 0;
         }
 
-        private boolean firstTime = true;
-
         public boolean next() throws IOException {
-          if (firstTime) {                        // first time -- initialize
-            for (int i = 0; i < all.size(); i++) {
-              Spans spans = (Spans)all.get(i);
-              if (spans.next()) {                 // move to first entry
-                queue.put(spans);                 // build queue
-              } else {
-                all.remove(i--);
-              }
-            }
-            firstTime = false;
-            return queue.size() != 0;
+          if (queue == null) {
+            return initSpanQueue(-1);
           }
 
-          if (queue.size() == 0) {                // all done
+          if (queue.size() == 0) { // all done
             return false;
           }
 
-          if (top().next()) {                     // move to next
+          if (top().next()) { // move to next
             queue.adjustTop();
             return true;
           }
 
-          all.remove(queue.pop());                // exhausted a clause
-
+          queue.pop();  // exhausted a clause
           return queue.size() != 0;
         }
 
         private Spans top() { return (Spans)queue.top(); }
 
         public boolean skipTo(int target) throws IOException {
-          if (firstTime) {
-            for (int i = 0; i < all.size(); i++) {
-              Spans spans = (Spans)all.get(i);
-              if (spans.skipTo(target)) {         // skip each spans in all
-                queue.put(spans);                 // build queue
-              } else {
-                all.remove(i--);
-              }
-            }
-            firstTime = false;
-          } else {
-            while (queue.size() != 0 && top().doc() < target) {
-              if (top().skipTo(target)) {
-                queue.adjustTop();
-              } else {
-                all.remove(queue.pop());
-              }
+          if (queue == null) {
+            return initSpanQueue(target);
+          }
+
+          while (queue.size() != 0 && top().doc() < target) {
+            if (top().skipTo(target)) {
+              queue.adjustTop();
+            } else {
+              queue.pop();
             }
           }
 
@@ -231,7 +217,7 @@
 
         public String toString() {
           return "spans("+SpanOrQuery.this+")@"+
-            (firstTime?"START"
+            ((queue == null)?"START"
              :(queue.size()>0?(doc()+":"+start()+"-"+end()):"END"));
         }
 

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestSpans.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestSpans.java?view=diff&rev=486295&r1=486294&r2=486295
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestSpans.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestSpans.java Tue Dec 12 11:52:03 2006
@@ -190,4 +190,70 @@
     assertFalse("third range", spans.next());
   }
 
+
+  private Spans orSpans(String[] terms) throws Exception {
+    SpanQuery[] sqa = new SpanQuery[terms.length];
+    for (int i = 0; i < terms.length; i++) {
+      sqa[i] = makeSpanTermQuery(terms[i]);
+    }
+    return (new SpanOrQuery(sqa)).getSpans(searcher.getIndexReader());
+  }
+
+  private void tstNextSpans(Spans spans, int doc, int start, int end)
+  throws Exception {
+    assertTrue("next", spans.next());
+    assertEquals("doc", doc, spans.doc());
+    assertEquals("start", start, spans.start());
+    assertEquals("end", end, spans.end());
+  }
+
+  public void testSpanOrEmpty() throws Exception {
+    Spans spans = orSpans(new String[0]);
+    assertFalse("empty next", spans.next());
+  }
+
+  public void testSpanOrSingle() throws Exception {
+    Spans spans = orSpans(new String[] {"w5"});
+    tstNextSpans(spans, 0, 4, 5);
+    assertFalse("final next", spans.next());
+  }
+  
+  public void testSpanOrDouble() throws Exception {
+    Spans spans = orSpans(new String[] {"w5", "yy"});
+    tstNextSpans(spans, 0, 4, 5);
+    tstNextSpans(spans, 2, 3, 4);
+    tstNextSpans(spans, 3, 4, 5);
+    tstNextSpans(spans, 7, 3, 4);
+    assertFalse("final next", spans.next());
+  }
+
+  public void testSpanOrDoubleSkip() throws Exception {
+    Spans spans = orSpans(new String[] {"w5", "yy"});
+    assertTrue("initial skipTo", spans.skipTo(3));
+    assertEquals("doc", 3, spans.doc());
+    assertEquals("start", 4, spans.start());
+    assertEquals("end", 5, spans.end());
+    tstNextSpans(spans, 7, 3, 4);
+    assertFalse("final next", spans.next());
+  }
+
+  public void testSpanOrUnused() throws Exception {
+    Spans spans = orSpans(new String[] {"w5", "unusedTerm", "yy"});
+    tstNextSpans(spans, 0, 4, 5);
+    tstNextSpans(spans, 2, 3, 4);
+    tstNextSpans(spans, 3, 4, 5);
+    tstNextSpans(spans, 7, 3, 4);
+    assertFalse("final next", spans.next());
+  }
+
+  public void testSpanOrTripleSameDoc() throws Exception {
+    Spans spans = orSpans(new String[] {"t1", "t2", "t3"});
+    tstNextSpans(spans, 11, 0, 1);
+    tstNextSpans(spans, 11, 1, 2);
+    tstNextSpans(spans, 11, 2, 3);
+    tstNextSpans(spans, 11, 3, 4);
+    tstNextSpans(spans, 11, 4, 5);
+    tstNextSpans(spans, 11, 5, 6);
+    assertFalse("final next", spans.next());
+  }
 }