package lux.junit;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import lux.Compiler.SearchStrategy;
import lux.Evaluator;
import lux.QueryStats;
import lux.XdmResultSet;
import lux.exception.LuxException;
import net.sf.saxon.s9api.XdmItem;
import net.sf.saxon.s9api.XdmValue;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.store.LockObtainFailedException;
import org.junit.Ignore;
@Ignore
public class SearchTestCase extends QueryTestCase {
private static long elapsed=0;
private static long elapsedBaseline=0;
protected static int repeatCount=1;
private static ArrayList<TestTime> baseTimes, testTimes;
SearchTestCase(String name, String query, QueryTestResult expected) {
super(name, query, expected);
if (repeatCount > 1) {
// for benchmarking; not currently working
baseTimes = new ArrayList<TestTime>();
testTimes = new ArrayList<TestTime>();
}
}
public void evaluate (Evaluator eval, Evaluator baselineEval) {
baselineEval.getCompiler().setSearchStrategy(SearchStrategy.LUX_UNOPTIMIZED);
if (repeatCount > 1) {
try {
benchmark (eval, baselineEval);
} catch (IOException e) {
fail (e.getMessage());
}
} else {
XdmResultSet results = evaluate (eval);
XdmValue baseResult = evaluate(baselineEval).getXdmValue();
assertEquals ("result count mismatch for: " + getQuery(), baseResult.size(), results.size());
Iterator<?> baseIter = baseResult.iterator();
Iterator<?> resultIter = results.iterator();
for (int i = 0 ; i < results.size(); i++) {
XdmItem base = (XdmItem) baseIter.next();
XdmItem r = (XdmItem) resultIter.next();
assertEquals (base.isAtomicValue(), r.isAtomicValue());
assertEquals (base.getStringValue(), r.getStringValue());
}
}
}
@Override
public XdmResultSet evaluate(Evaluator eval) {
if (eval.getDocReader() != null) {
eval.getDocReader().clear();
}
eval.setQueryStats(new QueryStats());
XdmResultSet results = null;
String expectedError = getExpectedResult().errorText;
try {
results = eval.evaluate(getQuery());
} catch (LuxException e) {
if (! getExpectedResult().isError) {
fail (e.getMessage());
}
if (expectedError != null) {
assertEquals (expectedError, e.getMessage());
}
return null;
}
if (!results.getErrors().isEmpty()) {
if (! getExpectedResult().isError) {
fail (results.getErrors().iterator().next().getMessageAndLocation());
}
if (expectedError != null) {
assertEquals (expectedError, results.getErrors().iterator().next().getMessage());
}
} else {
if (getExpectedResult().isError) {
fail ("expected error did not occur");
}
}
return results;
}
private void benchmark (Evaluator baselineEval, Evaluator testEval) throws CorruptIndexException, LockObtainFailedException, IOException {
XdmResultSet results = evaluate(testEval);
XdmValue baselineResult = evaluate(baselineEval).getXdmValue();
TestTime baseTime = new TestTime("baseline", getQuery(), repeatCount);
baseTimes.add(baseTime);
TestTime testTime = new TestTime("indexed", getQuery(), repeatCount);
testTimes.add(testTime);
for (int i = 0; i < repeatCount; i++) {
testEval.getDocReader().clear(); // no fair caching!
long t0 = System.nanoTime();
evaluate(testEval);
long t = System.nanoTime() - t0;
testTime.times[i] = t;
elapsed += t;
baselineEval.getDocReader().clear(); // no fair caching!
t0 = System.nanoTime();
evaluate(baselineEval);
t = System.nanoTime() - t0;
baseTime.times[i] = t;
elapsedBaseline += t;
}
System.out.println (String.format("%dms using lux; %dms w/o lux", elapsed/1000000, elapsedBaseline/1000000));
results = evaluate(testEval);
System.out.println ("lux retrieved " + results.size() + " results from " + testEval.getQueryStats());
printDocReaderStats(testEval);
baselineResult = evaluate(baselineEval).getXdmValue();
System.out.println ("baseline (no lux): retrieved " + baselineResult.size() + " results from " + baselineEval.getQueryStats());
printDocReaderStats(baselineEval);
}
private void printDocReaderStats(Evaluator saxon) {
System.out.println (String.format(" %d/%d cache hits/misses, %dms building docs",
saxon.getDocReader().getCacheHits(), saxon.getDocReader().getCacheMisses(),
saxon.getDocReader().getBuildTime()/1000000));
}
}