Index: contrib/miscellaneous/src/test/org/apache/lucene/misc/ChainedFilterTest.java =================================================================== --- contrib/miscellaneous/src/test/org/apache/lucene/misc/ChainedFilterTest.java (revision 607519) +++ contrib/miscellaneous/src/test/org/apache/lucene/misc/ChainedFilterTest.java (working copy) @@ -90,6 +90,16 @@ chain = new ChainedFilter(new Filter[] {bobFilter}); hits = searcher.search(query, chain); assertEquals(MAX / 2, hits.length()); + + chain = new ChainedFilter(new Filter[] {bobFilter}, new int[] {ChainedFilter.AND}); + hits = searcher.search(query, chain); + assertEquals(MAX / 2, hits.length()); + assertEquals("bob", hits.doc(0).get("owner")); + + chain = new ChainedFilter(new Filter[] {bobFilter}, new int[] {ChainedFilter.ANDNOT}); + hits = searcher.search(query, chain); + assertEquals(MAX / 2, hits.length()); + assertEquals("sue", hits.doc(0).get("owner")); } public void testOR() throws Exception { @@ -127,6 +137,15 @@ assertEquals("ANDNOT matches just bob", MAX / 2, hits.length()); assertEquals("bob", hits.doc(0).get("owner")); + + chain = new ChainedFilter( + new Filter[]{bobFilter, bobFilter}, + new int[] {ChainedFilter.ANDNOT, ChainedFilter.ANDNOT}); + + hits = searcher.search(query, chain); + assertEquals("ANDNOT bob ANDNOT bob matches all sues", + MAX / 2, hits.length()); + assertEquals("sue", hits.doc(0).get("owner")); } private Date parseDate(String s) throws ParseException { Index: contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java =================================================================== --- contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java (revision 607519) +++ contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java (working copy) @@ -177,6 +177,12 @@ result = (BitSet) chain[i].bits(reader).clone(); ++i; } + else if (logic == ANDNOT) + { + result = (BitSet) chain[i].bits(reader).clone(); + result.flip(0,reader.maxDoc()); + ++i; + } else { result = new BitSet(reader.maxDoc()); @@ -212,6 +218,12 @@ result = (BitSet) chain[i].bits(reader).clone(); ++i; } + else if (logic[0] == ANDNOT) + { + result = (BitSet) chain[i].bits(reader).clone(); + result.flip(0,reader.maxDoc()); + ++i; + } else { result = new BitSet(reader.maxDoc());