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);
+ }
}