package org.aksw.sparqlify.core.rewrite.expr.transform;
import java.util.List;
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;
public class ExprTransformerLogicalAndDontUse
//implements ExprTransformer
{
public static NodeValue min(NodeValue a, NodeValue b) {
if(a.equals(NodeValue.nvNothing)) {
if(!(b.equals(NodeValue.FALSE))) {
return a;
} else {
return b;
}
} else if(a.equals(NodeValue.FALSE)) {
return a;
} else {
// If a is true, the result solely depends on b
return b;
}
}
/**
* Return the "lower" constant with:
* 0 < e < 1
*
*
* @param a
* @param b
* @return
*/
public static Expr getLowerConstant(Expr a, Expr b) {
NodeValue result = null;
if(a.isConstant()) {
result = a.getConstant();
}
if(b.isConstant()) {
NodeValue bValue = b.getConstant();
if(result != null) {
result = min(result, bValue);
} else {
result = bValue;
}
}
return result;
}
//@Override
public Expr transform(ExprFunction fn) {
List<Expr> args = fn.getArgs();
if(args.size() != 2) {
throw new RuntimeException("Invalid number of arguments; 1 expected, got: " + fn);
}
// FIXME Check whether lang has the right number of argument
Expr left = args.get(0);
Expr right = args.get(1);
Expr tmp = getLowerConstant(left, right);
// If there is no constant, just return
if(tmp == null ) {
return fn;
}
if(tmp.equals(NodeValue.FALSE)) {
return NodeValue.FALSE;
}
Expr fnArg = left.isFunction() ? left : right;
if(fnArg.isFunction()) {
if(tmp.equals(NodeValue.TRUE)) {
return fnArg;
} else {
return new E_LogicalAnd(tmp, fnArg);
}
} else {
return tmp;
}
}
}