/** * */ package edu.brown.designer.partitioners; import java.io.File; import java.util.List; import java.util.Observable; import org.voltdb.catalog.*; import edu.brown.BaseTestCase; import edu.brown.designer.*; import edu.brown.graphs.IGraph; import edu.brown.gui.common.GraphVisualizationPanel; import edu.brown.utils.EventObservable; import edu.brown.utils.EventObserver; import edu.brown.utils.ProjectType; import edu.brown.workload.*; import edu.brown.workload.filters.ProcedureLimitFilter; import edu.brown.workload.filters.ProcedureNameFilter; /** * @author pavlo * */ public class TestHeuristicPartitioner extends BaseTestCase { private static final long WORKLOAD_XACT_LIMIT = 1000; private static final String TARGET_PROCEDURE = "neworder"; private static final int NUM_THREADS = 1; // Reading the workload takes a long time, so we only want to do it once private static Workload workload; private Designer designer; private DesignerInfo info; private DesignerHints hints; private HeuristicPartitioner partitioner; private Procedure catalog_proc; @Override protected void setUp() throws Exception { super.setUp(ProjectType.TPCC, true); // Super hack! Walk back the directories and find out workload directory if (workload == null) { File workload_file = this.getWorkloadFile(ProjectType.TPCC); workload = new Workload(catalog); // Workload Filter ProcedureNameFilter filter = new ProcedureNameFilter(false); filter.include(TARGET_PROCEDURE); filter.attach(new ProcedureLimitFilter(WORKLOAD_XACT_LIMIT)); ((Workload)workload).load(workload_file, catalog_db, filter); } // Setup everything else (that's just how we roll up in this ma) this.info = new DesignerInfo(catalogContext, workload); this.info.setNumThreads(NUM_THREADS); this.info.setPartitionerClass(HeuristicPartitioner.class); this.hints = new DesignerHints(); this.hints.proc_include.add(TARGET_PROCEDURE); this.designer = new Designer(this.info, this.hints, this.info.getArgs()); this.partitioner = (HeuristicPartitioner)this.designer.getPartitioner(); assertNotNull(this.partitioner); this.catalog_proc = this.getProcedure(TARGET_PROCEDURE); } private void display(final IGraph<DesignerVertex, DesignerEdge> graph) throws Exception { final EventObserver<DesignerVertex> observer = new EventObserver<DesignerVertex>() { @Override public void update(EventObservable<DesignerVertex> o, DesignerVertex v) { if (v == null) return; System.err.println(v); for (DesignerEdge e : graph.getIncidentEdges(v)) { System.err.println(" " + e + ": " + e.getTotalWeight()); } // FOR } }; javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { GraphVisualizationPanel.createFrame(graph, observer).setVisible(true); } }); } /** * testCreateCandidateRoots */ public void testCreateCandidateRoots() throws Exception { final AccessGraph agraph = this.designer.getAccessGraph(this.catalog_proc); List<DesignerVertex> candidate_roots = this.partitioner.createCandidateRoots(hints, agraph); System.err.println("ROOTS: "+ candidate_roots); // display(info.dgraph); } /** * testGenerateSinglePartitionTree */ public void testGenerateSinglePartitionTree() throws Exception { // Construct the first pass of the PartitionTree final PartitionTree ptree = new PartitionTree(catalog_db); final Table catalog_tbl = this.getTable("WAREHOUSE"); final AccessGraph agraph = this.designer.getAccessGraph(this.catalog_proc); DesignerVertex parent = agraph.getVertex(catalog_tbl); //this.partitioner.generateSinglePartitionTree(this.hints, agraph, ptree, parent); // We should have all tables in our tree except for ITEM // for (Table child_tbl : catalog_db.getTables()) { // if (child_tbl.getName().equals("ITEM")) continue; // Vertex child = ptree.getVertex(child_tbl); // assertNotNull("Missing vertex for table '" + child_tbl + "' in partition tree", child); // } // FOR // this.display(agraph); } public static void main(String[] args) throws Exception { TestHeuristicPartitioner t = new TestHeuristicPartitioner(); t.setUp(); //t.testGenerateSinglePartitionTree(); t.testCreateCandidateRoots(); } }