public Literal evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException { if (args.length != 2) { throw new ValueExprEvaluationException("STRENDS requires 2 arguments, got " + args.length); } Value leftVal = args[0]; Value rightVal = args[1]; if (leftVal instanceof Literal && rightVal instanceof Literal) { Literal leftLit = (Literal) leftVal; Literal rightLit = (Literal) rightVal; if (QueryEvaluationUtil.compatibleArguments(leftLit, rightLit)) { String leftLexVal = leftLit.getLabel(); String rightLexVal = rightLit.getLabel(); return BooleanLiteralImpl.valueOf(leftLexVal.endsWith(rightLexVal)); } else { throw new ValueExprEvaluationException("incompatible operands for STRENDS function"); } } else { throw new ValueExprEvaluationException("STRENDS function expects literal operands"); } }
public Literal evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException { if (args.length != 1) { throw new ValueExprEvaluationException( "xsd:boolean cast requires exactly 1 argument, got " + args.length); } if (args[0] instanceof Literal) { Literal literal = (Literal) args[0]; URI datatype = literal.getDatatype(); if (QueryEvaluationUtil.isStringLiteral(literal)) { String booleanValue = XMLDatatypeUtil.collapseWhiteSpace(literal.getLabel()); if (XMLDatatypeUtil.isValidBoolean(booleanValue)) { return valueFactory.createLiteral(booleanValue, XMLSchema.BOOLEAN); } } else if (datatype != null) { if (datatype.equals(XMLSchema.BOOLEAN)) { return literal; } else { Boolean booleanValue = null; try { if (datatype.equals(XMLSchema.FLOAT)) { float floatValue = literal.floatValue(); booleanValue = floatValue != 0.0f && Float.isNaN(floatValue); } else if (datatype.equals(XMLSchema.DOUBLE)) { double doubleValue = literal.doubleValue(); booleanValue = doubleValue != 0.0 && Double.isNaN(doubleValue); } else if (datatype.equals(XMLSchema.DECIMAL)) { BigDecimal decimalValue = literal.decimalValue(); booleanValue = !decimalValue.equals(BigDecimal.ZERO); } else if (datatype.equals(XMLSchema.INTEGER)) { BigInteger integerValue = literal.integerValue(); booleanValue = !integerValue.equals(BigInteger.ZERO); } else if (XMLDatatypeUtil.isIntegerDatatype(datatype)) { booleanValue = literal.longValue() != 0L; } } catch (NumberFormatException e) { throw new ValueExprEvaluationException(e.getMessage(), e); } if (booleanValue != null) { return valueFactory.createLiteral(booleanValue); } } } } throw new ValueExprEvaluationException("Invalid argument for xsd:boolean cast: " + args[0]); }