package com.plugtree.solrmeter.view;
import com.google.inject.Inject;
import com.plugtree.solrmeter.controller.QueryExecutorController;
import com.plugtree.solrmeter.model.QueryExecutor;
import com.plugtree.solrmeter.model.SolrMeterConfiguration;
import com.plugtree.solrmeter.model.statistic.OperationRateStatistic;
import com.plugtree.solrmeter.model.statistic.SimpleQueryStatistic;
import java.util.ArrayList;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class HeadlessQueryConsolePanel extends HeadlessConsolePanel {
private SimpleQueryStatistic simpleQueryStatistic;
private OperationRateStatistic operationRateStatistic;
private QueryExecutor queryExecutor;
private QueryExecutorController controller;
private final long DEFAULT_INITIAL_DELAY_MS = 1000 * 2;
private final long DEFAULT_NUM_QUERIES = 100;
private boolean completed = false;
@Inject
public HeadlessQueryConsolePanel(SimpleQueryStatistic simpleQueryStatistic,
OperationRateStatistic operationRateStatistic,
QueryExecutor queryExecutor,
QueryExecutorController controller) {
this.simpleQueryStatistic = simpleQueryStatistic;
this.operationRateStatistic = operationRateStatistic;
this.queryExecutor = queryExecutor;
this.controller = controller;
}
private void scheduleQueryOperations() {
String queryDelay = SolrMeterConfiguration.getProperty("headless.queryInitialDelay", String.valueOf(DEFAULT_INITIAL_DELAY_MS));
new ScheduledThreadPoolExecutor(1).schedule(new Runnable() {
@Override
public void run() {
controller.onStart();
}
}, Long.valueOf(queryDelay), TimeUnit.MILLISECONDS);
}
private long getNumQueries() {
return Integer.valueOf(SolrMeterConfiguration.getProperty("headless.numQueries", String.valueOf(DEFAULT_NUM_QUERIES)));
}
public void refreshView() {
ArrayList<String> lines = new ArrayList<String>();
lines.add("queries per minute:\t" + String.valueOf(queryExecutor.getQueriesPerSecond()));
lines.add("total queries:\t" + String.valueOf(simpleQueryStatistic.getTotalQueries()));
lines.add("total query time:\t" + String.valueOf(simpleQueryStatistic.getTotalQTime()));
lines.add("total client time:\t" + String.valueOf(simpleQueryStatistic.getTotalClientTime()));
lines.add("total errors:\t" + String.valueOf(simpleQueryStatistic.getTotalErrors()));
if(simpleQueryStatistic.getTotalQueries() != 0) {
lines.add("average query time:\t" + String.valueOf(simpleQueryStatistic.getAverageQueryTime()));
lines.add("average client time:\t" + String.valueOf(simpleQueryStatistic.getAverageClientTime()));
}
lines.add("intended queries per minute:\t" + SolrMeterConfiguration.getProperty("solr.load.queriesperminute"));
lines.add("actual query rate:\t" + String.valueOf(operationRateStatistic.getQueryRate()));
HeadlessUtils.outputData("queryConsolePanel.title", HeadlessConsoleFrame.getOutputDirectory(), lines);
if (simpleQueryStatistic.getTotalQueries() >= getNumQueries()) {
controller.onStop();
}
}
public boolean operationsComplete() {
return completed;
}
public void scheduleOperations() {
if (SolrMeterConfiguration.getProperty("headless.performQueryOperations", "").equalsIgnoreCase("true")) {
if (getNumQueries() > 0) {
scheduleQueryOperations();
} else {
completed = true;
}
} else {
completed = true;
}
}
public void stopped() {
completed = true;
}
public void started() {}
}