package edu.brown.catalog.conflicts;
import java.io.File;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Statement;
import edu.brown.catalog.conflicts.ConflictGraph.ConflictEdge;
import edu.brown.catalog.conflicts.ConflictGraph.ConflictVertex;
import edu.brown.graphs.GraphUtil;
import edu.brown.graphs.GraphvizExport;
import edu.brown.utils.ArgumentsParser;
import edu.brown.utils.FileUtil;
public abstract class ConflictGraphExport {
private static final Logger LOG = Logger.getLogger(ConflictGraphExport.class);
/**
* @param args
*/
public static void main(String[] vargs) throws Exception {
ArgumentsParser args = ArgumentsParser.load(vargs,
ArgumentsParser.PARAM_CATALOG
);
ConflictSetCalculator calculator = new ConflictSetCalculator(args.catalog);
// Procedures to exclude in ConflictGraph
if (args.hasParam(ArgumentsParser.PARAM_CONFLICTS_EXCLUDE_PROCEDURES)) {
String param = args.getParam(ArgumentsParser.PARAM_CONFLICTS_EXCLUDE_PROCEDURES);
for (String procName : param.split(",")) {
Procedure catalog_proc = args.catalogContext.procedures.getIgnoreCase(procName);
if (catalog_proc != null) {
calculator.ignoreProcedure(catalog_proc);
} else {
LOG.warn("Invalid procedure name to exclude '" + procName + "'");
}
} // FOR
}
// Statements to exclude in ConflictGraph
if (args.hasParam(ArgumentsParser.PARAM_CONFLICTS_EXCLUDE_STATEMENTS)) {
String param = args.getParam(ArgumentsParser.PARAM_CONFLICTS_EXCLUDE_STATEMENTS);
for (String name : param.split(",")) {
String splits[] = name.split("\\.");
if (splits.length != 2) {
LOG.warn("Invalid procedure name to exclude '" + name + "': " + Arrays.toString(splits));
continue;
}
Procedure catalog_proc = args.catalogContext.procedures.getIgnoreCase(splits[0]);
if (catalog_proc == null) {
LOG.warn("Invalid procedure name to exclude '" + name + "'");
continue;
}
Statement catalog_stmt = catalog_proc.getStatements().getIgnoreCase(splits[1]);
if (catalog_stmt != null) {
calculator.ignoreStatement(catalog_stmt);
} else {
LOG.warn("Invalid statement name to exclude '" + name + "'");
}
} // FOR
}
calculator.process();
ConflictGraph graph = new ConflictGraph(args.catalog_db);
// If we have a Procedure to "focus" on, then we need to remove any edges
// that don't involve that Procedure
if (args.hasParam(ArgumentsParser.PARAM_CONFLICTS_FOCUS_PROCEDURE)) {
String procName = args.getParam(ArgumentsParser.PARAM_CONFLICTS_FOCUS_PROCEDURE);
Procedure catalog_proc = args.catalogContext.procedures.getIgnoreCase(procName);
if (catalog_proc != null) {
ConflictVertex v = graph.getVertex(catalog_proc);
assert(v != null);
GraphUtil.removeEdgesWithoutVertex(graph, v);
GraphUtil.removeDisconnectedVertices(graph);
} else {
LOG.warn("Invalid procedure name to focus '" + procName + "'");
}
}
// Export!
GraphvizExport<ConflictVertex, ConflictEdge> gvx = new GraphvizExport<ConflictVertex, ConflictEdge>(graph);
gvx.setEdgeLabels(true);
String graphviz = gvx.export(args.catalog_type.name());
if (!graphviz.isEmpty()) {
String output = args.getOptParam(0);
if (output == null) {
output = args.catalog_type.name().toLowerCase() + "-conflicts.dot";
}
File path = new File(output);
FileUtil.writeStringToFile(path, graphviz);
System.out.println("Wrote contents to '" + path.getAbsolutePath() + "'");
} else {
System.err.println("ERROR: Failed to generate graphviz data");
System.exit(1);
}
}
}