improve boolean filter

This commit is contained in:
Shay Banon 2011-11-10 12:00:43 +02:00
parent ed8c289dec
commit 62bc0836c1
1 changed files with 22 additions and 21 deletions

View File

@ -22,11 +22,11 @@ package org.elasticsearch.common.lucene.search;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FilterClause;
import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.OpenBitSetDISI;
import org.elasticsearch.common.lucene.docset.DocSet;
import org.elasticsearch.common.lucene.docset.DocSets;
import java.io.IOException;
@ -42,17 +42,13 @@ public class XBooleanFilter extends Filter {
ArrayList<Filter> notFilters = null;
ArrayList<Filter> mustFilters = null;
private DocIdSetIterator getDISI(ArrayList<Filter> filters, int index, IndexReader reader)
private DocIdSet getDISI(ArrayList<Filter> filters, int index, IndexReader reader)
throws IOException {
DocIdSet docIdSet = filters.get(index).getDocIdSet(reader);
if (docIdSet == null) {
return DocIdSet.EMPTY_DOCIDSET.iterator();
if (docIdSet == DocIdSet.EMPTY_DOCIDSET || docIdSet == DocSet.EMPTY_DOC_SET) {
return null;
}
DocIdSetIterator iterator = docIdSet.iterator();
if (iterator == null) {
return DocIdSet.EMPTY_DOCIDSET.iterator();
}
return iterator;
return docIdSet;
}
public List<Filter> getShouldFilters() {
@ -77,34 +73,39 @@ public class XBooleanFilter extends Filter {
if (shouldFilters != null) {
for (int i = 0; i < shouldFilters.size(); i++) {
final DocIdSet disi = getDISI(shouldFilters, i, reader);
if (disi == null) continue;
if (res == null) {
res = DocSets.createFixedBitSet(getDISI(shouldFilters, i, reader), reader.maxDoc());
} else {
DocIdSet dis = shouldFilters.get(i).getDocIdSet(reader);
DocSets.or(res, dis);
res = new FixedBitSet(reader.maxDoc());
}
DocSets.or(res, disi);
}
}
if (notFilters != null) {
for (int i = 0; i < notFilters.size(); i++) {
if (res == null) {
res = DocSets.createFixedBitSet(getDISI(notFilters, i, reader), reader.maxDoc());
res.flip(0, reader.maxDoc()); // NOTE: may set bits on deleted docs
} else {
DocIdSet dis = notFilters.get(i).getDocIdSet(reader);
DocSets.andNot(res, dis);
res = new FixedBitSet(reader.maxDoc());
res.set(0, reader.maxDoc()); // NOTE: may set bits on deleted docs
}
final DocIdSet disi = getDISI(notFilters, i, reader);
if (disi != null) {
DocSets.andNot(res, disi);
}
}
}
if (mustFilters != null) {
for (int i = 0; i < mustFilters.size(); i++) {
final DocIdSet disi = getDISI(mustFilters, i, reader);
if (disi == null) {
return null;
}
if (res == null) {
res = DocSets.createFixedBitSet(getDISI(mustFilters, i, reader), reader.maxDoc());
res = new FixedBitSet(reader.maxDoc());
DocSets.or(res, disi);
} else {
DocIdSet dis = mustFilters.get(i).getDocIdSet(reader);
DocSets.and(res, dis);
DocSets.and(res, disi);
}
}
}