package edu.brown.hstore.estimators;
import java.util.Arrays;
import java.util.List;
import org.apache.log4j.Logger;
import org.voltdb.ParameterSet;
import org.voltdb.SQLStmt;
import org.voltdb.catalog.ProcParameter;
import org.voltdb.catalog.Statement;
import edu.brown.graphs.GraphvizExport;
import edu.brown.hstore.BatchPlanner;
import edu.brown.hstore.estimators.markov.MarkovEstimate;
import edu.brown.hstore.estimators.markov.MarkovEstimatorState;
import edu.brown.hstore.txns.LocalTransaction;
import edu.brown.markov.MarkovEdge;
import edu.brown.markov.MarkovGraph;
import edu.brown.markov.MarkovUtil;
import edu.brown.markov.MarkovVertex;
import edu.brown.utils.ParameterMangler;
import edu.brown.utils.StringUtil;
public abstract class EstimatorUtil {
private static final Logger LOG = Logger.getLogger(EstimatorUtil.class);
/**
* This marker is used to indicate that an Estimate is for the
* initial evaluation of a txn (i.e., before it has started running
* and submitted any query batches).
*/
public static final int INITIAL_ESTIMATE_BATCH = -1;
/**
* The value to use to indicate that a probability is null
*/
public static final float NULL_MARKER = -1.0f;
public static String mispredictDebug(LocalTransaction ts,
BatchPlanner planner,
SQLStmt batchStmts[],
ParameterSet params[]) {
StringBuilder sb = new StringBuilder();
Exception ex = ts.getPendingError();
sb.append("Caught " + ex.getClass().getSimpleName() + "!\n")
.append(StringUtil.SINGLE_LINE);
// TRANSACTION STATE
sb.append("\nTRANSACTION STATE\n").append(ts.debug());
// BATCH PLAN
sb.append("CURRENT BATCH\n");
for (int i = 0; i < planner.getBatchSize(); i++) {
sb.append(String.format("[%02d] %s <==> %s\n %s\n %s\n",
i,
batchStmts[i].getStatement().fullName(),
planner.getStatements()[i].fullName(),
batchStmts[i].getStatement().getSqltext(),
Arrays.toString(params[i].toArray())));
} // FOR
// BATCH PLANNER
sb.append("\nPLANNER\n");
for (int i = 0; i < planner.getBatchSize(); i++) {
Statement stmt0 = planner.getStatements()[i];
Statement stmt1 = batchStmts[i].getStatement();
assert(stmt0.fullName().equals(stmt1.fullName())) :
stmt0.fullName() + " != " + stmt1.fullName();
sb.append(String.format("[%02d] %s\n %s\n", i, stmt0.fullName(), stmt1.fullName()));
} // FOR
// PARAMETERS
sb.append("\nBATCH PARAMETERS\n");
ParameterMangler pm = ParameterMangler.singleton(ts.getProcedure());
Object mangled[] = pm.convert(ts.getProcedureParameters().toArray());
sb.append(pm.toString(mangled));
// ESTIMATOR STATE
sb.append("\nESTIMATOR STATE:\n");
EstimatorState s = ts.getEstimatorState();
if (s instanceof MarkovEstimatorState) {
MarkovGraph markov = ((MarkovEstimatorState)s).getMarkovGraph();
MarkovEstimate initialEst = s.getInitialEstimate();
List<MarkovEdge> initialPath = markov.getPath(initialEst.getMarkovPath());
List<MarkovVertex> actualPath = ((MarkovEstimatorState)s).getActualPath();
sb.append(s.toString());
try {
GraphvizExport<MarkovVertex, MarkovEdge> gv = MarkovUtil.exportGraphviz(markov, true, initialPath);
gv.highlightPath(markov.getPath(actualPath), "blue");
LOG.info("PARTITION: " + ts.getBasePartition());
LOG.info("GRAPH: " + gv.writeToTempFile(ts.getProcedure().getName()));
} catch (Exception ex2) {
LOG.fatal("???????????????????????", ex2);
}
} else {
sb.append("No TransactionEstimator.State! Can't dump out MarkovGraph!\n");
}
return (sb.toString());
}
}