package org.jaxen.expr; import java.util.Iterator; import java.util.List; import org.jaxen.Context; import org.jaxen.JaxenException; import org.jaxen.Navigator; import org.openrdf.model.Value; import eu.fbk.knowledgestore.data.Data; import eu.fbk.knowledgestore.data.XPath; abstract class DefaultRelationalExpr extends DefaultTruthExpr implements RelationalExpr { /** * */ private static final long serialVersionUID = -3565329669240565813L; DefaultRelationalExpr(final Expr lhs, final Expr rhs) { super(lhs, rhs); } @Override public String toString() { return "[(DefaultRelationalExpr): " + getLHS() + ", " + getRHS() + "]"; } @Override public Object evaluate(final Context context) throws JaxenException { final Object lhsValue = getLHS().evaluate(context); final Object rhsValue = getRHS().evaluate(context); final Navigator nav = context.getNavigator(); if (bothAreSets(lhsValue, rhsValue)) { return evaluateSetSet((List) lhsValue, (List) rhsValue, nav); } if (eitherIsSet(lhsValue, rhsValue)) { if (isSet(lhsValue)) { return evaluateSetSet((List) lhsValue, convertToList(rhsValue), nav); } else { return evaluateSetSet(convertToList(lhsValue), (List) rhsValue, nav); } } return evaluateObjectObject(lhsValue, rhsValue, nav) ? Boolean.TRUE : Boolean.FALSE; } private Object evaluateSetSet(final List lhsSet, final List rhsSet, final Navigator nav) { if (setIsEmpty(lhsSet) || setIsEmpty(rhsSet)) // return false if either is null or empty { return Boolean.FALSE; } for (final Iterator lhsIterator = lhsSet.iterator(); lhsIterator.hasNext();) { final Object lhs = lhsIterator.next(); for (final Iterator rhsIterator = rhsSet.iterator(); rhsIterator.hasNext();) { final Object rhs = rhsIterator.next(); if (evaluateObjectObject(lhs, rhs, nav)) { return Boolean.TRUE; } } } return Boolean.FALSE; } private boolean evaluateObjectObject(final Object lhs, final Object rhs, final Navigator nav) { if (lhs == null || rhs == null) { return false; } final Value lhsValue = Data.convert(XPath.unwrap(lhs), Value.class); final Value rhsValue = Data.convert(XPath.unwrap(rhs), Value.class); final int result = Data.getTotalComparator().compare(lhsValue, rhsValue); switch (getOperator()) { case "<": return result < 0; case ">": return result > 0; case "=": return result == 0; case "<=": return result <= 0; case ">=": return result >= 0; case "!=": return result != 0; default: return false; } // // final Double lhsNum = NumberFunction.evaluate(lhs, nav); // final Double rhsNum = NumberFunction.evaluate(rhs, nav); // // if (NumberFunction.isNaN(lhsNum) || NumberFunction.isNaN(rhsNum)) { // return false; // } // // return evaluateDoubleDouble(lhsNum, rhsNum); } protected abstract boolean evaluateDoubleDouble(Double lhs, Double rhs); }