/** * Delegates to each filter in the chain. * @param reader IndexReader * @param logic Logical operation * @return BitSet */ private BitSet bits(IndexReader reader, int logic) throws IOException { BitSet result; int i = 0; /** * First AND operation takes place against a completely false * bitset and will always return zero results. Thanks to * Daniel Armbrust for pointing this out and suggesting workaround. */ if (logic == AND) { 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()); } for (; i < chain.length; i++) { doChain(result, reader, logic, chain[i]); } return result; } /** * Delegates to each filter in the chain. * @param reader IndexReader * @param logic Logical operation * @return BitSet */ private BitSet bits(IndexReader reader, int[] logic) throws IOException { if (logic.length != chain.length) throw new IllegalArgumentException("Invalid number of elements in logic array"); BitSet result; int i = 0; /** * First AND operation takes place against a completely false * bitset and will always return zero results. Thanks to * Daniel Armbrust for pointing this out and suggesting workaround. */ if (logic[0] == AND) { 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()); } for (; i < chain.length; i++) { doChain(result, reader, logic[i], chain[i]); } return result; }