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 ma...@apache.org on 2009/08/04 21:10:03 UTC

svn commit: r800925 - in /lucene/java/trunk: ./ contrib/regex/src/java/org/apache/lucene/search/regex/ src/java/org/apache/lucene/search/payloads/ src/java/org/apache/lucene/search/spans/ src/test/org/apache/lucene/search/ src/test/org/apache/lucene/se...

Author: markrmiller
Date: Tue Aug  4 19:10:02 2009
New Revision: 800925

URL: http://svn.apache.org/viewvc?rev=800925&view=rev
Log:
LUCENE-1748: LUCENE-1001 introduced PayloadSpans, but this was a back compat break and caused custom SpanQuery implementations to fail at runtime in a variety of ways. This issue attempts to remedy things by causing a compile time break on custom SpanQuery implementations and removing the PayloadSpans class, with its functionality now moved to Spans.

Removed:
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/PayloadSpans.java
Modified:
    lucene/java/trunk/CHANGES.txt
    lucene/java/trunk/common-build.xml
    lucene/java/trunk/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNearQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNotQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanOrQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanTermQuery.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/Spans.java
    lucene/java/trunk/src/java/org/apache/lucene/search/spans/TermSpans.java
    lucene/java/trunk/src/test/org/apache/lucene/search/TestPositionIncrement.java
    lucene/java/trunk/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java
    lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestPayloadSpans.java

Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Tue Aug  4 19:10:02 2009
@@ -84,6 +84,13 @@
     be passed upon instantiation. As a result, IndexWriter was removed
     as a method argument from all MergePolicy methods. (Shai Erera via
     Mike McCandless)
+    
+ 6. LUCENE-1748: LUCENE-1001 introduced PayloadSpans, but this was a back
+    compat break and caused custom SpanQuery implementations to fail at runtime
+    in a variety of ways. This issue attempts to remedy things by causing
+    a compile time break on custom SpanQuery implementations and removing 
+    the PayloadSpans class, with its functionality now moved to Spans.
+    (Hugh Cayless, Mark Miller)
  
 Changes in runtime behavior
 
@@ -363,6 +370,13 @@
     new QueryParser framework in Lucene 3.0, that is currently located
     in contrib. (see New Features 35.) 
     (Luis Alves and Adriano Campos via Michael Busch)
+    
+36. LUCENE-1748: LUCENE-1001 introduced PayloadSpans, but this was a back
+    compat break and caused custom SpanQuery implementations to fail at runtime
+    in a variety of ways. This issue attempts to remedy things by causing
+    a compile time break on custom SpanQuery implementations and removing 
+    the PayloadSpans class, with its functionality now moved to Spans.
+    (Hugh Cayless, Mark Miller)
 
 Bug fixes
 

Modified: lucene/java/trunk/common-build.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/common-build.xml?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/common-build.xml (original)
+++ lucene/java/trunk/common-build.xml Tue Aug  4 19:10:02 2009
@@ -42,7 +42,7 @@
   <property name="Name" value="Lucene"/>
   <property name="dev.version" value="2.9-dev"/>
   <property name="version" value="${dev.version}"/>
-  <property name="compatibility.tag" value="lucene_2_4_back_compat_tests_20090801"/>
+  <property name="compatibility.tag" value="lucene_2_4_back_compat_tests_20090804"/>
   <property name="spec.version" value="${version}"/>	
   <property name="year" value="2000-${current.year}"/>
   <property name="final.name" value="lucene-${name}-${version}"/>

Modified: lucene/java/trunk/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java (original)
+++ lucene/java/trunk/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java Tue Aug  4 19:10:02 2009
@@ -27,7 +27,6 @@
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
 import org.apache.lucene.search.spans.Spans;
-import org.apache.lucene.search.spans.PayloadSpans;
 import org.apache.lucene.util.ToStringUtils;
 
 import java.io.IOException;
@@ -77,10 +76,6 @@
     throw new UnsupportedOperationException("Query should have been rewritten");
   }
 
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    throw new UnsupportedOperationException("Query should have been rewritten");
-  }
-
   public String getField() {
     return term.field();
   }

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java Tue Aug  4 19:10:02 2009
@@ -1,6 +1,5 @@
 package org.apache.lucene.search.payloads;
 
-import org.apache.lucene.search.BooleanClause;
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -26,6 +25,7 @@
 
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.DisjunctionMaxQuery;
 import org.apache.lucene.search.FilteredQuery;
@@ -33,11 +33,11 @@
 import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.spans.PayloadSpans;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanOrQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
+import org.apache.lucene.search.spans.Spans;
 
 /**
  * Experimental class to get set of payloads for most standard Lucene queries.
@@ -173,7 +173,7 @@
 
   private void getPayloads(Collection payloads, SpanQuery query)
       throws IOException {
-    PayloadSpans spans = query.getPayloadSpans(reader);
+    Spans spans = query.getSpans(reader);
 
     while (spans.next() == true) {
       if (spans.isPayloadAvailable()) {

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java Tue Aug  4 19:10:02 2009
@@ -93,9 +93,6 @@
   public Spans getSpans(IndexReader reader) throws IOException {
     return maskedQuery.getSpans(reader);
   }
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    return maskedQuery.getPayloadSpans(reader);
-  }
 
   /** @deprecated use {@link #extractTerms(Set)} instead. */
   public Collection getTerms() {

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java Tue Aug  4 19:10:02 2009
@@ -24,7 +24,6 @@
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Collection;
@@ -48,13 +47,13 @@
  * <pre>t1 t2 .. t3      </pre>
  * <pre>      t1 .. t2 t3</pre>
  */
-class NearSpansOrdered implements PayloadSpans {
+class NearSpansOrdered implements Spans {
   private final int allowedSlop;
   private boolean firstTime = true;
   private boolean more = false;
 
   /** The spans in the same order as the SpanNearQuery */
-  private final PayloadSpans[] subSpans;
+  private final Spans[] subSpans;
 
   /** Indicates that all subSpans have same doc() */
   private boolean inSameDoc = false;
@@ -64,7 +63,7 @@
   private int matchEnd = -1;
   private List/*<byte[]>*/ matchPayload;
 
-  private final PayloadSpans[] subSpansByDoc;
+  private final Spans[] subSpansByDoc;
   private final Comparator spanDocComparator = new Comparator() {
     public int compare(Object o1, Object o2) {
       return ((Spans)o1).doc() - ((Spans)o2).doc();
@@ -87,11 +86,11 @@
     this.collectPayloads = collectPayloads;
     allowedSlop = spanNearQuery.getSlop();
     SpanQuery[] clauses = spanNearQuery.getClauses();
-    subSpans = new PayloadSpans[clauses.length];
+    subSpans = new Spans[clauses.length];
     matchPayload = new LinkedList();
-    subSpansByDoc = new PayloadSpans[clauses.length];
+    subSpansByDoc = new Spans[clauses.length];
     for (int i = 0; i < clauses.length; i++) {
-      subSpans[i] = clauses[i].getPayloadSpans(reader);
+      subSpans[i] = clauses[i].getSpans(reader);
       subSpansByDoc[i] = subSpans[i]; // used in toSameDoc()
     }
     query = spanNearQuery; // kept for toString() only.
@@ -260,7 +259,7 @@
     int lastStart = matchStart;
     int lastEnd = matchEnd;
     for (int i = subSpans.length - 2; i >= 0; i--) {
-      PayloadSpans prevSpans = subSpans[i];
+      Spans prevSpans = subSpans[i];
       if (collectPayloads && prevSpans.isPayloadAvailable()) {
         Collection payload = prevSpans.getPayload();
         possiblePayload = new ArrayList(payload.size());

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java Tue Aug  4 19:10:02 2009
@@ -27,7 +27,7 @@
 import java.util.Set;
 import java.util.HashSet;
 
-class NearSpansUnordered implements PayloadSpans {
+class NearSpansUnordered implements Spans {
   private SpanNearQuery query;
 
   private List ordered = new ArrayList();         // spans in query order
@@ -62,13 +62,13 @@
 
 
   /** Wraps a Spans, and can be used to form a linked list. */
-  private class SpansCell implements PayloadSpans {
-    private PayloadSpans spans;
+  private class SpansCell implements Spans {
+    private Spans spans;
     private SpansCell next;
     private int length = -1;
     private int index;
 
-    public SpansCell(PayloadSpans spans, int index) {
+    public SpansCell(Spans spans, int index) {
       this.spans = spans;
       this.index = index;
     }
@@ -124,7 +124,7 @@
     queue = new CellQueue(clauses.length);
     for (int i = 0; i < clauses.length; i++) {
       SpansCell cell =
-        new SpansCell(clauses[i].getPayloadSpans(reader), i);
+        new SpansCell(clauses[i].getSpans(reader), i);
       ordered.add(cell);
     }
   }

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java Tue Aug  4 19:10:02 2009
@@ -74,13 +74,9 @@
 	    match.extractTerms(terms);
   }
 
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    return (PayloadSpans) getSpans(reader);
-  }
-
   public Spans getSpans(final IndexReader reader) throws IOException {
-    return new PayloadSpans() {
-        private PayloadSpans spans = match.getPayloadSpans(reader);
+    return new Spans() {
+        private Spans spans = match.getSpans(reader);
 
         public boolean next() throws IOException {
           while (spans.next()) {                  // scan to next match

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNearQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNearQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNearQuery.java Tue Aug  4 19:10:02 2009
@@ -125,18 +125,14 @@
 
   public Spans getSpans(final IndexReader reader) throws IOException {
     if (clauses.size() == 0)                      // optimize 0-clause case
-      return new SpanOrQuery(getClauses()).getPayloadSpans(reader);
+      return new SpanOrQuery(getClauses()).getSpans(reader);
 
     if (clauses.size() == 1)                      // optimize 1-clause case
-      return ((SpanQuery)clauses.get(0)).getPayloadSpans(reader);
+      return ((SpanQuery)clauses.get(0)).getSpans(reader);
 
     return inOrder
-            ? (PayloadSpans) new NearSpansOrdered(this, reader, collectPayloads)
-            : (PayloadSpans) new NearSpansUnordered(this, reader);
-  }
-
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    return (PayloadSpans) getSpans(reader);
+            ? (Spans) new NearSpansOrdered(this, reader, collectPayloads)
+            : (Spans) new NearSpansUnordered(this, reader);
   }
 
   public Query rewrite(IndexReader reader) throws IOException {

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNotQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNotQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNotQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanNotQuery.java Tue Aug  4 19:10:02 2009
@@ -75,8 +75,8 @@
   }
 
   public Spans getSpans(final IndexReader reader) throws IOException {
-    return new PayloadSpans() {
-        private PayloadSpans includeSpans = include.getPayloadSpans(reader);
+    return new Spans() {
+        private Spans includeSpans = include.getSpans(reader);
         private boolean moreInclude = true;
 
         private Spans excludeSpans = exclude.getSpans(reader);
@@ -157,10 +157,6 @@
       };
   }
 
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    return (PayloadSpans) getSpans(reader);
-  }
-
   public Query rewrite(IndexReader reader) throws IOException {
     SpanNotQuery clone = null;
 

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?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- 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 Aug  4 19:10:02 2009
@@ -167,22 +167,18 @@
     }
   }
 
-  public PayloadSpans getPayloadSpans(final IndexReader reader) throws IOException {
-    return (PayloadSpans)getSpans(reader);
-  }
-
   public Spans getSpans(final IndexReader reader) throws IOException {
     if (clauses.size() == 1)                      // optimize 1-clause case
-      return ((SpanQuery)clauses.get(0)).getPayloadSpans(reader);
+      return ((SpanQuery)clauses.get(0)).getSpans(reader);
 
-    return new PayloadSpans() {
+    return new Spans() {
         private SpanQueue queue = null;
 
         private boolean initSpanQueue(int target) throws IOException {
           queue = new SpanQueue(clauses.size());
           Iterator i = clauses.iterator();
           while (i.hasNext()) {
-            PayloadSpans spans = ((SpanQuery)i.next()).getPayloadSpans(reader);
+            Spans spans = ((SpanQuery)i.next()).getSpans(reader);
             if (   ((target == -1) && spans.next())
                 || ((target != -1) && spans.skipTo(target))) {
               queue.put(spans);
@@ -209,7 +205,7 @@
           return queue.size() != 0;
         }
 
-        private PayloadSpans top() { return (PayloadSpans)queue.top(); }
+        private Spans top() { return (Spans)queue.top(); }
 
         public boolean skipTo(int target) throws IOException {
           if (queue == null) {
@@ -239,7 +235,7 @@
       // TODO: Remove warning after API has been finalized
       public Collection/*<byte[]>*/ getPayload() throws IOException {
         ArrayList result = null;
-        PayloadSpans theTop = top();
+        Spans theTop = top();
         if (theTop != null && theTop.isPayloadAvailable()) {
           result = new ArrayList(theTop.getPayload());
         }
@@ -248,7 +244,7 @@
 
       // TODO: Remove warning after API has been finalized
      public boolean isPayloadAvailable() {
-        PayloadSpans top = top();
+        Spans top = top();
         return top != null && top.isPayloadAvailable();
       }
 

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanQuery.java Tue Aug  4 19:10:02 2009
@@ -32,22 +32,6 @@
    * to search for spans. */
   public abstract Spans getSpans(IndexReader reader) throws IOException;
 
-  /**
-   * Returns the matches for this query in an index, including access to any {@link org.apache.lucene.index.Payload}s at those
-   * positions.  Implementing classes that want access to the payloads will need to implement this.
-   * @param reader  The {@link org.apache.lucene.index.IndexReader} to use to get spans/payloads
-   * @return null
-   * @throws IOException if there is an error accessing the payload
-   *
-   * <font color="#FF0000">
-   * WARNING: The status of the <b>Payloads</b> feature is experimental.
-   * The APIs introduced here might change in the future and will not be
-   * supported anymore in such a case.</font>
-   */
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException{
-    return null;
-  }
-
   /** Returns the name of the field matched by this query.*/
   public abstract String getField();
 

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanTermQuery.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanTermQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/SpanTermQuery.java Tue Aug  4 19:10:02 2009
@@ -79,9 +79,4 @@
     return new TermSpans(reader.termPositions(term), term);
   }
 
-
-  public PayloadSpans getPayloadSpans(IndexReader reader) throws IOException {
-    return (PayloadSpans) getSpans(reader);
-  }
-
 }

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/Spans.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/Spans.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/Spans.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/Spans.java Tue Aug  4 19:10:02 2009
@@ -18,6 +18,7 @@
  */
 
 import java.io.IOException;
+import java.util.Collection;
 
 /** Expert: an enumeration of span matches.  Used to implement span searching.
  * Each span represents a range of term positions within a document.  Matches
@@ -50,5 +51,46 @@
 
   /** Returns the end position of the current match.  Initially invalid. */
   int end();
+  
+  /**
+   * Returns the payload data for the current span.
+   * This is invalid until {@link #next()} is called for
+   * the first time.
+   * This method must not be called more than once after each call
+   * of {@link #next()}. However, most payloads are loaded lazily,
+   * so if the payload data for the current position is not needed,
+   * this method may not be called at all for performance reasons. An ordered
+   * SpanQuery does not lazy load, so if you have payloads in your index and
+   * you do not want ordered SpanNearQuerys to collect payloads, you can
+   * disable collection with a constructor option.<br>
+   * <br>
+    * Note that the return type is a collection, thus the ordering should not be relied upon.
+    * <br/>
+   * <p><font color="#FF0000">
+   * WARNING: The status of the <b>Payloads</b> feature is experimental.
+   * The APIs introduced here might change in the future and will not be
+   * supported anymore in such a case.</font>
+   *
+   * @return a List of byte arrays containing the data of this payload, otherwise null if isPayloadAvailable is false
+   * @throws java.io.IOException
+    */
+  // TODO: Remove warning after API has been finalized
+  Collection/*<byte[]>*/ getPayload() throws IOException;
+
+  /**
+   * Checks if a payload can be loaded at this position.
+   * <p/>
+   * Payloads can only be loaded once per call to
+   * {@link #next()}.
+   * <p/>
+   * <p><font color="#FF0000">
+   * WARNING: The status of the <b>Payloads</b> feature is experimental.
+   * The APIs introduced here might change in the future and will not be
+   * supported anymore in such a case.</font>
+   *
+   * @return true if there is a payload available at this position that can be loaded
+   */
+  // TODO: Remove warning after API has been finalized
+  public boolean isPayloadAvailable();
 
 }

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/spans/TermSpans.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/spans/TermSpans.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/spans/TermSpans.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/spans/TermSpans.java Tue Aug  4 19:10:02 2009
@@ -27,7 +27,7 @@
  * Expert:
  * Public for extension only
  */
-public class TermSpans implements PayloadSpans {
+public class TermSpans implements Spans {
   protected TermPositions positions;
   protected Term term;
   protected int doc;

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/TestPositionIncrement.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/TestPositionIncrement.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/TestPositionIncrement.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/TestPositionIncrement.java Tue Aug  4 19:10:02 2009
@@ -45,7 +45,6 @@
 import org.apache.lucene.analysis.TokenFilter;
 import org.apache.lucene.index.Payload;
 import org.apache.lucene.search.payloads.PayloadSpanUtil;
-import org.apache.lucene.search.spans.PayloadSpans;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
@@ -279,7 +278,7 @@
       count = 0;
       boolean sawZero = false;
       //System.out.println("\ngetPayloadSpans test");
-      PayloadSpans pspans = snq.getPayloadSpans(is.getIndexReader());
+      Spans pspans = snq.getSpans(is.getIndexReader());
       while (pspans.next()) {
         //System.out.println(pspans.doc() + " - " + pspans.start() + " - "+ pspans.end());
         Collection payloads = pspans.getPayload();

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java Tue Aug  4 19:10:02 2009
@@ -57,6 +57,14 @@
     public int start() {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
+
+    public Collection getPayload() throws IOException {
+      throw new UnsupportedOperationException(UNSUPPORTED_MSG);
+    }
+
+    public boolean isPayloadAvailable() {
+      throw new UnsupportedOperationException(UNSUPPORTED_MSG);
+    }
     
   }
 
@@ -81,7 +89,7 @@
     
   }
 
-  static final class JustCompilePayloadSpans implements PayloadSpans {
+  static final class JustCompilePayloadSpans implements Spans {
 
     public Collection getPayload() throws IOException {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestPayloadSpans.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestPayloadSpans.java?rev=800925&r1=800924&r2=800925&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestPayloadSpans.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/spans/TestPayloadSpans.java Tue Aug  4 19:10:02 2009
@@ -26,7 +26,6 @@
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.LowerCaseTokenizer;
-import org.apache.lucene.analysis.Token;
 import org.apache.lucene.analysis.TokenFilter;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.PayloadAttribute;
@@ -51,7 +50,7 @@
 import org.apache.lucene.util.LuceneTestCase;
 
 public class TestPayloadSpans extends LuceneTestCase {
-  private final static boolean DEBUG = false;
+  private final static boolean DEBUG = true;
   private IndexSearcher searcher;
   private Similarity similarity = new DefaultSimilarity();
   protected IndexReader indexReader;
@@ -73,14 +72,14 @@
 
   public void testSpanTermQuery() throws Exception {
     SpanTermQuery stq;
-    PayloadSpans spans;
+    Spans spans;
     stq = new SpanTermQuery(new Term(PayloadHelper.FIELD, "seventy"));
-    spans = stq.getPayloadSpans(indexReader);
+    spans = stq.getSpans(indexReader);
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 100, 1, 1, 1);
 
     stq = new SpanTermQuery(new Term(PayloadHelper.NO_PAYLOAD_FIELD, "seventy"));  
-    spans = stq.getPayloadSpans(indexReader);
+    spans = stq.getSpans(indexReader);
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 100, 0, 0, 0);
   }
@@ -91,7 +90,7 @@
     SpanFirstQuery sfq;
     match = new SpanTermQuery(new Term(PayloadHelper.FIELD, "one"));
     sfq = new SpanFirstQuery(match, 2);
-    PayloadSpans spans = sfq.getPayloadSpans(indexReader);
+    Spans spans = sfq.getSpans(indexReader);
     checkSpans(spans, 109, 1, 1, 1);
     //Test more complicated subclause
     SpanQuery[] clauses = new SpanQuery[2];
@@ -99,20 +98,49 @@
     clauses[1] = new SpanTermQuery(new Term(PayloadHelper.FIELD, "hundred"));
     match = new SpanNearQuery(clauses, 0, true);
     sfq = new SpanFirstQuery(match, 2);
-    checkSpans(sfq.getPayloadSpans(indexReader), 100, 2, 1, 1);
+    checkSpans(sfq.getSpans(indexReader), 100, 2, 1, 1);
 
     match = new SpanNearQuery(clauses, 0, false);
     sfq = new SpanFirstQuery(match, 2);
-    checkSpans(sfq.getPayloadSpans(indexReader), 100, 2, 1, 1);
+    checkSpans(sfq.getSpans(indexReader), 100, 2, 1, 1);
     
   }
   
+  public void testSpanNot() throws Exception {
+    SpanQuery[] clauses = new SpanQuery[2];
+    clauses[0] = new SpanTermQuery(new Term(PayloadHelper.FIELD, "one"));
+    clauses[1] = new SpanTermQuery(new Term(PayloadHelper.FIELD, "three"));
+    SpanQuery spq = new SpanNearQuery(clauses, 5, true);
+    SpanNotQuery snq = new SpanNotQuery(spq, new SpanTermQuery(new Term(PayloadHelper.FIELD, "two")));
+    checkSpans(snq.getSpans(getSpanNotSearcher().getIndexReader()), 1,new int[]{2});
+  }
+  
+  public IndexSearcher getSpanNotSearcher()
+      throws IOException {
+    RAMDirectory directory = new RAMDirectory();
+    PayloadAnalyzer analyzer = new PayloadAnalyzer();
+    IndexWriter writer = new IndexWriter(directory, analyzer, true);
+    writer.setSimilarity(similarity);
+
+    Document doc = new Document();
+    doc.add(new Field(PayloadHelper.FIELD, "one two three one four three",
+        Field.Store.YES, Field.Index.ANALYZED));
+    writer.addDocument(doc);
+
+    writer.close();
+
+    IndexSearcher searcher = new IndexSearcher(directory);
+    searcher.setSimilarity(similarity);
+    return searcher;
+
+  }
+  
   public void testNestedSpans() throws Exception {
     SpanTermQuery stq;
-    PayloadSpans spans;
+    Spans spans;
     IndexSearcher searcher = getSearcher();
     stq = new SpanTermQuery(new Term(PayloadHelper.FIELD, "mark"));
-    spans = stq.getPayloadSpans(searcher.getIndexReader());
+    spans = stq.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 0, null);
 
@@ -123,7 +151,7 @@
     clauses[2] = new SpanTermQuery(new Term(PayloadHelper.FIELD, "xx"));
     SpanNearQuery spanNearQuery = new SpanNearQuery(clauses, 12, false);
 
-    spans = spanNearQuery.getPayloadSpans(searcher.getIndexReader());
+    spans = spanNearQuery.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 2, new int[]{3,3});
 
@@ -135,7 +163,7 @@
     spanNearQuery = new SpanNearQuery(clauses, 6, true);
    
     
-    spans = spanNearQuery.getPayloadSpans(searcher.getIndexReader());
+    spans = spanNearQuery.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 1, new int[]{3});
      
@@ -157,13 +185,13 @@
     
     // yy within 6 of xx within 6 of rr
 
-    spans = nestedSpanNearQuery.getPayloadSpans(searcher.getIndexReader());
+    spans = nestedSpanNearQuery.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 2, new int[]{3,3});
   }
   
   public void testFirstClauseWithoutPayload() throws Exception {
-    PayloadSpans spans;
+    Spans spans;
     IndexSearcher searcher = getSearcher();
 
     SpanQuery[] clauses = new SpanQuery[3];
@@ -187,13 +215,13 @@
      
     SpanNearQuery nestedSpanNearQuery = new SpanNearQuery(clauses3, 6, false);
 
-    spans = nestedSpanNearQuery.getPayloadSpans(searcher.getIndexReader());
+    spans = nestedSpanNearQuery.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 1, new int[]{3});
   }
   
   public void testHeavilyNestedSpanQuery() throws Exception {
-    PayloadSpans spans;
+    Spans spans;
     IndexSearcher searcher = getSearcher();
 
     SpanQuery[] clauses = new SpanQuery[3];
@@ -222,7 +250,7 @@
      
     SpanNearQuery nestedSpanNearQuery = new SpanNearQuery(clauses3, 6, false);
 
-    spans = nestedSpanNearQuery.getPayloadSpans(searcher.getIndexReader());
+    spans = nestedSpanNearQuery.getSpans(searcher.getIndexReader());
     assertTrue("spans is null and it shouldn't be", spans != null);
     checkSpans(spans, 2, new int[]{8, 8});
   }
@@ -243,7 +271,7 @@
     SpanTermQuery stq2 = new SpanTermQuery(new Term("content", "k"));
     SpanQuery[] sqs = { stq1, stq2 };
     SpanNearQuery snq = new SpanNearQuery(sqs, 1, true);
-    PayloadSpans spans = snq.getPayloadSpans(is.getIndexReader());
+    Spans spans = snq.getSpans(is.getIndexReader());
 
     TopDocs topDocs = is.search(snq, 1);
     Set payloadSet = new HashSet();
@@ -277,7 +305,7 @@
     SpanTermQuery stq2 = new SpanTermQuery(new Term("content", "k"));
     SpanQuery[] sqs = { stq1, stq2 };
     SpanNearQuery snq = new SpanNearQuery(sqs, 0, true);
-    PayloadSpans spans = snq.getPayloadSpans(is.getIndexReader());
+    Spans spans = snq.getSpans(is.getIndexReader());
 
     TopDocs topDocs = is.search(snq, 1);
     Set payloadSet = new HashSet();
@@ -311,7 +339,7 @@
     SpanTermQuery stq2 = new SpanTermQuery(new Term("content", "k"));
     SpanQuery[] sqs = { stq1, stq2 };
     SpanNearQuery snq = new SpanNearQuery(sqs, 0, true);
-    PayloadSpans spans = snq.getPayloadSpans(is.getIndexReader());
+    Spans spans = snq.getSpans(is.getIndexReader());
 
     TopDocs topDocs = is.search(snq, 1);
     Set payloadSet = new HashSet();
@@ -364,7 +392,7 @@
     
   }
 
-  private void checkSpans(PayloadSpans spans, int expectedNumSpans, int expectedNumPayloads,
+  private void checkSpans(Spans spans, int expectedNumSpans, int expectedNumPayloads,
                           int expectedPayloadLength, int expectedFirstByte) throws IOException {
     assertTrue("spans is null and it shouldn't be", spans != null);
     //each position match should have a span associated with it, since there is just one underlying term query, there should
@@ -420,7 +448,7 @@
     return searcher;
   }
   
-  private void checkSpans(PayloadSpans spans, int numSpans, int[] numPayloads) throws IOException {
+  private void checkSpans(Spans spans, int numSpans, int[] numPayloads) throws IOException {
     int cnt = 0;
 
     while (spans.next() == true) {