package org.apache.solr.search;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import org.apache.lucene.util.BitSet;
import org.apache.lucene.util.FixedBitSet;
import org.apache.solr.common.util.NamedList;
import org.junit.BeforeClass;
import org.junit.Test;
import monty.solr.util.MontySolrAbstractTestCase;
import monty.solr.util.MontySolrSetup;
public class BenchmarkBitSetQParserPlugin extends MontySolrAbstractTestCase {
private int indexSize = 10000000;
private long maxTime = 60*1000; // max time benchmark is allowed to run
private ArrayList<ArrayList<Object>> timerStack = new ArrayList<ArrayList<Object>>();
@BeforeClass
public static void beforeClass() throws Exception {
System.setProperty("solr.allow.unsafe.resourceloading", "true");
schemaString = MontySolrSetup.getMontySolrHome()
+ "/contrib/adsabs/src/test-files/solr/collection1/conf/"
+ "schema-minimal.xml";
configString = MontySolrSetup.getMontySolrHome()
+ "/contrib/adsabs/src/test-files/solr/collection1/conf/"
+ "bitset-solrconfig.xml";
initCore(configString, schemaString, MontySolrSetup.getMontySolrHome() + "/contrib/adsabs/src/test-files/solr/collection1");
}
@Override
public void setUp() throws Exception {
super.setUp();
//createIndex();
}
public void createIndex() {
System.out.println("Building index of: " + indexSize);
for (int i=0;i<indexSize;i++) {
assertU(adoc("id", String.valueOf(i)));
if (i % 100000 == 0) {
System.out.println("Finished: " + i);
}
}
assertU(commit());
}
@Test
public void test() throws IOException, Exception {
for (float fill: new float[]{0.05f, 0.1f, 0.25f, 0.5f, 0.75f, 0.9f, 1f}) {
startTimer("run");
startTimer("Building random bitset indexSize=" + indexSize + " fill=" + fill);
BitSet r = randomBitSet(indexSize, fill);
appendToTimer("Size=" +r.length() + ",cardinality=" +r.cardinality()+ " highestBit=" + r.prevSetBit(r.length()-1));
stopTimer();
BitSetQParserPlugin bqp = new BitSetQParserPlugin();
bqp.init(new NamedList(){});
startTimer("running");
measure(bqp, r);
stopTimer();
stopTimer();
}
}
private void measure(BitSetQParserPlugin bqp, BitSet data) throws Exception {
startTimer("Converting bitset to byte array");
byte[] byteData = bqp.toByteArray(data);
appendToTimer("resulting array length=" + byteData.length);
stopTimer();
startTimer("Encoding byte array into base64");
String base64string = bqp.encodeBase64(byteData);
appendToTimer("resulting array length=" + base64string.length() + " ratio=" + 1.0f * base64string.length() / byteData.length);
stopTimer();
startTimer("Compressing byte array with GZIP");
byte[] gzipData = bqp.doGZip(byteData);
appendToTimer("resulting array length=" + gzipData.length + " ratio=" + 1.0f * gzipData.length / byteData.length);
stopTimer();
startTimer("Encoding gzipped byte array into base64");
String gzipBase64string = bqp.encodeBase64(gzipData);
appendToTimer("resulting string length=" + gzipBase64string.length() + " ratio=" + 1.0f * gzipBase64string.length() / byteData.length);
stopTimer();
startTimer("Decoding gzipped byte array from base64");
byte[] d = bqp.decodeBase64(gzipBase64string);
stopTimer();
assertArrayEquals(d, gzipData);
startTimer("Uncompressing decoded byte array");
byte[] e = bqp.unGZip(gzipData);
stopTimer();
assertArrayEquals(e, byteData);
startTimer("Converting from byte array to bitset");
BitSet f = bqp.fromByteArray(e);
stopTimer();
}
private BitSet randomBitSet(int size, float fill) {
BitSet bs = new FixedBitSet(size+1);
float max = size * fill;
int i = 0;
Random r = random();
while (i < max) {
bs.set(r.nextInt(size));
i++;
}
return bs;
}
private void startTimer(String message) {
ArrayList<Object> l = new ArrayList<Object>();
l.add(System.currentTimeMillis());
l.add(message);
timerStack.add(l);
}
private long stopTimer() {
ArrayList<Object> l = timerStack.remove(timerStack.size()-1);
long endTime = System.currentTimeMillis();
long startTime = (Long) l.get(0);
String msg = (String) l.get(1);
long resTime = endTime - startTime;
StringBuilder out = new StringBuilder();
for (int i=0;i<timerStack.size();i++) {
out.append("\t");
}
out.append(resTime);
out.append("ms. " + msg);
System.out.println(out.toString());
return resTime;
}
private void appendToTimer(String msg) {
timerStack.get(timerStack.size()-1).set(1, (timerStack.get(timerStack.size()-1).get(1) + " -- " + msg));
}
}