package com.browseengine.bobo.test;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import junit.framework.TestCase;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import com.browseengine.bobo.api.BoboBrowser;
import com.browseengine.bobo.api.BoboMultiReader;
import com.browseengine.bobo.api.BoboSegmentReader;
import com.browseengine.bobo.api.BrowseSelection;
import com.browseengine.bobo.api.FacetSpec;
import com.browseengine.bobo.facets.FacetCountCollectorSource;
import com.browseengine.bobo.facets.FacetHandler;
import com.browseengine.bobo.facets.FacetHandler.FacetDataNone;
import com.browseengine.bobo.facets.filter.RandomAccessFilter;
import com.browseengine.bobo.sort.DocComparatorSource;
public class FacetHandlerTest extends TestCase {
private final Directory _ramDir;
private static class NoopFacetHandler extends FacetHandler<FacetDataNone> {
public NoopFacetHandler(String name) {
super(name);
}
public NoopFacetHandler(String name, Set<String> dependsOn) {
super(name, dependsOn);
}
@Override
public RandomAccessFilter buildRandomAccessFilter(String value, Properties selectionProperty)
throws IOException {
return null;
}
@Override
public FacetCountCollectorSource getFacetCountCollectorSource(BrowseSelection sel,
FacetSpec fspec) {
return null;
}
@Override
public String[] getFieldValues(BoboSegmentReader reader, int id) {
return null;
}
@Override
public DocComparatorSource getDocComparatorSource() {
return null;
}
@Override
public FacetDataNone load(BoboSegmentReader reader) throws IOException {
return FacetDataNone.instance;
}
@Override
public Object[] getRawFieldValues(BoboSegmentReader reader, int id) {
// TODO Auto-generated method stub
return null;
}
}
public FacetHandlerTest(String testname) {
super(testname);
_ramDir = new RAMDirectory();
try {
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);
IndexWriter idxWriter = new IndexWriter(_ramDir, config);
// Add one empty document, so that Directory reader will have one sub reader
Document doc = new Document();
idxWriter.addDocument(doc);
idxWriter.close();
} catch (Exception ioe) {
fail("unable to load test");
}
}
public void testFacetHandlerLoad() throws Exception {
DirectoryReader reader = DirectoryReader.open(_ramDir);
List<FacetHandler<?>> list = new LinkedList<FacetHandler<?>>();
NoopFacetHandler h1 = new NoopFacetHandler("A");
list.add(h1);
HashSet<String> s2 = new HashSet<String>();
s2.add("A");
s2.add("C");
s2.add("D");
NoopFacetHandler h2 = new NoopFacetHandler("B", s2);
list.add(h2);
HashSet<String> s3 = new HashSet<String>();
s3.add("A");
s2.add("D");
NoopFacetHandler h3 = new NoopFacetHandler("C", s3);
list.add(h3);
HashSet<String> s4 = new HashSet<String>();
s4.add("A");
NoopFacetHandler h4 = new NoopFacetHandler("D", s4);
list.add(h4);
HashSet<String> s5 = new HashSet<String>();
s5.add("E");
NoopFacetHandler h5 = new NoopFacetHandler("E", s5);
list.add(h5);
BoboMultiReader boboReader = BoboMultiReader.getInstance(reader, list);
BoboBrowser browser = new BoboBrowser(boboReader);
HashSet<String> s6 = new HashSet<String>();
s6.add("A");
s6.add("B");
s6.add("C");
s6.add("D");
browser.setFacetHandler(new NoopFacetHandler("runtime", s6));
Set<String> expected = new HashSet<String>();
expected.add("A");
expected.add("B");
expected.add("C");
expected.add("D");
expected.add("E");
expected.add("runtime");
Set<String> facetsLoaded = browser.getFacetNames();
Iterator<String> iter = facetsLoaded.iterator();
while (iter.hasNext()) {
String name = iter.next();
if (expected.contains(name)) {
expected.remove(name);
} else {
fail(name + " is not in expected set.");
}
}
if (expected.size() > 0) {
fail("some facets not loaded: " + expected);
}
boboReader.close();
browser.close();
}
public void testNegativeLoadTest() throws Exception {
DirectoryReader reader = DirectoryReader.open(_ramDir);
List<FacetHandler<?>> list = new LinkedList<FacetHandler<?>>();
HashSet<String> s1 = new HashSet<String>();
s1.add("E");
NoopFacetHandler h1 = new NoopFacetHandler("A", s1);
list.add(h1);
HashSet<String> s2 = new HashSet<String>();
s2.add("A");
s2.add("C");
s2.add("D");
NoopFacetHandler h2 = new NoopFacetHandler("B", s2);
list.add(h2);
HashSet<String> s3 = new HashSet<String>();
s3.add("A");
s2.add("D");
NoopFacetHandler h3 = new NoopFacetHandler("C", s3);
list.add(h3);
HashSet<String> s4 = new HashSet<String>();
s4.add("A");
NoopFacetHandler h4 = new NoopFacetHandler("D", s4);
list.add(h4);
HashSet<String> s5 = new HashSet<String>();
s5.add("E");
NoopFacetHandler h5 = new NoopFacetHandler("E", s5);
list.add(h5);
BoboMultiReader boboReader = BoboMultiReader.getInstance(reader, list);
BoboBrowser browser = new BoboBrowser(boboReader);
Set<String> expected = new HashSet<String>();
expected.add("A");
expected.add("B");
expected.add("C");
expected.add("D");
expected.add("E");
Set<String> facetsLoaded = browser.getFacetNames();
Iterator<String> iter = facetsLoaded.iterator();
while (iter.hasNext()) {
String name = iter.next();
if (expected.contains(name)) {
expected.remove(name);
} else {
fail(name + " is not in expected set.");
}
}
if (expected.size() > 0) {
if (expected.size() == 4) {
expected.remove("A");
expected.remove("B");
expected.remove("C");
expected.remove("D");
if (expected.size() > 0) {
fail("some facets not loaded: " + expected);
}
} else {
fail("incorrect number of left over facets: " + expected);
}
}
boboReader.close();
browser.close();
}
}