You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by dn...@apache.org on 2005/01/20 00:32:53 UTC

cvs commit: jakarta-lucene/src/test/org/apache/lucene/search TestMultiPhraseQuery.java

dnaber      2005/01/19 15:32:52

  Modified:    src/java/org/apache/lucene/search MultiPhraseQuery.java
               src/test/org/apache/lucene/search TestMultiPhraseQuery.java
  Log:
  fix for bug 33161 (UnsupportedOperationException for some combinations of BooleanQuery and MultiPhraseQuery)
  PR: 33161
  Submitted by: Rhett Sutphin
  
  Revision  Changes    Path
  1.2       +7 -2      jakarta-lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java
  
  Index: MultiPhraseQuery.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MultiPhraseQuery.java	10 Oct 2004 15:27:15 -0000	1.1
  +++ MultiPhraseQuery.java	19 Jan 2005 23:32:52 -0000	1.2
  @@ -225,7 +225,7 @@
       }
     }
   
  -  protected Weight createWeight(Searcher searcher) {
  +  public Query rewrite(IndexReader reader) {
       if (termArrays.size() == 1) {                 // optimize one-term case
         Term[] terms = (Term[])termArrays.get(0);
         BooleanQuery boq = new BooleanQuery();
  @@ -233,8 +233,13 @@
           boq.add(new TermQuery(terms[i]), BooleanClause.Occur.SHOULD);
         }
         boq.setBoost(getBoost());
  -      return boq.createWeight(searcher);
  +      return boq;
  +    } else {
  +      return this;
       }
  +  }
  +  
  +  protected Weight createWeight(Searcher searcher) {
       return new MultiPhraseWeight(searcher);
     }
   
  
  
  
  1.7       +38 -7     jakarta-lucene/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
  
  Index: TestMultiPhraseQuery.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TestMultiPhraseQuery.java	24 Nov 2004 19:41:16 -0000	1.6
  +++ TestMultiPhraseQuery.java	19 Jan 2005 23:32:52 -0000	1.7
  @@ -39,13 +39,11 @@
    */
   public class TestMultiPhraseQuery extends TestCase
   {
  -    public TestMultiPhraseQuery(String name)
  -    {
  +    public TestMultiPhraseQuery(String name) {
           super(name);
       }
   
  -    public void testPhrasePrefix() throws IOException
  -    {
  +    public void testPhrasePrefix() throws IOException {
           RAMDirectory indexStore = new RAMDirectory();
           IndexWriter writer = new IndexWriter(indexStore, new SimpleAnalyzer(), true);
           add("blueberry pie", writer);
  @@ -128,10 +126,43 @@
   
       }
       
  -    private void add(String s, IndexWriter writer) throws IOException
  -    {
  +    private void add(String s, IndexWriter writer) throws IOException {
         Document doc = new Document();
         doc.add(new Field("body", s, Field.Store.YES, Field.Index.TOKENIZED));
         writer.addDocument(doc);
       }
  +    
  +    public void testBooleanQueryContainingSingleTermPrefixQuery() throws IOException {
  +      // this tests against bug 33161 (now fixed)
  +      // In order to cause the bug, the outer query must have more than one term 
  +      // and all terms required.
  +      // The contained PhraseMultiQuery must contain exactly one term array.
  +
  +      RAMDirectory indexStore = new RAMDirectory();
  +      IndexWriter writer = new IndexWriter(indexStore, new SimpleAnalyzer(), true);
  +      add("blueberry pie", writer);
  +      add("blueberry chewing gum", writer);
  +      add("blue raspberry pie", writer);
  +      writer.optimize();
  +      writer.close();
  +
  +      IndexSearcher searcher = new IndexSearcher(indexStore);
  +      // This query will be equivalent to +body:pie +body:"blue*"
  +      BooleanQuery q = new BooleanQuery();
  +      q.add(new TermQuery(new Term("body", "pie")), BooleanClause.Occur.MUST);
  +
  +      MultiPhraseQuery trouble = new MultiPhraseQuery();
  +      trouble.add(new Term[] {
  +          new Term("body", "blueberry"),
  +          new Term("body", "blue")
  +      });
  +      q.add(trouble, BooleanClause.Occur.MUST);
  +
  +      // exception will be thrown here without fix
  +      Hits hits = searcher.search(q);
  +
  +      assertEquals("Wrong number of hits", 2, hits.length());
  +      searcher.close();
  +  }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-dev-help@jakarta.apache.org