On Jun 15, 2012, at 5:06 PM, Eldon Carman wrote: > Ok. Now for these mixed types that are added together, there is a > promotion order. Basically the largest numeric type gets used. I have > been trying to find documentation on the promotion order. Is that what > I listed before? (size order) > > 1. double (double-precision 64-bit floating point type) - Java type double > 2. float (single-precision 32-bit floating point type) - Java type float > 3. decimal (a minimum of 18 decimal digits) - Java type double ??? > 4. integer (a decimal type with a fixed decimal point) - Java type long > > Also do you know where that is in the xquery specification?
Here it is: http://www.w3.org/TR/xquery/#id-type-promotion-and-operator-mapping > On Fri, Jun 15, 2012 at 4:39 PM, Vinayak Borkar <[email protected]> wrote: >> Lexicographical order is text sort order. So: >> >> decimal >> double >> float >> integer >> >> xs:integer is supposed to be infinite precision, but we represent it as a 64 >> bit fixed-precision signed-integer which is a long in java. >> >> Vinayak >> >> >> >> On 6/15/12 3:11 PM, Eldon Carman wrote: >>> >>> Thanks for the scaffolding. I have two questions. Is this the correct >>> lexicographical order? >>> 1. double >>> 2. float >>> 3. decimal >>> 4. integer >>> >>> Also do we always referrer to a integer as a long for this implementation? >>> >>> Preston >>> >>> On Fri, Jun 15, 2012 at 7:09 AM, Vinayak Borkar<[email protected]> wrote: >>>> >>>> Preston, >>>> >>>> >>>> I have now added some scaffolding so that implementing the arithmetic >>>> functions will be easier. >>>> >>>> I have also added the code for xs:integer + xs:integer which is needed >>>> for >>>> the 1 + 1 example, ant it works end-to-end. >>>> >>>> Look at the AddScalarEvaluatorFactory class. You will be creating a class >>>> like that for each of Subtract, Multiply, and Divide by extending >>>> AbstractArithmeticScalarEvaluatorFactory. >>>> >>>> The only method that you have to implement when you extend >>>> AbstractArithmeticScalarEvaluatorFactory is the >>>> createArithmeticOperation() >>>> method that creates an instance of AbstractArithmeticOperation. >>>> >>>> For example, the one for Add looks like this: >>>> >>>> @Override >>>> protected AbstractArithmeticOperation createArithmeticOperation() { >>>> return new AddOperation(); >>>> } >>>> >>>> >>>> The AddOperation implements all the logic for what it means to add two >>>> values of various types. >>>> >>>> The AbstractArithmeticScalarEvaluatorFactory has all the logic to >>>> correctly >>>> dispatch to the correct method in AbstractArithmeticOperation based on >>>> XQuery rules. >>>> >>>> As your next step, please implement all the methods in AddOperation. The >>>> methods in this class look like >>>> >>>> void operateXY(X x, Y y, DataOutput dOut) >>>> >>>> where X and Y are type names. >>>> >>>> For example the method that computes the result for xs:integer and >>>> xs:double >>>> would read: >>>> >>>> void operateIntegerDouble(LongPointable longp, DoublePointable doublep, >>>> DataOutput dOut) >>>> >>>> Since Add is commutative, you can implement about half of the methods by >>>> delegating to the other half (by switching the arguments). The convention >>>> you should follow is have operateXY delegate to operateYX when X is >>>> lexicographically greater than Y. >>>> >>>> So in the above example, operateIntegerDouble will delegate to >>>> operateDoubleInteger in the AddOperation class. >>>> >>>> Note that this trick does not apply to Minus and Divide, but applied to >>>> Multiply. >>>> >>>> Let us know how it goes with implementing the unimplemented methods in >>>> AddOperation and then implemnting the other arithmetic operation classes. >>>> >>>> Vinayak >>> >>> >>
