/** * */ package edu.brown.designer.generators; import java.util.Set; import org.apache.log4j.Logger; import org.voltdb.CatalogContext; import org.voltdb.catalog.Table; import edu.brown.designer.DesignerEdge; import edu.brown.designer.DesignerInfo; import edu.brown.designer.DesignerVertex; import edu.brown.designer.PartitionTree; import edu.brown.designer.partitioners.plan.PartitionPlan; import edu.brown.designer.partitioners.plan.TableEntry; import edu.brown.graphs.VertexTreeWalker; import edu.uci.ics.jung.graph.util.EdgeType; /** * @author pavlo */ public class PartitionPlanTreeGenerator extends AbstractGenerator<PartitionTree> { private static final Logger LOG = Logger.getLogger(PartitionPlanTreeGenerator.class); private final PartitionPlan pplan; public PartitionPlanTreeGenerator(DesignerInfo info, PartitionPlan plan) { super(info); this.pplan = plan; } /** * Convenience method for generating a PartitionTree from a PartitionPlan * * @param catalog_db * @return */ public static PartitionTree generate(CatalogContext catalogContext, PartitionPlan pplan) { PartitionTree ptree = new PartitionTree(catalogContext.database); DesignerInfo info = new DesignerInfo(catalogContext, null, null); try { new PartitionPlanTreeGenerator(info, pplan).generate(ptree); } catch (Exception ex) { ex.printStackTrace(); return (null); } return (ptree); } @Override public void generate(final PartitionTree ptree) throws Exception { for (Table catalog_tbl : pplan.getRoots()) { DesignerVertex root = info.dgraph.getVertex(catalog_tbl); LOG.debug("ROOT: " + root); // Walk down the paths in the plans and create the partition tree // that represents the PartitionPlan new VertexTreeWalker<DesignerVertex, DesignerEdge>(info.dgraph) { protected void populate_children(VertexTreeWalker.Children<DesignerVertex> children, DesignerVertex element) { Set<Table> element_children = pplan.getChildren((Table) element.getCatalogItem()); if (element_children != null) { for (Table child_tbl : element_children) { DesignerVertex child = info.dgraph.getVertex(child_tbl); children.addAfter(child); } // FOR } return; } @Override protected void callback(DesignerVertex element) { TableEntry entry = PartitionPlanTreeGenerator.this.pplan.getTableEntries().get((Table) element.getCatalogItem()); // Bad Mojo! if (entry == null) { LOG.warn("ERROR: No PartitionPlan entry for '" + element + "'"); // Non-Root } else if (entry.getParent() != null) { LOG.debug("Trying to create: " + entry.getParent() + "->" + element); DesignerVertex parent = info.dgraph.getVertex(entry.getParent()); element.setAttribute(ptree, PartitionTree.VertexAttributes.ATTRIBUTE.name(), entry.getAttribute()); element.setAttribute(ptree, PartitionTree.VertexAttributes.METHOD.name(), entry.getMethod()); if (parent != null && !ptree.containsVertex(element)) { if (!ptree.containsVertex(parent)) ptree.addVertex(parent); // System.out.println("FINAL GRAPH: " + parent + // "->" + element); DesignerEdge edge = new DesignerEdge(ptree); ptree.addEdge(edge, parent, element, EdgeType.DIRECTED); element.setAttribute(ptree, PartitionTree.VertexAttributes.PARENT_ATTRIBUTE.name(), entry.getParentAttribute()); } // Root } else if (!ptree.containsVertex(element)) { ptree.addVertex(element); element.setAttribute(ptree, PartitionTree.VertexAttributes.ATTRIBUTE.name(), entry.getAttribute()); element.setAttribute(ptree, PartitionTree.VertexAttributes.METHOD.name(), entry.getMethod()); } } }.traverse(root); } // FOR return; } }