This class evaluates arithmetic expressions; it acts as a helper class to the ArithmeticExpression
class. There are many subclasses for the different kinds of arithmetic expression, and static methods
that allow the right subclass to be selected, either at compile time or at run time.
ANY_ANY
public static Calculator[] ANY_ANY
Calculators used for the six operators when the static type information does not allow
a more specific calculator to be chosen
DATETIME_DATETIME
public static Calculator[] DATETIME_DATETIME
Calculators used when both operands are xs:dateTime, xs:date, or xs:time
DATETIME_DURATION
public static Calculator[] DATETIME_DURATION
Calculators used when the first operand is xs:dateTime, xs:date, or xs:time,
and the second is a duration
DECIMAL_DECIMAL
public static Calculator[] DECIMAL_DECIMAL
DECIMAL_DOUBLE
public static Calculator[] DECIMAL_DOUBLE
Calculators used when the first operand is a decimal
DECIMAL_FLOAT
public static Calculator[] DECIMAL_FLOAT
DECIMAL_INTEGER
public static Calculator[] DECIMAL_INTEGER
DIV
public static final int DIV
DOUBLE_DECIMAL
public static Calculator[] DOUBLE_DECIMAL
DOUBLE_DOUBLE
public static Calculator[] DOUBLE_DOUBLE
Calculators used when the first operand is a double
DOUBLE_FLOAT
public static Calculator[] DOUBLE_FLOAT
DOUBLE_INTEGER
public static Calculator[] DOUBLE_INTEGER
DURATION_DATETIME
public static Calculator[] DURATION_DATETIME
Calculators used when the second operand is xs:dateTime, xs:date, or xs:time,
and the first is a duration
DURATION_DURATION
public static Calculator[] DURATION_DURATION
Calculators used when the both operands are durations
DURATION_NUMERIC
public static Calculator[] DURATION_NUMERIC
Calculators used when the first operand is a duration and the second is numeric
FLOAT_DECIMAL
public static Calculator[] FLOAT_DECIMAL
FLOAT_DOUBLE
public static Calculator[] FLOAT_DOUBLE
Calculators used when the first operand is a float
FLOAT_INTEGER
public static Calculator[] FLOAT_INTEGER
IDIV
public static final int IDIV
INTEGER_DECIMAL
public static Calculator[] INTEGER_DECIMAL
INTEGER_DOUBLE
public static Calculator[] INTEGER_DOUBLE
Calculators used when the first operand is an integer
INTEGER_FLOAT
public static Calculator[] INTEGER_FLOAT
INTEGER_INTEGER
public static Calculator[] INTEGER_INTEGER
MINUS
public static final int MINUS
MOD
public static final int MOD
NUMERIC_DURATION
public static Calculator[] NUMERIC_DURATION
Calculators used when the second operand is a duration and the first is numeric
PLUS
public static final int PLUS
TIMES
public static final int TIMES
compute
public abstract AtomicValue compute(AtomicValue a,
AtomicValue b,
XPathContext c)
throws XPathException
Perform an arithmetic operation
a
- the first operand. Must not be null, and must be an instance of the type implied by the
class name.b
- the second operand. Must not be null, and must be an instance of the type implied by the
class name.c
- the XPath dynamic evaluation context
- the result of the computation, as a value of the correct primitive type
getCalculator
public static Calculator getCalculator(int typeA,
int typeB,
int operator,
boolean mustResolve)
Factory method to get a calculator for a given combination of types
typeA
- fingerprint of the primitive type of the first operandtypeB
- fingerprint of the primitive type of the second operandoperator
- the arithmetic operator in usemustResolve
- indicates that a concrete Calculator is required (rather than
an ANY_ANY calculator which needs to be further resolved at run-time)
- null if no suitable Calculator can be found.
getCalculatorSetName
public static String getCalculatorSetName(int typeA,
int typeB)
Get the name of the calculator set for a given combination of types
typeA
- the fingerprint of the primitive type of the first operandtypeB
- the fingerprint of the primitive type of the second operand
- null if no suitable Calculator can be found.
getResultType
public abstract AtomicType getResultType(AtomicType typeA,
AtomicType typeB)
Get the type of the result of the calculator, given arguments types typeA and typeB
typeA
- the type of the first operandtypeB
- the type of the second operand