package org.aksw.sparqlify.core.rewrite.expr.transform;
import java.util.ArrayList;
import java.util.List;
import org.aksw.jena_sparql_api.utils.ExprUtils;
import org.aksw.jena_sparql_api.views.E_RdfTerm;
import org.aksw.sparqlify.core.cast.TypeSystem;
import org.aksw.sparqlify.core.cast.TypeSystemImpl;
import org.aksw.sparqlify.core.datatypes.SparqlFunction;
import org.apache.jena.sparql.expr.E_Add;
import org.apache.jena.sparql.expr.E_LogicalAnd;
import org.apache.jena.sparql.expr.Expr;
import org.apache.jena.sparql.expr.ExprFunction;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.vocabulary.XSD;
public class ExprTransformers2 {
// TODO Replace with a proper type system
public static final Expr dummyDatatype = NodeValue.makeString("http://example.org/replacemelater");
// TODO Ideally we would have access to a proper model of the SPRAQL
// types and functions
public static TypeSystem typeSystem = new TypeSystemImpl();
static {
//sparqlTypeSystem.
}
public static E_RdfTerm _transform(Expr expr) {
return null;
}
// TODO we need again access to some model of the valid combination of datatypes for sparql functions
/**
*
* @param expr
* @return
*/
public static E_RdfTerm transform(E_LogicalAnd expr) {
E_RdfTerm result = null;
E_RdfTerm a = _transform(expr.getArg1());
// Short circuit evaluation
if(a.getLexicalValue().equals(NodeValue.FALSE)) {
result = E_RdfTerm.createTypedLiteral(NodeValue.FALSE, XSD.xboolean);
return result;
}
E_RdfTerm b = _transform(expr.getArg2());
Expr newExpr = new E_LogicalAnd(a.getLexicalValue(), b.getLexicalValue());
result = E_RdfTerm.createTypedLiteral(newExpr, XSD.xboolean);
return result;
}
public static E_RdfTerm transformFunction(ExprFunction fn) {
List<Expr> args = fn.getArgs();
List<E_RdfTerm> argTerms = new ArrayList<E_RdfTerm>(args.size());
for(Expr arg : args) {
E_RdfTerm argTerm = _transform(arg);
argTerms.add(argTerm);
}
String functionName = ExprUtils.getFunctionId(fn);
SparqlFunction function = typeSystem.getSparqlFunction(functionName);
// TODO And what now?
// What methods does the function object need?
//function.get
//E_RdfTerm a = _transform(expr.getArg1());
//E_RdfTerm b = _transform(expr.getArg2());
//Expr newExpr = new E_LogicalAnd(a.getLexicalValue(), b.getLexicalValue());
//E_RdfTerm result = E_RdfTerm.createTypedLiteral(newExpr, dummyDatatype);
//return result;
return null;
}
public static E_RdfTerm transform(E_Add expr) {
E_RdfTerm a = _transform(expr.getArg1());
E_RdfTerm b = _transform(expr.getArg2());
Expr newExpr = new E_LogicalAnd(a.getLexicalValue(), b.getLexicalValue());
E_RdfTerm result = E_RdfTerm.createTypedLiteral(newExpr, dummyDatatype);
return result;
}
public static E_RdfTerm transformAdd(E_RdfTerm a, E_RdfTerm b) {
return null;
}
}