package org.aksw.jena_sparql_api.views; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.aksw.commons.util.reflect.MultiMethod; import org.apache.commons.lang.NotImplementedException; import org.apache.jena.graph.Node; import org.apache.jena.sparql.algebra.Op; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprAggregator; import org.apache.jena.sparql.expr.ExprFunction; import org.apache.jena.sparql.expr.ExprFunctionOp; import org.apache.jena.sparql.expr.ExprList; import org.apache.jena.sparql.expr.ExprVar; import org.apache.jena.sparql.expr.NodeValue; import org.apache.jena.sparql.expr.aggregate.Aggregator; /** * Can replace nodes with expressions * * @author raven * */ public class NodeExprSubstitutor { private Map<? extends Node, ? extends Expr> map; /* public static ExprList apply(NodeExprSubstitutor substitutor, ExprList exprs) { ExprList result = new ExprList(); for(Expr expr : exprs) { Expr tmp = substitutor.transformList(exprs) } }*/ public static NodeExprSubstitutor create(Map<String, Expr> varNameToExpr) { Map<Var, Expr> tmp = new HashMap<Var, Expr>(); for(Entry<String, Expr> entry : varNameToExpr.entrySet()) { tmp.put(Var.alloc(entry.getKey()), entry.getValue()); } NodeExprSubstitutor result = new NodeExprSubstitutor(tmp); return result; } public NodeExprSubstitutor(Map<? extends Node, ? extends Expr> map) { this.map = map; } public ExprList transformMM(ExprList exprs) { ExprList result = new ExprList(); for(Expr expr : exprs) { Expr item = transformMM(expr); result.add(expr); } return result; } public Expr transformMM(Expr expr) { return expr == null ? null : (Expr)MultiMethod.invoke(this, "_transform", expr); } public Expr _transform(ExprFunction expr) { ExprList args = transformList(expr.getArgs()); Expr result = ExprCopy.getInstance().copy(expr, args); return result; } public ExprList transformList(Iterable<Expr> exprs) { ExprList result = new ExprList(); for(Expr expr : exprs) { result.add(transformMM(expr)); } return result; } /* public Expr _transform(ExprFunction0 func) { return func; } public Expr _transform(ExprFunction1 func, Expr expr1) { return func.copy(transformMM(func.getArg())); } @Override public Expr transform(ExprFunction2 func, Expr expr1, Expr expr2) { return func.copy(transformMM(func.getArg1()), transformMM(func.getArg2())); } @Override public Expr transform(ExprFunction3 func, Expr expr1, Expr expr2, Expr expr3) { return func.copy(transformMM(func.getArg1()), transformMM(func.getArg2()), transformMM(func.getArg3())); } @Override public Expr transform(ExprFunctionN func, ExprList args) { return (Expr)MultiMethod.invoke(func, "copy", transformList(args)); } */ public Expr _transform(ExprFunctionOp funcOp, ExprList args, Op opArg) { throw new NotImplementedException(); } public Expr _transform(NodeValue nv) { return nv; } public Expr _transform(ExprVar nv) { Expr tmp = map.get(nv.asVar()); return tmp != null ? tmp : nv; } public Expr _transform(ExprAggregator eAgg) { ExprList newAggExpr = this.transformMM(eAgg.getAggregator().getExprList()); Aggregator newAgg = eAgg.getAggregator().copy(newAggExpr); Expr newAggVar = this.transformMM(eAgg.getAggVar()); //ExprCopy.getInstance().copy(expr, eAgg.get) Expr result = new ExprAggregator(newAggVar.asVar(), newAgg); return result; //System.out.println("Aggregate"); //eAgg.getAggregator(). //AggCount //eAgg.get //throw new NotImplementedException(); } }