package com.senseidb.search.query.filters;
import com.kamikaze.docidset.impl.IntArrayDocIdSet;
import junit.framework.Assert;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.DocIdSetIterator;
import static org.easymock.classextension.EasyMock.*;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TestSenseiBooleanFilters {
public static SenseiFilter buildFilter(final int... elems) {
return new SenseiFilter() {
@Override
public SenseiDocIdSet getSenseiDocIdSet(IndexReader reader) throws IOException {
IntArrayDocIdSet docIdSet = new IntArrayDocIdSet(elems.length);
for(int elem : elems) {
docIdSet.addDoc(elem);
}
return new SenseiDocIdSet(docIdSet, DocIdSetCardinality.exact(elems.length, reader.maxDoc()), "IntArray[" + elems.length + "]");
}
};
}
public static int getCount(DocIdSetIterator iterator) throws IOException {
int count = 0;
while(iterator.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
count++;
}
return count;
}
@Test
public void testAndFilter() throws IOException {
List<SenseiFilter> filterList = getSenseiFilters();
SenseiAndFilter andFilter = new SenseiAndFilter(filterList);
IndexReader indexReader = createMock(IndexReader.class);
expect(indexReader.maxDoc()).andReturn(20).anyTimes();
replay(indexReader);
SenseiDocIdSet senseiDocIdSet = andFilter.getSenseiDocIdSet(indexReader);
DocSetAssertions.assertRange(9, 14, 20, senseiDocIdSet.getCardinalityEstimate());
Assert.assertEquals(14, getCount(senseiDocIdSet.getDocIdSet().iterator()));
}
@Test
public void testOrFilter() throws IOException {
List<SenseiFilter> filterList = getSenseiFilters();
SenseiOrFilter filter = new SenseiOrFilter(filterList);
IndexReader indexReader = createMock(IndexReader.class);
expect(indexReader.maxDoc()).andReturn(20).anyTimes();
replay(indexReader);
SenseiDocIdSet senseiDocIdSet = filter.getSenseiDocIdSet(indexReader);
DocSetAssertions.assertRange(15, 20, 20, senseiDocIdSet.getCardinalityEstimate());
Assert.assertEquals(15, getCount(senseiDocIdSet.getDocIdSet().iterator()));
}
@Test
public void testNotFilter() throws IOException {
List<SenseiFilter> filterList = getSenseiFilters();
SenseiNotFilter filter = new SenseiNotFilter(new SenseiAndFilter(filterList));
IndexReader indexReader = createMock(IndexReader.class);
expect(indexReader.maxDoc()).andReturn(20).anyTimes();
replay(indexReader);
SenseiDocIdSet senseiDocIdSet = filter.getSenseiDocIdSet(indexReader);
DocSetAssertions.assertRange(6, 11, 20, senseiDocIdSet.getCardinalityEstimate());
Assert.assertEquals(6, getCount(senseiDocIdSet.getDocIdSet().iterator()));
}
private List<SenseiFilter> getSenseiFilters() {
List<SenseiFilter> filterList = new ArrayList<SenseiFilter>();
filterList.add(buildFilter(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19)); // 15 elements
filterList.add(buildFilter(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 17, 19)); // 14 elements
return filterList;
}
}