package edu.brown.designer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.voltdb.catalog.Column;
import org.voltdb.catalog.Database;
import edu.brown.graphs.AbstractUndirectedGraph;
import edu.brown.utils.PredicatePairs;
/**
* @author Andy Pavlo <pavlo@cs.brown.edu>
*/
@SuppressWarnings("serial")
public class AccessGraph extends AbstractUndirectedGraph<DesignerVertex, DesignerEdge> {
public enum EdgeAttributes {
ACCESSTYPE, COLUMNSET, FOREIGNKEY,
};
public enum AccessType {
SCAN, SQL_JOIN, PARAM_JOIN, IMPLICIT_JOIN, INSERT;
public static List<AccessType> JOINS = new ArrayList<AccessType>();
static {
JOINS.add(SQL_JOIN);
JOINS.add(PARAM_JOIN);
JOINS.add(IMPLICIT_JOIN);
}
};
//
// Edge Weight Modifiers
//
public static final Double WEIGHT_FOREIGN_KEY = 5.0;
public static final Double WEIGHT_JOIN = 2.5;
public static final Double WEIGHT_IMPLICIT = 4.0;
/**
* @param catalog_db
*/
public AccessGraph(Database catalog_db) {
super(catalog_db);
}
/**
* Return all the edges for the given vertex whose ColumnSets contain the
* given Column
*
* @param v
* @param catalog_col
* @return
*/
public Collection<DesignerEdge> findEdgeSet(DesignerVertex v, Column catalog_col) {
assert (v != null);
Set<DesignerEdge> edges = new HashSet<DesignerEdge>();
for (DesignerEdge e : this.getIncidentEdges(v)) {
PredicatePairs cset = e.getAttribute(EdgeAttributes.COLUMNSET);
assert (cset != null);
if (cset.findAll(catalog_col).isEmpty() == false) {
edges.add(e);
}
} // FOR
return (edges);
}
public <T> Collection<DesignerEdge> getIncidentEdges(DesignerVertex vertex, String name, T value) {
Set<DesignerEdge> edges = new HashSet<DesignerEdge>();
for (DesignerEdge edge : super.getIncidentEdges(vertex)) {
if (edge.getAttribute(name).equals(value))
edges.add(edge);
} // WHILE
return (edges);
}
@Override
public String toString(DesignerEdge e, boolean verbose) {
StringBuilder sb = new StringBuilder();
sb.append(super.toString(e, verbose));
if (verbose) {
// for (Entry<String, Object> entry :
// e.getAttributeValues(this).entrySet()) {
// sb.append(String.format("\n => %-15s%s", entry.getKey()+":",
// entry.getValue().toString()));
// }
PredicatePairs cset = e.getAttribute(EdgeAttributes.COLUMNSET.name());
assert (cset != null);
sb.append("\n").append(cset.debug());
}
return (sb.toString());
}
}