@Override public NodeValue eval(NodeValue x, NodeValue y) { if ( ARQ.isStrictMode() ) return XSDFuncOp.numAdd(x, y) ; return NodeValueOps.additionNV(x, y) ; }
@Override public NodeValue exec(NodeValue v) { return XSDFuncOp.abs(v) ; } }
private static boolean filterEBV(NodeValue nv) { try { return XSDFuncOp.booleanEffectiveValue(nv); } catch (ExprEvalException ex) { return false; } }
@Override public NodeValue getAccValue() { if ( count == 0 ) return noValuesToAvg ; NodeValue nvCount = NodeValue.makeInteger(count) ; return XSDFuncOp.numDivide(total, nvCount) ; }
@Override public NodeValue exec(NodeValue v) { return XSDFuncOp.ceiling(v) ; } }
@Override public NodeValue exec(NodeValue v) { return XSDFuncOp.floor(v) ; }
public static NodeValue multiplicationNV(NodeValue nv1, NodeValue nv2) { ValueSpaceClassification vs1 = nv1.getValueSpace() ; ValueSpaceClassification vs2 = nv2.getValueSpace() ; if ( vs1.equals(VSPACE_NUM) && vs2.equals(VSPACE_NUM) ) return XSDFuncOp.numMultiply(nv1, nv2) ; if ( vs1.equals(VSPACE_DURATION) && vs2.equals(VSPACE_NUM) ) { // ONLY defined for dayTime. Duration dur = nv1.getDuration() ; boolean valid = XSDFuncOp.isDayTime(dur) ; if ( ! valid ) throw new ExprEvalTypeException("Operator '*': only dayTime duration. Got: "+nv1) ; BigDecimal dec = nv2.getDecimal() ; Duration r = dur.multiply(dec) ; Node n = NodeFactoryExtra.createLiteralNode(r.toString(), null, dtXSDdayTimeDuration) ; return NodeValue.makeNodeDuration(r, n) ; } throw new ExprEvalTypeException("Operator '*' : Undefined multiply: "+nv1+" and "+nv2) ; }
@Override public NodeValue eval(NodeValue x, NodeValue y) { if ( ARQ.isStrictMode() ) return XSDFuncOp.numSubtract(x, y) ; return NodeValueOps.subtractionNV(x, y) ; }
return XSDFuncOp.dateTimeCast(nv, castType) ; if ( XSDFuncOp.isIntegerType(castType) ) { else if ( XSDDatatype.XSDdecimal.equals(castType) ) return cast$( ( b ? "1.0" : "0.0" ) , castType) ; else if ( XSDFuncOp.isIntegerType(castType)) return cast$( ( b ? "1" : "0" ) , castType ) ; else if ( XSDDatatype.XSDstring.equals(castType) )
/** Cast a NodeValue to a date/time type (xsd dateTime, date, time, g*) according to {@literal F&O} * <a href="http://www.w3.org/TR/xpath-functions/#casting-to-datetimes">17.1.5 Casting to date and time types</a> * Throws an exception on incorrect case. * * @throws ExprEvalTypeException */ public static NodeValue dateTimeCast(NodeValue nv, RDFDatatype rdfDatatype) { if ( !(rdfDatatype instanceof XSDDatatype) ) throw new ExprEvalTypeException("Can't cast to XSDDatatype: " + nv) ; XSDDatatype xsd = (XSDDatatype)rdfDatatype ; return dateTimeCast(nv, xsd) ; }
@Override public NodeValue eval(NodeValue x, NodeValue y) { if ( ARQ.isStrictMode() ) return XSDFuncOp.numMultiply(x, y) ; return NodeValueOps.multiplicationNV(x, y) ; }
@Override public NodeValue exec(NodeValue v) { return XSDFuncOp.sqrt(v) ; }
@Override public NodeValue getAccValue() { if ( count == 0 ) return noValuesToAvg ; if ( super.errorCount != 0 ) //throw new ExprEvalException("avg: error in group") ; return null ; NodeValue nvCount = NodeValue.makeInteger(count) ; return XSDFuncOp.numDivide(total, nvCount) ; } }
@Override public NodeValue eval(NodeValue v) { return XSDFuncOp.ceiling(v) ; }
@Override public NodeValue eval(NodeValue v) { return XSDFuncOp.floor(v) ; }
@Test public void testSubtractDoubleDecimal() { NodeValue nv1 = NodeValue.makeDouble(4.5) ; NodeValue nv2 = NodeValue.makeDecimal(3.5) ; NodeValue r = XSDFuncOp.numSubtract(nv1, nv2) ; assertTrue("Not a double: "+r, r.isDouble()) ; assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ; assertEquals("Wrong result", 1d, r.getDouble(), accuracyExact_D ) ; }
/** Cast a NodeValue to a date/time type (xsd dateTime, date, time, g*) according to {@literal F&O} * <a href="http://www.w3.org/TR/xpath-functions/#casting-to-datetimes">17.1.5 Casting to date and time types</a> * Throws an exception on incorrect case. * * @throws ExprEvalTypeException */ public static NodeValue dateTimeCast(NodeValue nv, String typeURI) { RDFDatatype t = NodeFactory.getType(typeURI) ; return dateTimeCast(nv, t) ; }
@Test public void testMultiplyDecimalInteger() { NodeValue nv1 = NodeValue.makeDecimal(3.5) ; NodeValue nv2 = NodeValue.makeInteger(2) ; NodeValue r = XSDFuncOp.numMultiply(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 7L, r.getDecimal().longValue()) ; }
@Test public void testSqrt2() { NodeValue four = NodeValue.makeDouble(4) ; NodeValue two = NodeValue.makeInteger(2) ; NodeValue result = XSDFuncOp.sqrt( four ) ; assertTrue(result.isDouble()) ; assertTrue( NodeValue.sameAs( two, result)) ; assertNotNull(result.asNode()) ; }
@Override protected void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv) { if ( nv.isNumber() ) { if ( total == null ) total = nv ; else total = XSDFuncOp.numAdd(nv, total) ; } else throw new ExprEvalException("Not a number: "+nv) ; }