package org.aksw.jena_sparql_api.algebra.transform; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Predicate; import org.aksw.jena_sparql_api.utils.ExprUtils; import org.apache.jena.sparql.expr.E_Add; import org.apache.jena.sparql.expr.E_Equals; import org.apache.jena.sparql.expr.E_Multiply; import org.apache.jena.sparql.expr.E_Subtract; import org.apache.jena.sparql.expr.E_UnaryPlus; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprFunction2; import org.apache.jena.sparql.expr.ExprTransformCopy; public class ExprTransformVariableOrder extends ExprTransformCopy { protected Predicate<Expr> isSymmetric; public ExprTransformVariableOrder() { this(ExprTransformVariableOrder::isSymmetric); } public ExprTransformVariableOrder(Predicate<Expr> isSymmetric) { super(); this.isSymmetric = isSymmetric; } @Override public Expr transform(ExprFunction2 func, Expr a, Expr b) { List<Expr> args = Arrays.asList(a, b); if(isSymmetric.test(func)) { Collections.sort(args, ExprUtils::compare); } return super.transform(func, args.get(0), args.get(1)); } public static final Set<Class<?>> symmetricExprClasses = new HashSet<>(Arrays.asList( E_Equals.class, E_Add.class, E_Multiply.class )); public static boolean isSymmetric(Expr e) { boolean result = symmetricExprClasses.contains(e.getClass()); return result; } }