package eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime;
import java.util.Iterator;
import com.hp.hpl.jena.graph.Node_ANY;
import com.hp.hpl.jena.graph.Node_Blank;
import com.hp.hpl.jena.graph.Node_Literal;
import com.hp.hpl.jena.graph.Node_URI;
import com.hp.hpl.jena.graph.Node_Variable;
import com.hp.hpl.jena.graph.impl.LiteralLabel;
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.sparql.core.TriplePath;
import com.hp.hpl.jena.sparql.syntax.ElementEventGraph;
import com.hp.hpl.jena.sparql.syntax.ElementGroup;
import com.hp.hpl.jena.sparql.syntax.ElementPathBlock;
import eu.play_platform.platformservices.bdpl.VariableTypes;
/**
* Generates "TriplestoreQuery" described in BDPL grammar.
* @author sobermeier
*
*/
public class TriplestoreQueryVisitor extends GenericVisitor {
private String triplestoreQuery;
private UniqueNameManager uniqueNameManager;
private String aggregateValuesCode;
// Start
@Override
public void visit(ElementEventGraph el) {
// Visit triples
triplestoreQuery = "";
aggregateValuesCode = "";
el.getElement().visit(this);
}
@Override
public void visit(ElementGroup el) {
// Visit all group elements
for(int i=0; i<el.getElements().size(); i++){
el.getElements().get(i).visit(this);
}
}
public TriplestoreQueryVisitor(UniqueNameManager uniqueNameManager){
triplestoreQuery = "";
aggregateValuesCode = "";
this.uniqueNameManager = uniqueNameManager;
}
public String getTriplestoreQueryGraphTerms() {
return triplestoreQuery;
}
@Override
public Object visitAny(Node_ANY it) {
return null;
}
@Override
public Object visitBlank(Node_Blank it, AnonId id) {
throw new RuntimeException("Node_Blank is not allowed.");
}
@Override
public Object visitLiteral(Node_Literal it, LiteralLabel lit) {
triplestoreQuery += "'" + lit.getLexicalForm() + "', ";
return lit;
}
@Override
public Object visitURI(Node_URI it, String uri) {
triplestoreQuery += "'" + uri + "', ";
return uri;
}
@Override
public Object visitVariable(Node_Variable it, String name) {
//Add code to save values.
if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.SAMPLE_TYPE)){
logger.error("VariableTypes.SAMPLE_TYPE is not implemented in dETALIS");
}else if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.COUNT_TYPE)){
logger.error("VariableTypes.COUNT_TYPE is not implemented in dETALIS");
}else if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.AVG_TYPE)){
aggregateValuesCode += ", addAgregatValue(" + uniqueNameManager.getAggrDbId() + ", " + "V" + name + ")";
}else if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.MIN_TYPE)){
aggregateValuesCode += ", storeMin(" + uniqueNameManager.getAggrDbId() + ", " + "V" + name + ")";
}else if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.MIN_TYPE)){
aggregateValuesCode += ", storeMin(" + uniqueNameManager.getAggrDbId() + ", " + "V" + name + ")";
}else if(UniqueNameManager.getVariableTypeManage().isType(name, VariableTypes.SUM_TYPE)){
aggregateValuesCode += ", sumAdd(" + uniqueNameManager.getAggrDbId() + ", " + "V" + name + ")";
}
StringBuffer resultNode = new StringBuffer();
//It is part of a blank node.
if (name.startsWith("?")) {
// Transform number to uppercase char.
for (int i = 1; i < name.length(); ++i) {
char c = name.charAt(i);
resultNode.append("V" +(char)(c+17));
resultNode.append(", ");
}
triplestoreQuery += resultNode.toString();
return resultNode.toString();
}else{
//It is a ordinary vraible.
triplestoreQuery += "V" + name + ", ";
return "V" + name;
}
}
@Override
public void visit(ElementPathBlock el) {
Iterator<TriplePath> iter = el.getPattern().getList().iterator();
// Generate db queries.
while (iter.hasNext()) {
triplestoreQuery += "rdf(";
TriplePath tmpTriplePath = iter.next();
// Get data from one graph
tmpTriplePath.getSubject().visitWith(this);
tmpTriplePath.getPredicate().visitWith(this);
tmpTriplePath.getObject().visitWith(this);
triplestoreQuery += uniqueNameManager.getTriplestoreVariable() + ")";
//Add save aggregate values code if it exists.
if(!aggregateValuesCode.equals("")){
triplestoreQuery += aggregateValuesCode;
}
if(iter.hasNext()){
triplestoreQuery += ", ";
}
}
}
}