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 2015/04/12 20:28:05 UTC

svn commit: r1673037 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/search/spans/ lucene/core/src/test/org/apache/lucene/search/spans/ lucene/test-framework/ lucene/test-framework/src/java/org/apache...

Author: rmuir
Date: Sun Apr 12 18:28:04 2015
New Revision: 1673037

URL: http://svn.apache.org/r1673037
Log:
LUCENE-6418, LUCENE-6411: add AssertingSpans and fix the bugs it found

Added:
    lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/search/spans/
      - copied from r1673036, lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/spans/
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/Spans.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java
    lucene/dev/branches/branch_5x/lucene/test-framework/   (props changed)

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java?rev=1673037&r1=1673036&r2=1673037&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java Sun Apr 12 18:28:04 2015
@@ -122,25 +122,30 @@ public class SpanNotQuery extends SpanQu
     return new FilterSpans(includeSpans) {
       // last document we have checked matches() against for the exclusion, and failed
       // when using approximations, so we don't call it again, and pass thru all inclusions.
-      int lastNonMatchingDoc = -1;
+      int lastApproxDoc = -1;
+      boolean lastApproxResult = false;
       
       @Override
       protected AcceptStatus accept(Spans candidate) throws IOException {
+        // TODO: this logic is ugly and sneaky, can we clean it up?
         int doc = candidate.docID();
         if (doc > excludeSpans.docID()) {
           // catch up 'exclude' to the current doc
           if (excludeTwoPhase != null) {
             if (excludeApproximation.advance(doc) == doc) {
-              if (!excludeTwoPhase.matches()) {
-                lastNonMatchingDoc = doc; // mark as non-match
-              }
+              lastApproxDoc = doc;
+              lastApproxResult = excludeTwoPhase.matches();
             }
           } else {
             excludeSpans.advance(doc);
           }
+        } else if (excludeTwoPhase != null && doc == excludeSpans.docID() && doc != lastApproxDoc) {
+          // excludeSpans already sitting on our candidate doc, but matches not called yet.
+          lastApproxDoc = doc;
+          lastApproxResult = excludeTwoPhase.matches();
         }
         
-        if (doc == lastNonMatchingDoc || doc != excludeSpans.docID()) {
+        if (doc != excludeSpans.docID() || (doc == lastApproxDoc && lastApproxResult == false)) {
           return AcceptStatus.YES;
         }
         

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/Spans.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/Spans.java?rev=1673037&r1=1673036&r2=1673037&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/Spans.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/Spans.java Sun Apr 12 18:28:04 2015
@@ -97,4 +97,16 @@ public abstract class Spans extends DocI
   public TwoPhaseIterator asTwoPhaseIterator() {
     return null;
   }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    Class<? extends Spans> clazz = getClass();
+    sb.append(clazz.isAnonymousClass() ? clazz.getName() : clazz.getSimpleName());
+    sb.append("(doc=").append(docID());
+    sb.append(",start=").append(startPosition());
+    sb.append(",end=").append(endPosition());
+    sb.append(")");
+    return sb.toString();
+  }
 }

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java?rev=1673037&r1=1673036&r2=1673037&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestBasics.java Sun Apr 12 18:28:04 2015
@@ -341,7 +341,7 @@ public class TestBasics extends LuceneTe
     assertTrue(searcher.explain(query, 891).getValue() > 0.0f);
   }
 
-  @Test @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/LUCENE-6418")
+  @Test
   public void testNpeInSpanNearInSpanFirstInSpanNot() throws Exception {
     int n = 5;
     SpanTermQuery hun = new SpanTermQuery(new Term("field", "hundred"));

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java?rev=1673037&r1=1673036&r2=1673037&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java Sun Apr 12 18:28:04 2015
@@ -33,11 +33,20 @@ public class TestSpanSearchEquivalence e
   // TODO: we could go a little crazy for a lot of these,
   // but these are just simple minimal cases in case something 
   // goes horribly wrong. Put more intense tests elsewhere.
+  
+  /** generally wrap with asserting. but not always, so we don't hide bugs */
+  private SpanQuery span(SpanQuery query) {
+    if (random().nextInt(100) <= 95) {
+      return new AssertingSpanQuery(query);
+    } else {
+      return query;
+    }
+  }
 
   /** SpanTermQuery(A) = TermQuery(A) */
   public void testSpanTermVersusTerm() throws Exception {
     Term t1 = randomTerm();
-    assertSameSet(new TermQuery(t1), new SpanTermQuery(t1));
+    assertSameSet(new TermQuery(t1), span(new SpanTermQuery(t1)));
   }
   
   /** SpanOrQuery(A, B) = (A B) */
@@ -47,7 +56,7 @@ public class TestSpanSearchEquivalence e
     BooleanQuery q1 = new BooleanQuery();
     q1.add(new TermQuery(t1), Occur.SHOULD);
     q1.add(new TermQuery(t2), Occur.SHOULD);
-    SpanOrQuery q2 = new SpanOrQuery(new SpanTermQuery(t1), new SpanTermQuery(t2));
+    SpanQuery q2 = span(new SpanOrQuery(span(new SpanTermQuery(t1)), span(new SpanTermQuery(t2))));
     assertSameSet(q1, q2);
   }
   
@@ -55,7 +64,8 @@ public class TestSpanSearchEquivalence e
   public void testSpanNotVersusSpanTerm() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    assertSubsetOf(new SpanNotQuery(new SpanTermQuery(t1), new SpanTermQuery(t2)), new SpanTermQuery(t1));
+    assertSubsetOf(span(new SpanNotQuery(span(new SpanTermQuery(t1)), span(new SpanTermQuery(t2)))), 
+                   span(new SpanTermQuery(t1)));
   }
   
   /** SpanNotQuery(A, [B C]) ⊆ SpanTermQuery(A) */
@@ -63,8 +73,11 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     Term t2 = randomTerm();
     Term t3 = randomTerm();
-    SpanQuery near = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(t2), new SpanTermQuery(t3) }, 10, random().nextBoolean());
-    assertSubsetOf(new SpanNotQuery(new SpanTermQuery(t1), near), new SpanTermQuery(t1));
+    SpanQuery near = span(new SpanNearQuery(new SpanQuery[] { 
+                                              span(new SpanTermQuery(t2)), 
+                                              span(new SpanTermQuery(t3)) 
+                                            }, 10, random().nextBoolean()));
+    assertSubsetOf(span(new SpanNotQuery(span(new SpanTermQuery(t1)), near)), span(new SpanTermQuery(t1)));
   }
   
   /** SpanNotQuery([A B], C) ⊆ SpanNearQuery([A B]) */
@@ -72,8 +85,11 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     Term t2 = randomTerm();
     Term t3 = randomTerm();
-    SpanQuery near = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }, 10, random().nextBoolean());
-    assertSubsetOf(new SpanNotQuery(near, new SpanTermQuery(t3)), near);
+    SpanQuery near = span(new SpanNearQuery(new SpanQuery[] { 
+                                              span(new SpanTermQuery(t1)), 
+                                              span(new SpanTermQuery(t2)) 
+                                            }, 10, random().nextBoolean()));
+    assertSubsetOf(span(new SpanNotQuery(near, span(new SpanTermQuery(t3)))), near);
   }
   
   /** SpanNotQuery([A B], [C D]) ⊆ SpanNearQuery([A B]) */
@@ -82,23 +98,33 @@ public class TestSpanSearchEquivalence e
     Term t2 = randomTerm();
     Term t3 = randomTerm();
     Term t4 = randomTerm();
-    SpanQuery near1 = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }, 10, random().nextBoolean());
-    SpanQuery near2 = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(t3), new SpanTermQuery(t4) }, 10, random().nextBoolean());
-    assertSubsetOf(new SpanNotQuery(near1, near2), near1);
+    SpanQuery near1 = span(new SpanNearQuery(new SpanQuery[] { 
+                                               span(new SpanTermQuery(t1)), 
+                                               span(new SpanTermQuery(t2)) 
+                                             }, 10, random().nextBoolean()));
+    SpanQuery near2 = span(new SpanNearQuery(new SpanQuery[] { 
+                                               span(new SpanTermQuery(t3)), 
+                                               span(new SpanTermQuery(t4)) 
+                                             }, 10, random().nextBoolean()));
+    assertSubsetOf(span(new SpanNotQuery(near1, near2)), near1);
   }
   
   /** SpanFirstQuery(A, 10) ⊆ SpanTermQuery(A) */
   public void testSpanFirstVersusSpanTerm() throws Exception {
     Term t1 = randomTerm();
-    assertSubsetOf(new SpanFirstQuery(new SpanTermQuery(t1), 10), new SpanTermQuery(t1));
+    assertSubsetOf(span(new SpanFirstQuery(span(new SpanTermQuery(t1)), 10)), 
+                   span(new SpanTermQuery(t1)));
   }
   
   /** SpanNearQuery([A, B], 0, true) = "A B" */
   public void testSpanNearVersusPhrase() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanNearQuery q1 = new SpanNearQuery(subquery, 0, true);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery q1 = span(new SpanNearQuery(subquery, 0, true));
     PhraseQuery q2 = new PhraseQuery();
     q2.add(t1);
     q2.add(t2);
@@ -109,8 +135,11 @@ public class TestSpanSearchEquivalence e
   public void testSpanNearVersusBooleanAnd() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanNearQuery q1 = new SpanNearQuery(subquery, Integer.MAX_VALUE, false);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery q1 = span(new SpanNearQuery(subquery, Integer.MAX_VALUE, false));
     BooleanQuery q2 = new BooleanQuery();
     q2.add(new TermQuery(t1), Occur.MUST);
     q2.add(new TermQuery(t2), Occur.MUST);
@@ -121,9 +150,12 @@ public class TestSpanSearchEquivalence e
   public void testSpanNearVersusSloppySpanNear() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanNearQuery q1 = new SpanNearQuery(subquery, 0, false);
-    SpanNearQuery q2 = new SpanNearQuery(subquery, 1, false);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery q1 = span(new SpanNearQuery(subquery, 0, false));
+    SpanQuery q2 = span(new SpanNearQuery(subquery, 1, false));
     assertSubsetOf(q1, q2);
   }
   
@@ -131,9 +163,12 @@ public class TestSpanSearchEquivalence e
   public void testSpanNearInOrderVersusOutOfOrder() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanNearQuery q1 = new SpanNearQuery(subquery, 3, true);
-    SpanNearQuery q2 = new SpanNearQuery(subquery, 3, false);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery q1 = span(new SpanNearQuery(subquery, 3, true));
+    SpanQuery q2 = span(new SpanNearQuery(subquery, 3, false));
     assertSubsetOf(q1, q2);
   }
   
@@ -141,10 +176,13 @@ public class TestSpanSearchEquivalence e
   public void testSpanNearIncreasingSloppiness() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
     for (int i = 0; i < 10; i++) {
-      SpanNearQuery q1 = new SpanNearQuery(subquery, i, false);
-      SpanNearQuery q2 = new SpanNearQuery(subquery, i+1, false);
+      SpanQuery q1 = span(new SpanNearQuery(subquery, i, false));
+      SpanQuery q2 = span(new SpanNearQuery(subquery, i+1, false));
       assertSubsetOf(q1, q2);
     }
   }
@@ -154,10 +192,14 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     Term t2 = randomTerm();
     Term t3 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2), new SpanTermQuery(t3) };
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)), 
+                             span(new SpanTermQuery(t3)) 
+                           };
     for (int i = 0; i < 10; i++) {
-      SpanNearQuery q1 = new SpanNearQuery(subquery, i, false);
-      SpanNearQuery q2 = new SpanNearQuery(subquery, i+1, false);
+      SpanQuery q1 = span(new SpanNearQuery(subquery, i, false));
+      SpanQuery q2 = span(new SpanNearQuery(subquery, i+1, false));
       assertSubsetOf(q1, q2);
     }
   }
@@ -166,10 +208,13 @@ public class TestSpanSearchEquivalence e
   public void testSpanNearIncreasingOrderedSloppiness() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
     for (int i = 0; i < 10; i++) {
-      SpanNearQuery q1 = new SpanNearQuery(subquery, i, false);
-      SpanNearQuery q2 = new SpanNearQuery(subquery, i+1, false);
+      SpanQuery q1 = span(new SpanNearQuery(subquery, i, false));
+      SpanQuery q2 = span(new SpanNearQuery(subquery, i+1, false));
       assertSubsetOf(q1, q2);
     }
   }
@@ -179,10 +224,14 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     Term t2 = randomTerm();
     Term t3 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2), new SpanTermQuery(t3) };
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)), 
+                             span(new SpanTermQuery(t3)) 
+                           };
     for (int i = 0; i < 10; i++) {
-      SpanNearQuery q1 = new SpanNearQuery(subquery, i, true);
-      SpanNearQuery q2 = new SpanNearQuery(subquery, i+1, true);
+      SpanQuery q1 = span(new SpanNearQuery(subquery, i, true));
+      SpanQuery q2 = span(new SpanNearQuery(subquery, i+1, true));
       assertSubsetOf(q1, q2);
     }
   }
@@ -192,7 +241,7 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     for (int i = 0; i < 5; i++) {
       for (int j = 0; j < 5; j++) {
-        Query q1 = new SpanPositionRangeQuery(new SpanTermQuery(t1), i, i+j);
+        Query q1 = span(new SpanPositionRangeQuery(span(new SpanTermQuery(t1)), i, i+j));
         Query q2 = new TermQuery(t1);
         assertSubsetOf(q1, q2);
       }
@@ -204,8 +253,8 @@ public class TestSpanSearchEquivalence e
     Term t1 = randomTerm();
     for (int i = 0; i < 5; i++) {
       for (int j = 0; j < 5; j++) {
-        Query q1 = new SpanPositionRangeQuery(new SpanTermQuery(t1), i, i+j);
-        Query q2 = new SpanPositionRangeQuery(new SpanTermQuery(t1), i, i+j+1);
+        Query q1 = span(new SpanPositionRangeQuery(span(new SpanTermQuery(t1)), i, i+j));
+        Query q2 = span(new SpanPositionRangeQuery(span(new SpanTermQuery(t1)), i, i+j+1));
         assertSubsetOf(q1, q2);
       }
     }
@@ -214,7 +263,7 @@ public class TestSpanSearchEquivalence e
   /** SpanPositionRangeQuery(A, 0, ∞) = TermQuery(A) */
   public void testSpanRangeTermEverything() throws Exception {
     Term t1 = randomTerm();
-    Query q1 = new SpanPositionRangeQuery(new SpanTermQuery(t1), 0, Integer.MAX_VALUE);
+    Query q1 = span(new SpanPositionRangeQuery(span(new SpanTermQuery(t1)), 0, Integer.MAX_VALUE));
     Query q2 = new TermQuery(t1);
     assertSameSet(q1, q2);
   }
@@ -223,11 +272,14 @@ public class TestSpanSearchEquivalence e
   public void testSpanRangeNear() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
     for (int i = 0; i < 5; i++) {
       for (int j = 0; j < 5; j++) {
-        Query q1 = new SpanPositionRangeQuery(nearQuery, i, i+j);
+        Query q1 = span(new SpanPositionRangeQuery(nearQuery, i, i+j));
         Query q2 = nearQuery;
         assertSubsetOf(q1, q2);
       }
@@ -238,12 +290,15 @@ public class TestSpanSearchEquivalence e
   public void testSpanRangeNearIncreasingEnd() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
     for (int i = 0; i < 5; i++) {
       for (int j = 0; j < 5; j++) {
-        Query q1 = new SpanPositionRangeQuery(nearQuery, i, i+j);
-        Query q2 = new SpanPositionRangeQuery(nearQuery, i, i+j+1);
+        Query q1 = span(new SpanPositionRangeQuery(nearQuery, i, i+j));
+        Query q2 = span(new SpanPositionRangeQuery(nearQuery, i, i+j+1));
         assertSubsetOf(q1, q2);
       }
     }
@@ -253,9 +308,12 @@ public class TestSpanSearchEquivalence e
   public void testSpanRangeNearEverything() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
-    Query q1 = new SpanPositionRangeQuery(nearQuery, 0, Integer.MAX_VALUE);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
+    Query q1 = span(new SpanPositionRangeQuery(nearQuery, 0, Integer.MAX_VALUE));
     Query q2 = nearQuery;
     assertSameSet(q1, q2);
   }
@@ -264,7 +322,7 @@ public class TestSpanSearchEquivalence e
   public void testSpanFirstTerm() throws Exception {
     Term t1 = randomTerm();
     for (int i = 0; i < 10; i++) {
-      Query q1 = new SpanFirstQuery(new SpanTermQuery(t1), i);
+      Query q1 = span(new SpanFirstQuery(span(new SpanTermQuery(t1)), i));
       Query q2 = new TermQuery(t1);
       assertSubsetOf(q1, q2);
     }
@@ -274,8 +332,8 @@ public class TestSpanSearchEquivalence e
   public void testSpanFirstTermIncreasing() throws Exception {
     Term t1 = randomTerm();
     for (int i = 0; i < 10; i++) {
-      Query q1 = new SpanFirstQuery(new SpanTermQuery(t1), i);
-      Query q2 = new SpanFirstQuery(new SpanTermQuery(t1), i+1);
+      Query q1 = span(new SpanFirstQuery(span(new SpanTermQuery(t1)), i));
+      Query q2 = span(new SpanFirstQuery(span(new SpanTermQuery(t1)), i+1));
       assertSubsetOf(q1, q2);
     }
   }
@@ -283,7 +341,7 @@ public class TestSpanSearchEquivalence e
   /** SpanFirstQuery(A, ∞) = TermQuery(A) */
   public void testSpanFirstTermEverything() throws Exception {
     Term t1 = randomTerm();
-    Query q1 = new SpanFirstQuery(new SpanTermQuery(t1), Integer.MAX_VALUE);
+    Query q1 = span(new SpanFirstQuery(span(new SpanTermQuery(t1)), Integer.MAX_VALUE));
     Query q2 = new TermQuery(t1);
     assertSameSet(q1, q2);
   }
@@ -292,10 +350,13 @@ public class TestSpanSearchEquivalence e
   public void testSpanFirstNear() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
     for (int i = 0; i < 10; i++) {
-      Query q1 = new SpanFirstQuery(nearQuery, i);
+      Query q1 = span(new SpanFirstQuery(nearQuery, i));
       Query q2 = nearQuery;
       assertSubsetOf(q1, q2);
     }
@@ -305,11 +366,14 @@ public class TestSpanSearchEquivalence e
   public void testSpanFirstNearIncreasing() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
     for (int i = 0; i < 10; i++) {
-      Query q1 = new SpanFirstQuery(nearQuery, i);
-      Query q2 = new SpanFirstQuery(nearQuery, i+1);
+      Query q1 = span(new SpanFirstQuery(nearQuery, i));
+      Query q2 = span(new SpanFirstQuery(nearQuery, i+1));
       assertSubsetOf(q1, q2);
     }
   }
@@ -318,9 +382,12 @@ public class TestSpanSearchEquivalence e
   public void testSpanFirstNearEverything() throws Exception {
     Term t1 = randomTerm();
     Term t2 = randomTerm();
-    SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) };
-    SpanQuery nearQuery = new SpanNearQuery(subquery, 10, true);
-    Query q1 = new SpanFirstQuery(nearQuery, Integer.MAX_VALUE);
+    SpanQuery subquery[] = new SpanQuery[] { 
+                             span(new SpanTermQuery(t1)), 
+                             span(new SpanTermQuery(t2)) 
+                           };
+    SpanQuery nearQuery = span(new SpanNearQuery(subquery, 10, true));
+    Query q1 = span(new SpanFirstQuery(nearQuery, Integer.MAX_VALUE));
     Query q2 = nearQuery;
     assertSameSet(q1, q2);
   }