package org.olap4j.driver.olap4ld.helper;
import org.olap4j.driver.olap4ld.linkeddata.BaseCubeOp;
import org.olap4j.driver.olap4ld.linkeddata.ConvertCubeOp;
import org.olap4j.driver.olap4ld.linkeddata.DiceOp;
import org.olap4j.driver.olap4ld.linkeddata.DrillAcrossOp;
import org.olap4j.driver.olap4ld.linkeddata.LogicalOlapOperatorQueryPlanVisitor;
import org.olap4j.driver.olap4ld.linkeddata.ProjectionOp;
import org.olap4j.driver.olap4ld.linkeddata.QueryException;
import org.olap4j.driver.olap4ld.linkeddata.RollupOp;
import org.olap4j.driver.olap4ld.linkeddata.SliceOp;
/**
* Creates dot notation of lqp.
*
* @author benedikt
*
*/
public class GraphVizVisualisationVisitor implements
LogicalOlapOperatorQueryPlanVisitor {
String start = "digraph G { \n";
String setting = "graph [rankdir=TB,label=\"Logical Query Plan\",labelloc=t] \n";
String nodedefinitions = "";
String edgedefinitions = "";
String end = "} \n";
@Override
public void visit(Object op) throws QueryException {
// TODO Auto-generated method stub
}
@Override
public void visit(ConvertCubeOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Convert-Cube: "+op.conversioncorrespondence.getname()+"\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp1.toString().hashCode()+"; \n";
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp2.toString().hashCode()+"; \n";
}
@Override
public void visit(DrillAcrossOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Drill-Across\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputop1.toString().hashCode()+"; \n";
edgedefinitions += op.toString().hashCode()+"->"+op.inputop2.toString().hashCode()+"; \n";
}
@Override
public void visit(RollupOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Roll-Up\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp.toString().hashCode()+"; \n";
}
@Override
public void visit(SliceOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Slice\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp.toString().hashCode()+"; \n";
}
@Override
public void visit(DiceOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Dice\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp.toString().hashCode()+"; \n";
}
@Override
public void visit(ProjectionOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Projection\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.inputOp.toString().hashCode()+"; \n";
}
@Override
public void visit(BaseCubeOp op) throws QueryException {
// nodedefinition
nodedefinitions += op.toString().hashCode()+"[label=\"Base-Cube\"]; \n";
nodedefinitions += op.dataseturi.toString().hashCode()+"[label=\""+op.dataseturi+"\"]; \n";
// edgedefinition
edgedefinitions += op.toString().hashCode()+"->"+op.dataseturi.toString().hashCode()+"; \n";
}
@Override
public Object getNewRoot() throws QueryException {
return start+setting+nodedefinitions+edgedefinitions+end;
}
}