package org.aksw.jena_sparql_api.utils;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.core.VarExprList;
import org.apache.jena.sparql.expr.Expr;
import org.apache.jena.sparql.expr.ExprTransform;
import org.apache.jena.sparql.expr.ExprTransformer;
import org.apache.jena.sparql.expr.ExprVar;
import org.apache.jena.sparql.expr.ExprVars;
public class VarExprListUtils {
public static VarExprList createFromVarMap(Map<Var, Var> varMap) {
VarExprList result = new VarExprList();
for(Entry<Var, Var> e : varMap.entrySet()) {
Var v = e.getKey();
Var w = e.getValue();
if(v.equals(w)) {
result.add(w);
} else {
result.add(w, new ExprVar(v));
}
}
return result;
}
/**
* Get the referenced variables
*
* @param vel
* @return
*/
public static Set<Var> getRefVars(VarExprList vel) {
Set<Var> result = new HashSet<Var>();
for(Entry<Var, Expr> entry : vel.getExprs().entrySet()) {
if(entry.getValue() == null) {
result.add(entry.getKey());
} else {
Set<Var> vs = ExprVars.getVarsMentioned(entry.getValue());
result.addAll(vs);
}
}
return result;
}
private static Expr transform(Expr expr, ExprTransform exprTransform)
{
if ( expr == null || exprTransform == null )
return expr ;
return ExprTransformer.transform(exprTransform, expr) ;
}
// Copied from package org.apache.jena.sparql.algebra.ApplyTransformVisitor;
public static VarExprList transform(VarExprList varExpr, ExprTransform exprTransform)
{
List<Var> vars = varExpr.getVars() ;
VarExprList varExpr2 = new VarExprList() ;
boolean changed = false ;
for ( Var v : vars )
{
Expr newVE = exprTransform.transform(new ExprVar(v));
Var newV = newVE == null ? v : ((ExprVar)newVE).asVar();
changed = !v.equals(newV);
Expr e = varExpr.getExpr(v) ;
Expr e2 = e ;
if ( e != null )
e2 = transform(e, exprTransform) ;
if ( e2 == null )
varExpr2.add(newV) ;
else
varExpr2.add(newV, e2) ;
if ( e != e2 )
changed = true ;
}
if ( ! changed )
return varExpr ;
return varExpr2 ;
}
public static void replace(VarExprList dst, VarExprList src) {
if(dst != src) {
dst.clear();
copy(dst, src);
}
}
public static void copy(VarExprList dst, VarExprList src) {
for(Var v : src.getVars()) {
Expr e = src.getExpr(v);
if(e == null) {
dst.add(v);
} else {
dst.add(v, e);
}
}
}
}