You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2011/11/30 11:54:59 UTC

svn commit: r1208375 - in /lucene/dev/branches/branch_3x/lucene/contrib: CHANGES.txt queries/src/java/org/apache/lucene/search/BooleanFilter.java queries/src/test/org/apache/lucene/search/BooleanFilterTest.java

Author: uschindler
Date: Wed Nov 30 10:54:58 2011
New Revision: 1208375

URL: http://svn.apache.org/viewvc?rev=1208375&view=rev
Log:
LUCENE-3609: Fix regression in BooleanFilter, introduced in Lucene 3.5, to correctly handle minShouldMatch behaviour of previous versions

Modified:
    lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java
    lucene/dev/branches/branch_3x/lucene/contrib/queries/src/test/org/apache/lucene/search/BooleanFilterTest.java

Modified: lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt?rev=1208375&r1=1208374&r2=1208375&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt Wed Nov 30 10:54:58 2011
@@ -22,6 +22,10 @@ Bug Fixes
    assert if such a parent doc was the first doc in the segment).
    (Shay Banon, Mike McCandless)
 
+ * LUCENE-3609: Fix regression in BooleanFilter, introduced in Lucene 3.5,
+   to correctly handle minShouldMatch behaviour of previous versions.
+   (Shay Banon, Uwe Schindler)
+ 
 Documentation
 
  * LUCENE-3599: Javadocs for DistanceUtils.haversine() were incorrectly 

Modified: lucene/dev/branches/branch_3x/lucene/contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java?rev=1208375&r1=1208374&r2=1208375&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java Wed Nov 30 10:54:58 2011
@@ -47,8 +47,10 @@ public class BooleanFilter extends Filte
   public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
     FixedBitSet res = null;
     
+    boolean hasShouldClauses = false;
     for (final FilterClause fc : clauses) {
       if (fc.getOccur() == Occur.SHOULD) {
+        hasShouldClauses = true;
         final DocIdSetIterator disi = getDISI(fc.getFilter(), reader);
         if (disi == null) continue;
         if (res == null) {
@@ -57,10 +59,13 @@ public class BooleanFilter extends Filte
         res.or(disi);
       }
     }
+    if (hasShouldClauses && res == null)
+      return DocIdSet.EMPTY_DOCIDSET;
     
     for (final FilterClause fc : clauses) {
       if (fc.getOccur() == Occur.MUST_NOT) {
         if (res == null) {
+          assert !hasShouldClauses;
           res = new FixedBitSet(reader.maxDoc());
           res.set(0, reader.maxDoc()); // NOTE: may set bits on deleted docs
         }

Modified: lucene/dev/branches/branch_3x/lucene/contrib/queries/src/test/org/apache/lucene/search/BooleanFilterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/queries/src/test/org/apache/lucene/search/BooleanFilterTest.java?rev=1208375&r1=1208374&r2=1208375&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/queries/src/test/org/apache/lucene/search/BooleanFilterTest.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/queries/src/test/org/apache/lucene/search/BooleanFilterTest.java Wed Nov 30 10:54:58 2011
@@ -28,6 +28,7 @@ import org.apache.lucene.index.RandomInd
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.LuceneTestCase;
 
 public class BooleanFilterTest extends LuceneTestCase {
@@ -84,6 +85,15 @@ public class BooleanFilterTest extends L
     return new QueryWrapperFilter(new TermQuery(new Term(field, text)));
   }
 
+  private Filter getEmptyFilter() {
+    return new Filter() {
+      @Override
+      public DocIdSet getDocIdSet(IndexReader context) {
+        return new FixedBitSet(context.maxDoc());
+      }
+    };
+  }
+
   private Filter getNullDISFilter() {
     return new Filter() {
       @Override
@@ -301,4 +311,21 @@ public class BooleanFilterTest extends L
     booleanFilter.add(getNullDISIFilter(), Occur.MUST_NOT);
     tstFilterCard("A single MUST_NOT filter that returns a null DIS should be invisible", 5, booleanFilter);
   }
+  
+  public void testNonMatchingShouldsAndMusts() throws Exception {
+    BooleanFilter booleanFilter = new BooleanFilter();
+    booleanFilter.add(getEmptyFilter(), Occur.SHOULD);
+    booleanFilter.add(getTermsFilter("accessRights", "admin"), Occur.MUST);
+    tstFilterCard(">0 shoulds with no matches should return no docs", 0, booleanFilter);
+    
+    booleanFilter = new BooleanFilter();
+    booleanFilter.add(getNullDISFilter(), Occur.SHOULD);
+    booleanFilter.add(getTermsFilter("accessRights", "admin"), Occur.MUST);
+    tstFilterCard(">0 shoulds with no matches should return no docs", 0, booleanFilter);
+    
+    booleanFilter = new BooleanFilter();
+    booleanFilter.add(getNullDISIFilter(), Occur.SHOULD);
+    booleanFilter.add(getTermsFilter("accessRights", "admin"), Occur.MUST);
+    tstFilterCard(">0 shoulds with no matches should return no docs", 0, booleanFilter);
+  }
 }