package org.aksw.jena_sparql_api.views; import org.aksw.commons.util.reflect.MultiMethod; import org.aksw.jena_sparql_api.exprs_ext.E_GeomFromText; import org.aksw.jena_sparql_api.exprs_ext.E_Intersects; import org.apache.jena.sparql.expr.E_LangMatches; import org.apache.jena.sparql.expr.E_OneOf; import org.apache.jena.sparql.expr.E_Regex; import org.apache.jena.sparql.expr.E_Str; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprFunction; import org.apache.jena.sparql.expr.ExprList; /** * Methods of this class are invoked for each rdf-function * after all its arguments have been pushed. * * * * * TODO Rename to PostPush. * * * Documentation below is outdated. * ------------------------------------------------- * Invoked on methods before a push is attempted. * This gives us a chance to tranform for instance * regex(term(id, lex, lang, dt)) into * regex(lex) * * So basically it gives functions an opportunity to capture rdfterm arguments * * By default arguments are pushed first. * * TODO We need to identify different types of traversal * (probably just child first (bottom up) and parent first (top down) * and somehow allow to plug in the transformers * * @author raven * */ public class SqlPrePusher { public static Expr prePush(ExprFunction expr) { return (Expr)MultiMethod.invokeStatic(SqlPrePusher.class, "_prePush", expr); } public static E_RdfTerm asRdfTerm(Expr expr) { E_RdfTerm result = null; if(expr instanceof E_RdfTerm) { result = (E_RdfTerm)expr; } /* else if(expr instanceof E_Function) { // TODO Should not be needed anymore E_Function func = (E_Function)expr; if(func.getFunctionIRI().equals(SparqlifyConstants.rdfTermLabel)) { result = new E_RdfTerm(func.getArgs()); } }*/ return result; } public static Expr _prePush(Expr expr) { return expr; } /* public static Expr _prePush(E_Lang expr) { ExprRdfTerm rdfTerm = asRdfTerm(expr.getArgs().get(0)); if(rdfTerm == null) { return expr; } else { //return ExprCopy.copyMM(expr, rdfTerm.getLanguageTag()); return rdfTerm.getLanguageTag(); } }*/ public static Expr getTypeOrExpr(Expr expr) { E_RdfTerm term = asRdfTerm(expr); Expr result = (term != null) ? term.getType() : expr; return result; } public static Expr getLexicalValueOrExpr(Expr expr) { E_RdfTerm term = asRdfTerm(expr); Expr result = (term != null) ? term.getLexicalValue() : expr; return result; } public static Expr getDatatypeOrExpr(Expr expr) { E_RdfTerm term = asRdfTerm(expr); Expr result = (term != null) ? term.getDatatype() : expr; return result; } public static Expr getLanguageTagOrExpr(Expr expr) { E_RdfTerm term = asRdfTerm(expr); Expr result = (term != null) ? term.getLanguageTag() : expr; return result; } /* public static Expr _prePush(E_Equals expr) { System.out.println("Here"); return null; }*/ /* public static Expr _prePush(E_IsIRI expr) { return new E_Equals(getTypeOrExpr(expr.getArg()), new ExprSqlBridge(new SqlExprValue(1))); } */ public static Expr _prePush(E_OneOf expr) { ExprList newArgs = new ExprList(); for(Expr arg : expr.getArgs()) { newArgs.add(getLexicalValueOrExpr(arg)); } return ExprCopy.getInstance().copy(expr, newArgs); } public static Expr _prePush(E_Intersects expr) { return new E_Intersects(getLexicalValueOrExpr(expr.getArg1()), getLexicalValueOrExpr(expr.getArg2())); } // public static Expr _prePush(E_GenericSqlExpr expr) { // ExprList newArgs = new ExprList(); // for(Expr arg : expr.getArgs()) { // newArgs.add(getLexicalValueOrExpr(arg)); // } // return ExprCopy.getInstance().copy(expr, newArgs); // } public static Expr _prePush(E_GeomFromText expr) { return new E_GeomFromText(getLexicalValueOrExpr(expr.getArg())); } //public static Expr _pre public static Expr _prePush(E_LangMatches expr) { return new E_LangMatches(getLanguageTagOrExpr(expr.getArg1()), getLexicalValueOrExpr(expr.getArg2())); /* ExprRdfTerm rdfTerm = asRdfTerm(expr.getArgs().get(0)); if(rdfTerm == null) { return expr; } else { return ExprCopy.copyMM(expr, rdfTerm.getLanguageTag()); }*/ } public static Expr _prePush(E_Str expr) { //return asRdfTerm(expr.getArg()).getLexicalValue(); return getLexicalValueOrExpr(expr.getArg()); //ExprRdfTerm result = new ExprRdfTerm(NodeValue.makeInteger(2), getLexicalValueOrExpr(expr.getArg()), NodeValue.makeString(""), NodeValue.makeString("")); //return result; } public static Expr _prePush(E_Regex expr) { E_RdfTerm rdfTerm = asRdfTerm(expr.getArgs().get(0)); if(rdfTerm == null) { return expr; } else { ExprList args = new ExprList(); args.add(rdfTerm.getLexicalValue()); for(int i = 1; i < expr.getArgs().size(); ++i) { args.add(expr.getArgs().get(i)); } return ExprCopy.getInstance().copy(expr, args); } } /* public static Aggregator _prePush(AggCount count) { E_RdfTerm rdfTerm = asRdfTerm }*/ public static Expr _prePush(ExprFunction expr) { return getLexicalValueOrExpr(expr); } }