Index: PhrasePrefixQuery.java
===================================================================
RCS file: /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/search/PhrasePrefixQuery.java,v
retrieving revision 1.18
diff -u -r1.18 PhrasePrefixQuery.java
--- PhrasePrefixQuery.java	10 Oct 2004 15:27:15 -0000	1.18
+++ PhrasePrefixQuery.java	18 Jan 2005 22:29:16 -0000
@@ -96,7 +95,21 @@
     termArrays.add(terms);
     positions.addElement(new Integer(position));
   }
-  
+
+  public Query rewrite(IndexReader reader) throws IOException {
+    if (termArrays.size() == 1) {                 // optimize one-term case
+      Term[] terms = (Term[])termArrays.get(0);
+      BooleanQuery boq = new BooleanQuery();
+      for (int i=0; i<terms.length; i++) {
+        boq.add(new TermQuery(terms[i]), false, false);
+      }
+      boq.setBoost(getBoost());
+      return boq;
+    } else {
+      return this;
+    }
+  }
+
   /**
    * Returns the relative positions of terms in this phrase.
    */
@@ -227,15 +240,6 @@
   }
 
   protected Weight createWeight(Searcher searcher) {
-    if (termArrays.size() == 1) {                 // optimize one-term case
-      Term[] terms = (Term[])termArrays.get(0);
-      BooleanQuery boq = new BooleanQuery();
-      for (int i=0; i<terms.length; i++) {
-        boq.add(new TermQuery(terms[i]), BooleanClause.Occur.SHOULD);
-      }
-      boq.setBoost(getBoost());
-      return boq.createWeight(searcher);
-    }
     return new PhrasePrefixWeight(searcher);
   }
 
