package edu.brown.graphs;
import java.io.File;
import java.util.Collection;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Table;
import edu.brown.BaseTestCase;
import edu.brown.benchmark.tm1.TM1Constants;
import edu.brown.catalog.conflicts.ConflictGraph;
import edu.brown.designer.DependencyGraph;
import edu.brown.designer.DesignerEdge;
import edu.brown.designer.DesignerVertex;
import edu.brown.utils.CollectionUtil;
import edu.brown.utils.FileUtil;
import edu.brown.utils.ProjectType;
import edu.uci.ics.jung.graph.util.EdgeType;
public class TestGraphUtil extends BaseTestCase {
protected AbstractDirectedGraph<DesignerVertex, DesignerEdge> graph;
protected DesignerVertex root;
protected File tempFile;
protected static String TABLE_NAMES[] = {
TM1Constants.TABLENAME_SUBSCRIBER,
TM1Constants.TABLENAME_ACCESS_INFO,
TM1Constants.TABLENAME_SPECIAL_FACILITY
};
@Override
protected void setUp() throws Exception {
super.setUp(ProjectType.TM1);
this.graph = new AbstractDirectedGraph<DesignerVertex, DesignerEdge>(catalogContext.database) {
private static final long serialVersionUID = 1L;
};
this.root = new DesignerVertex(this.getTable(TM1Constants.TABLENAME_SUBSCRIBER));
this.graph.addVertex(this.root);
for (int i = 1; i < TABLE_NAMES.length; i++) {
String table_name = TABLE_NAMES[i];
DesignerVertex child = new DesignerVertex(this.getTable(table_name));
this.graph.addEdge(new DesignerEdge(this.graph), this.root, child);
} // FOR
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (this.tempFile != null && this.tempFile.exists()) {
this.tempFile.delete();
}
}
private void writeFile(IGraph<? extends AbstractVertex, ? extends AbstractEdge> graph) throws Exception {
if (this.tempFile == null) {
this.tempFile = File.createTempFile("graph-", null);
}
GraphUtil.save(graph, this.tempFile);
// System.err.println("SAVED: " + this.tempFile);
}
/**
*
* @param edge_type
* @param clone
*/
private void checkGraph(EdgeType edge_type, IGraph<DesignerVertex, DesignerEdge> clone) {
for (DesignerVertex v : graph.getVertices()) {
DesignerVertex clone_v = graph.getVertex(v.getCatalogItem());
assertNotNull(clone_v);
} // FOR
for (DesignerEdge e : graph.getEdges()) {
Collection<DesignerVertex> vertices = graph.getIncidentVertices(e);
DesignerVertex v0 = CollectionUtil.get(vertices, 0);
assertNotNull(v0);
DesignerVertex v1 = CollectionUtil.get(vertices, 1);
assertNotNull(v1);
DesignerVertex clone_v0 = clone.getVertex(v0.getCatalogKey());
assertNotNull(clone_v0);
DesignerVertex clone_v1 = clone.getVertex(v1.getCatalogKey());
assertNotNull(clone_v1);
Collection<DesignerEdge> clone_e = clone.findEdgeSet(clone_v0, clone_v1);
assertFalse(clone_e.isEmpty());
assertEquals(1, clone_e.size());
assertEquals(edge_type, clone.getEdgeType(CollectionUtil.first(clone_e)));
} // FOR
}
/**
* testRemoveDuplicateEdges
*/
public void testRemoveDuplicateEdges() throws Exception {
final int num_edges = 5;
DependencyGraph dgraph = new DependencyGraph(catalogContext.database);
DesignerVertex vertices[] = new DesignerVertex[TABLE_NAMES.length];
for (int i = 0; i < vertices.length; i++) {
Table catalog_tbl = this.getTable(TABLE_NAMES[i]);
vertices[i] = new DesignerVertex(catalog_tbl);
dgraph.addVertex(vertices[i]);
if (i > 0) {
for (int j = 0; j < num_edges; j++) {
dgraph.addEdge(new DesignerEdge(dgraph), vertices[i-1], vertices[i]);
} // FOR
Collection<DesignerEdge> edges = dgraph.findEdgeSet(vertices[i-1], vertices[i]);
assertNotNull(edges);
assertEquals(num_edges, edges.size());
}
} // FOR
GraphUtil.removeDuplicateEdges(dgraph);
for (int i = 1; i < vertices.length; i++) {
Collection<DesignerEdge> edges = dgraph.findEdgeSet(vertices[i-1], vertices[i]);
assertNotNull(edges);
assertEquals(1, edges.size());
} // FOR
}
/**
* testSave
*/
public void testSave() throws Exception {
this.writeFile(this.graph);
String contents = FileUtil.readFile(this.tempFile);
assertFalse(contents.isEmpty());
for (String table_name : TABLE_NAMES) {
assertTrue(contents.contains(table_name));
} // FOR
// System.out.println(contents);
}
/**
* testSaveConflictGraph
*/
public void testSaveConflictGraph() throws Exception {
ConflictGraph graph = new ConflictGraph(catalogContext.database);
assert(graph.getVertexCount() > 0);
assert(graph.getEdgeCount() > 0);
this.writeFile(graph);
String contents = FileUtil.readFile(this.tempFile);
assertFalse(contents.isEmpty());
for (AbstractVertex v : graph.getVertices()) {
Procedure catalog_proc = v.getCatalogItem();
assertTrue(catalog_proc.getName(), contents.contains(catalog_proc.getName()));
} // FOR
}
/**
* testLoadDirected
*/
public void testLoadDirected() throws Exception {
this.writeFile(this.graph);
String contents = FileUtil.readFile(this.tempFile);
assertFalse(contents.isEmpty());
//System.out.println(contents);
AbstractDirectedGraph<DesignerVertex, DesignerEdge> clone = new AbstractDirectedGraph<DesignerVertex, DesignerEdge>(catalogContext.database) {
private static final long serialVersionUID = 1L;
};
GraphUtil.load(clone, catalogContext.database, this.tempFile);
this.checkGraph(EdgeType.DIRECTED, clone);
}
/**
* testLoadUnDirected
*/
// public void testLoadUnDirected() throws Exception {
// this.writeFile();
//
// String contents = FileUtil.readFile(tempFile);
// assertFalse(contents.isEmpty());
// //System.out.println(contents);
//
// AbstractUndirectedGraph<Vertex, Edge> clone = new AbstractUndirectedGraph<Vertex, Edge>(catalogContext.database) {
// };
// GraphUtil.load(clone, catalogContext.database, this.tempFile.getAbsolutePath());
// this.checkGraph(EdgeType.DIRECTED, clone);
// }
}