You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2012/07/12 04:46:28 UTC

svn commit: r1360516 [1/2] - /incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/

Author: prestonc
Date: Thu Jul 12 02:46:28 2012
New Revision: 1360516

URL: http://svn.apache.org/viewvc?rev=1360516&view=rev
Log:
VXQUERY-33 The update adds missing date, time and datetime arithmetic functions. In addition to correct exceptions for unsupported function and overflow computations.

Modified:
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticOperation.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticScalarEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticOperation.java?rev=1360516&r1=1360515&r2=1360516&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticOperation.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticOperation.java Thu Jul 12 02:46:28 2012
@@ -2,6 +2,7 @@ package org.apache.vxquery.runtime.funct
 
 import java.io.DataOutput;
 
+import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDecimalPointable;
@@ -13,150 +14,144 @@ import edu.uci.ics.hyracks.data.std.prim
 import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
 
 public abstract class AbstractArithmeticOperation {
-    public abstract void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
-            throws Exception;
-
-    public abstract void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
-            throws Exception;
+    public abstract void operateDateDate(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx,
+            DataOutput dOut) throws Exception;
 
-    public abstract void operateDecimalFloat(XSDecimalPointable decp, FloatPointable floatp, DataOutput dOut)
+    public abstract void operateDateDTDuration(XSDatePointable datep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDecimalDouble(XSDecimalPointable decp, DoublePointable doublep, DataOutput dOut)
-            throws Exception;
+    public abstract void operateDatetimeDatetime(XSDateTimePointable datetimep1, XSDateTimePointable datetimep2,
+            DynamicContext dCtx, DataOutput dOut) throws Exception;
 
-    public abstract void operateDecimalDTDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDatetimeDTDuration(XSDateTimePointable datetimep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDecimalYMDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDatetimeYMDuration(XSDateTimePointable datetimep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerDecimal(LongPointable longp, XSDecimalPointable decp, DataOutput dOut)
+    public abstract void operateDateYMDuration(XSDatePointable datep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut)
+    public abstract void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerFloat(LongPointable longp, FloatPointable floatp, DataOutput dOut)
+    public abstract void operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerDouble(LongPointable longp, DoublePointable doublep, DataOutput dOut)
+    public abstract void operateDecimalDTDuration(XSDecimalPointable decp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatDecimal(FloatPointable floatp, XSDecimalPointable decp, DataOutput dOut)
+    public abstract void operateDecimalYMDuration(XSDecimalPointable decp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatInteger(FloatPointable floatp, LongPointable longp, DataOutput dOut)
+    public abstract void operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatFloat(FloatPointable floatp, FloatPointable floatp2, DataOutput dOut)
+    public abstract void operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatDouble(FloatPointable floatp, DoublePointable doublep, DataOutput dOut)
+    public abstract void operateDoubleDTDuration(DoublePointable doublep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatDTDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDoubleFloat(DoublePointable doublep1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateFloatYMDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDoubleInteger(DoublePointable doublep1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleDecimal(DoublePointable doublep, XSDecimalPointable decp, DataOutput dOut)
+    public abstract void operateDoubleYMDuration(DoublePointable doublep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut)
+    public abstract void operateDTDurationDate(IntegerPointable intp1, XSDatePointable datep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleFloat(DoublePointable doublep, FloatPointable floatp, DataOutput dOut)
+    public abstract void operateDTDurationDatetime(IntegerPointable intp1, XSDateTimePointable datetimep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleDouble(DoublePointable doublep, DoublePointable doublep2, DataOutput dOut)
+    public abstract void operateDTDurationDecimal(IntegerPointable intp1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleDTDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDTDurationDouble(IntegerPointable intp1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDoubleYMDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDTDurationDTDuration(IntegerPointable intp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DataOutput dOut)
+    public abstract void operateDTDurationFloat(IntegerPointable intp1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDateDTDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDTDurationInteger(IntegerPointable intp1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateDTDurationTime(IntegerPointable intp1, XSTimePointable timep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2,
-            DataOutput dOut) throws Exception;
-
-    public abstract void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DataOutput dOut)
+    public abstract void operateFloatDTDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateTimeDTDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateTimeYMDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut)
+    public abstract void operateFloatInteger(FloatPointable floatp1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
+    public abstract void operateFloatYMDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut)
+    public abstract void operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut)
+    public abstract void operateIntegerDouble(LongPointable longp1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
+    public abstract void operateIntegerDTDuration(LongPointable longp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut)
+    public abstract void operateIntegerFloat(LongPointable longp1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut)
+    public abstract void operateIntegerInteger(LongPointable longp1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+    public abstract void operateIntegerYMDuration(LongPointable longp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
+    public abstract void operateTimeDTDuration(XSTimePointable timep1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
-            throws Exception;
+    public abstract void operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx,
+            DataOutput dOut) throws Exception;
 
-    public abstract void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut)
+    public abstract void operateYMDurationDate(IntegerPointable intp1, XSDatePointable datep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut)
+    public abstract void operateYMDurationDatetime(IntegerPointable intp1, XSDateTimePointable datetimep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
+    public abstract void operateYMDurationDecimal(IntegerPointable intp1, XSDecimalPointable decp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut)
+    public abstract void operateYMDurationDouble(IntegerPointable intp1, DoublePointable doublep2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut)
+    public abstract void operateYMDurationFloat(IntegerPointable intp1, FloatPointable floatp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+    public abstract void operateYMDurationInteger(IntegerPointable intp1, LongPointable longp2, DataOutput dOut)
             throws Exception;
 
-    public abstract void operateYMDurationYMDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
+    public abstract void operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception;
 }
\ No newline at end of file

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticScalarEvaluatorFactory.java?rev=1360516&r1=1360515&r2=1360516&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticScalarEvaluatorFactory.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AbstractArithmeticScalarEvaluatorFactory.java Thu Jul 12 02:46:28 2012
@@ -18,6 +18,7 @@ package org.apache.vxquery.runtime.funct
 
 import java.io.DataOutput;
 
+import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
@@ -62,6 +63,8 @@ public abstract class AbstractArithmetic
         final DataOutput dOut = abvs.getDataOutput();
         final TypedPointables tp1 = new TypedPointables();
         final TypedPointables tp2 = new TypedPointables();
+        final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
+
         return new AbstractTaggedValueArgumentScalarEvaluator(args) {
             @Override
             protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
@@ -251,7 +254,7 @@ public abstract class AbstractArithmetic
                             switch (tid2) {
                                 case ValueTag.XS_DATE_TAG:
                                     tvp2.getValue(tp2.datep);
-                                    aOp.operateDateDate(tp1.datep, tp2.datep, dOut);
+                                    aOp.operateDateDate(tp1.datep, tp2.datep, dCtx, dOut);
                                     result.set(abvs);
                                     return;
 
@@ -274,7 +277,7 @@ public abstract class AbstractArithmetic
                             switch (tid2) {
                                 case ValueTag.XS_DATETIME_TAG:
                                     tvp2.getValue(tp2.datetimep);
-                                    aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dOut);
+                                    aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx, dOut);
                                     result.set(abvs);
                                     return;
 
@@ -297,7 +300,7 @@ public abstract class AbstractArithmetic
                             switch (tid2) {
                                 case ValueTag.XS_TIME_TAG:
                                     tvp2.getValue(tp2.timep);
-                                    aOp.operateTimeTime(tp1.timep, tp2.timep, dOut);
+                                    aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx, dOut);
                                     result.set(abvs);
                                     return;
 
@@ -307,11 +310,6 @@ public abstract class AbstractArithmetic
                                     result.set(abvs);
                                     return;
 
-                                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                                    tvp2.getValue(tp2.intp);
-                                    aOp.operateTimeYMDuration(tp1.timep, tp2.intp, dOut);
-                                    result.set(abvs);
-                                    return;
                             }
                             break;
 
@@ -401,12 +399,6 @@ public abstract class AbstractArithmetic
                                     result.set(abvs);
                                     return;
 
-                                case ValueTag.XS_TIME_TAG:
-                                    tvp2.getValue(tp2.timep);
-                                    aOp.operateYMDurationTime(tp1.intp, tp2.timep, dOut);
-                                    result.set(abvs);
-                                    return;
-
                                 case ValueTag.XS_DATETIME_TAG:
                                     tvp2.getValue(tp2.datetimep);
                                     aOp.operateYMDurationDatetime(tp1.intp, tp2.datetimep, dOut);
@@ -475,11 +467,11 @@ public abstract class AbstractArithmetic
         FloatPointable floatp = (FloatPointable) FloatPointable.FACTORY.createPointable();
         DoublePointable doublep = (DoublePointable) DoublePointable.FACTORY.createPointable();
         UTF8StringPointable utf8sp = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable();
-        XSDecimalPointable decp = new XSDecimalPointable();
-        XSDateTimePointable datetimep = new XSDateTimePointable();
-        XSDatePointable datep = new XSDatePointable();
-        XSTimePointable timep = new XSTimePointable();
-        XSDurationPointable durationp = new XSDurationPointable();
+        XSDecimalPointable decp = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+        XSDateTimePointable datetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+        XSDatePointable datep = (XSDatePointable) XSDatePointable.FACTORY.createPointable();
+        XSTimePointable timep = (XSTimePointable) XSTimePointable.FACTORY.createPointable();
+        XSDurationPointable durationp = (XSDurationPointable) XSDurationPointable.FACTORY.createPointable();
     }
 
     protected abstract AbstractArithmeticOperation createArithmeticOperation();

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java?rev=1360516&r1=1360515&r2=1360516&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java Thu Jul 12 02:46:28 2012
@@ -2,154 +2,171 @@ package org.apache.vxquery.runtime.funct
 
 import java.io.DataOutput;
 
+import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDecimalPointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable;
+import org.apache.vxquery.datamodel.util.DateTime;
 import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
 
 import edu.uci.ics.hyracks.data.std.primitive.DoublePointable;
 import edu.uci.ics.hyracks.data.std.primitive.FloatPointable;
 import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
+import edu.uci.ics.hyracks.dataflow.common.data.accessors.ArrayBackedValueStorage;
 
 public class AddOperation extends AbstractArithmeticOperation {
-    @Override
-    public void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
-            throws Exception {
-        double value = decp1.doubleValue();
-        value += decp2.doubleValue();
-        dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
-    }
+    protected final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
+    protected final DataOutput dataOutput = abvs.getDataOutput();
 
     @Override
-    public void operateDecimalInteger(XSDecimalPointable decp, LongPointable longp, DataOutput dOut) throws Exception {
-        double value = decp.doubleValue();
-        value += longp.doubleValue();
-        dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
+    public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
+            throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalFloat(XSDecimalPointable decp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        float value = decp.floatValue();
-        value += floatp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
+    public void operateDateDTDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        // Add duration.
+        DateTime.normalizeDateTime(datep.getYearMonth(), datep.getDayTime() + intp.getInteger(), dataOutput);
+        byte[] bytes = abvs.getByteArray();
+        // Convert to date.
+        bytes[XSDatePointable.TIMEZONE_HOUR_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_HOUR_OFFSET];
+        bytes[XSDatePointable.TIMEZONE_MINUTE_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_MINUTE_OFFSET];
+        dOut.write(ValueTag.XS_DATE_TAG);
+        dOut.write(bytes, 0, XSDatePointable.TYPE_TRAITS.getFixedLength());
     }
 
     @Override
-    public void operateDecimalDouble(XSDecimalPointable decp, DoublePointable doublep, DataOutput dOut)
-            throws Exception {
-        double value = decp.doubleValue();
-        value += doublep.doubleValue();
-        dOut.write(ValueTag.XS_DOUBLE_TAG);
-        dOut.writeDouble(value);
+    public void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2,
+            DynamicContext dCtx, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalDTDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+    public void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        long value = decp.longValue();
-        value += intp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+        // Add duration.
+        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() + intp.getInteger(), dataOutput);
+        dOut.write(ValueTag.XS_DATETIME_TAG);
+        dOut.write(abvs.getByteArray());
     }
 
     @Override
-    public void operateDecimalYMDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+    public void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        long value = decp.longValue();
-        value += intp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
-    }
-
-    @Override
-    public void operateIntegerDecimal(LongPointable longp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
-        operateDecimalInteger(decp, longp, dOut);
-    }
-
-    @Override
-    public void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut) throws Exception {
-        long value = longp.getLong();
-        value += longp2.getLong();
-        dOut.write(ValueTag.XS_INTEGER_TAG);
-        dOut.writeLong(value);
+        // Add duration.
+        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() + intp.getInteger(), dataOutput);
+        dOut.write(ValueTag.XS_DATETIME_TAG);
+        dOut.write(abvs.getByteArray());
     }
 
     @Override
-    public void operateIntegerFloat(LongPointable longp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        operateFloatInteger(floatp, longp, dOut);
-    }
-
-    @Override
-    public void operateIntegerDouble(LongPointable longp, DoublePointable doublep, DataOutput dOut) throws Exception {
-        operateDoubleInteger(doublep, longp, dOut);
-    }
-
-    @Override
-    public void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        operateDTDurationInteger(intp, longp, dOut);
+    public void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        // Add duration.
+        DateTime.normalizeDateTime(datep.getYearMonth(), datep.getDayTime() + intp.getInteger(), dataOutput);
+        byte[] bytes = abvs.getByteArray();
+        // Convert to date.
+        bytes[XSDatePointable.TIMEZONE_HOUR_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_HOUR_OFFSET];
+        bytes[XSDatePointable.TIMEZONE_MINUTE_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_MINUTE_OFFSET];
+        dOut.write(ValueTag.XS_DATE_TAG);
+        dOut.write(bytes, 0, XSDatePointable.TYPE_TRAITS.getFixedLength());
     }
 
     @Override
-    public void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        long value = longp.longValue();
-        value += intp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
+            throws Exception {
+        // Prepare
+        long value1 = decp1.getDecimalValue();
+        long value2 = decp2.getDecimalValue();
+        byte place1 = decp1.getDecimalPlace();
+        byte place2 = decp2.getDecimalPlace();
+        byte count1 = decp1.getDigitCount();
+        byte count2 = decp2.getDigitCount();
+        // Convert to matching values
+        while (place1 > place2) {
+            ++place2;
+            value2 *= 10;
+            ++count2;
+        }
+        while (place1 < place2) {
+            ++place1;
+            value1 *= 10;
+            ++count1;
+        }
+        // Add
+        if (count1 > XSDecimalPointable.PRECISION || count2 > XSDecimalPointable.PRECISION) {
+            throw new SystemException(ErrorCode.XPDY0002);
+        }
+        value1 += value2;
+        // Save
+        dOut.write(ValueTag.XS_DECIMAL_TAG);
+        dOut.writeByte(place1);
+        dOut.writeDouble(value1);
     }
 
     @Override
-    public void operateFloatDecimal(FloatPointable floatp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
-        operateDecimalFloat(decp, floatp, dOut);
+    public void operateDecimalDouble(XSDecimalPointable decp, DoublePointable doublep, DataOutput dOut)
+            throws Exception {
+        double value = decp.doubleValue();
+        value += doublep.doubleValue();
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
     }
 
     @Override
-    public void operateFloatInteger(FloatPointable floatp, LongPointable longp, DataOutput dOut) throws Exception {
-        float value = floatp.floatValue();
-        value += longp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
+    public void operateDecimalDTDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+            throws Exception {
+        int value = operateIntDecimal(intp.intValue(), decp);
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateFloatFloat(FloatPointable floatp, FloatPointable floatp2, DataOutput dOut) throws Exception {
-        float value = floatp.floatValue();
-        value += floatp2.floatValue();
+    public void operateDecimalFloat(XSDecimalPointable decp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        float value = decp.floatValue();
+        value += floatp.floatValue();
         dOut.write(ValueTag.XS_FLOAT_TAG);
         dOut.writeFloat(value);
     }
 
     @Override
-    public void operateFloatDouble(FloatPointable floatp, DoublePointable doublep, DataOutput dOut) throws Exception {
-        operateDoubleFloat(doublep, floatp, dOut);
+    public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut) throws Exception {
+        XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.setDecimal(longp2.longValue(), (byte) 0);
+        operateDecimalDecimal(decp1, decp2, dOut);
     }
 
     @Override
-    public void operateFloatDTDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        operateDTDurationFloat(intp, floatp, dOut);
+    public void operateDecimalYMDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+            throws Exception {
+        int value = operateIntDecimal(intp.intValue(), decp);
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateFloatYMDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        operateYMDurationFloat(intp, floatp, dOut);
+    public void operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2, DataOutput dOut)
+            throws Exception {
+        operateDecimalDouble(decp2, doublep1, dOut);
     }
 
     @Override
-    public void operateDoubleDecimal(DoublePointable doublep, XSDecimalPointable decp, DataOutput dOut)
+    public void operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2, DataOutput dOut)
             throws Exception {
-        operateDecimalDouble(decp, doublep, dOut);
+        double value = doublep1.doubleValue();
+        value += doublep2.doubleValue();
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
     }
 
     @Override
-    public void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut) throws Exception {
-        double value = doublep.doubleValue();
-        value += longp.doubleValue();
-        dOut.write(ValueTag.XS_DOUBLE_TAG);
-        dOut.writeDouble(value);
+    public void operateDoubleDTDuration(DoublePointable doublep1, IntegerPointable intp2, DataOutput dOut)
+            throws Exception {
+        operateDTDurationDouble(intp2, doublep1, dOut);
     }
 
     @Override
@@ -161,177 +178,241 @@ public class AddOperation extends Abstra
     }
 
     @Override
-    public void operateDoubleDouble(DoublePointable doublep, DoublePointable doublep2, DataOutput dOut)
-            throws Exception {
+    public void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut) throws Exception {
         double value = doublep.doubleValue();
-        value += doublep2.doubleValue();
+        value += longp.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
         dOut.writeDouble(value);
     }
 
     @Override
-    public void operateDoubleDTDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
-            throws Exception {
-        operateDTDurationDouble(intp, doublep, dOut);
-    }
-
-    @Override
     public void operateDoubleYMDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        long value = doublep.longValue();
-        value += intp.longValue();
+        int value = doublep.intValue();
+        value += intp.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
+        operateDateDTDuration(datep, intp, dOut);
     }
 
     @Override
-    public void operateDateDTDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+            throws Exception {
+        operateDatetimeDTDuration(datetimep, intp, dOut);
     }
 
     @Override
-    public void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
+            throws Exception {
+        operateDecimalDTDuration(decp, intp, dOut);
     }
 
     @Override
-    public void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2, DataOutput dOut)
+    public void operateDTDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
             throws Exception {
-
+        int value = intp.intValue();
+        value += doublep.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
+    public void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-
+        int value = intp.intValue();
+        value += intp2.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
-            throws Exception {
-
+    public void operateDTDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        int value = intp.intValue();
+        value += floatp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
+        int value = intp.intValue();
+        value += longp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateTimeDTDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationTime(IntegerPointable intp1, XSTimePointable timep2, DataOutput dOut) throws Exception {
+     // Add duration.
+        DateTime.normalizeDateTime(timep2.getYearMonth(), timep2.getDayTime() + intp1.getInteger(), dataOutput);
+        byte[] bytes = abvs.getByteArray();
+        // Convert to time.
+        bytes[XSTimePointable.HOUR_OFFSET] = bytes[XSDateTimePointable.HOUR_OFFSET];
+        bytes[XSTimePointable.MINUTE_OFFSET] = bytes[XSDateTimePointable.MINUTE_OFFSET];
+        bytes[XSTimePointable.MILLISECOND_OFFSET] = bytes[XSDateTimePointable.MILLISECOND_OFFSET];
+        bytes[XSTimePointable.TIMEZONE_HOUR_OFFSET] = (byte) timep2.getTimezoneHour();
+        bytes[XSTimePointable.TIMEZONE_MINUTE_OFFSET] = (byte) timep2.getTimezoneMinute();
+        dOut.write(ValueTag.XS_TIME_TAG);
+        dOut.write(bytes, 0, XSTimePointable.TYPE_TRAITS.getFixedLength());
     }
 
     @Override
-    public void operateTimeYMDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateFloatDecimal(FloatPointable floatp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
+        operateDecimalFloat(decp, floatp, dOut);
     }
 
     @Override
-    public void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
-            throws Exception {
-        operateDecimalDTDuration(decp, intp, dOut);
+    public void operateFloatDouble(FloatPointable floatp, DoublePointable doublep, DataOutput dOut) throws Exception {
+        operateDoubleFloat(doublep, floatp, dOut);
     }
 
     @Override
-    public void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value += longp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateFloatDTDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        operateDTDurationFloat(intp, floatp, dOut);
     }
 
     @Override
-    public void operateDTDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value += floatp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateFloatFloat(FloatPointable floatp, FloatPointable floatp2, DataOutput dOut) throws Exception {
+        float value = floatp.floatValue();
+        value += floatp2.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeFloat(value);
     }
 
     @Override
-    public void operateDTDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
-            throws Exception {
-        long value = intp.longValue();
-        value += doublep.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateFloatInteger(FloatPointable floatp, LongPointable longp, DataOutput dOut) throws Exception {
+        float value = floatp.floatValue();
+        value += longp.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeFloat(value);
     }
 
     @Override
-    public void operateDTDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
-
+    public void operateFloatYMDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        operateYMDurationFloat(intp, floatp, dOut);
     }
 
     @Override
-    public void operateDTDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut) throws Exception {
-
+    public void operateIntegerDecimal(LongPointable longp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
+        operateDecimalInteger(decp, longp, dOut);
     }
 
     @Override
-    public void operateDTDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
-            throws Exception {
+    public void operateIntegerDouble(LongPointable longp, DoublePointable doublep, DataOutput dOut) throws Exception {
+        operateDoubleInteger(doublep, longp, dOut);
+    }
 
+    @Override
+    public void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        operateDTDurationInteger(intp, longp, dOut);
     }
 
     @Override
-    public void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
-            throws Exception {
-        long value = intp.longValue();
-        value += intp2.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateIntegerFloat(LongPointable longp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        operateFloatInteger(floatp, longp, dOut);
     }
 
     @Override
-    public void operateYMDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
-            throws Exception {
-        operateDecimalYMDuration(decp, intp, dOut);
+    public void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut) throws Exception {
+        long value = longp.getLong();
+        value += longp2.getLong();
+        dOut.write(ValueTag.XS_INTEGER_TAG);
+        dOut.writeLong(value);
     }
 
     @Override
-    public void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
-        operateIntegerYMDuration(longp, intp, dOut);
+    public void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        int value = longp.intValue();
+        value += intp.intValue();
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateYMDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        operateFloatYMDuration(floatp, intp, dOut);
+    public void operateTimeDTDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        operateDTDurationTime(intp, timep, dOut);
     }
 
     @Override
-    public void operateYMDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
+    public void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DynamicContext dCtx, DataOutput dOut)
             throws Exception {
-        operateDoubleYMDuration(doublep, intp, dOut);
+        throw new UnsupportedOperationException();
     }
 
     @Override
     public void operateYMDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
-
+        operateDateYMDuration(datep, intp, dOut);
     }
 
     @Override
-    public void operateYMDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut) throws Exception {
+    public void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+            throws Exception {
+        operateDatetimeYMDuration(datetimep, intp, dOut);
+    }
 
+    @Override
+    public void operateYMDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
+            throws Exception {
+        operateDecimalYMDuration(decp, intp, dOut);
     }
 
     @Override
-    public void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+    public void operateYMDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
             throws Exception {
+        operateDoubleYMDuration(doublep, intp, dOut);
+    }
+
+    @Override
+    public void operateYMDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        operateFloatYMDuration(floatp, intp, dOut);
+    }
 
+    @Override
+    public void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
+        operateIntegerYMDuration(longp, intp, dOut);
     }
 
     @Override
     public void operateYMDurationYMDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-        long value = intp.longValue();
-        value += intp2.longValue();
+        int value = intp.intValue();
+        value += intp2.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
+    }
+
+    public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws Exception {
+        XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.setDecimal(intValue, (byte) 0);
+        // Prepare
+        long value1 = decp1.getDecimalValue();
+        long value2 = decp2.getDecimalValue();
+        byte place1 = decp1.getDecimalPlace();
+        byte place2 = decp2.getDecimalPlace();
+        byte count1 = decp1.getDigitCount();
+        byte count2 = decp2.getDigitCount();
+        // Convert to matching values
+        while (place1 > place2) {
+            ++place2;
+            value2 *= 10;
+            ++count2;
+        }
+        while (place1 < place2) {
+            ++place1;
+            value1 *= 10;
+            ++count1;
+        }
+        // Add
+        if (count1 > XSDecimalPointable.PRECISION || count2 > XSDecimalPointable.PRECISION) {
+            throw new SystemException(ErrorCode.XPDY0002);
+        }
+        value1 += value2;
+        // Save
+        decp2.setDecimal(value1, place1);
+        return decp2.intValue();
     }
 }
\ No newline at end of file

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java?rev=1360516&r1=1360515&r2=1360516&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java Thu Jul 12 02:46:28 2012
@@ -2,11 +2,14 @@ package org.apache.vxquery.runtime.funct
 
 import java.io.DataOutput;
 
+import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSDecimalPointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable;
 import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
 
 import edu.uci.ics.hyracks.data.std.primitive.DoublePointable;
 import edu.uci.ics.hyracks.data.std.primitive.FloatPointable;
@@ -15,151 +18,98 @@ import edu.uci.ics.hyracks.data.std.prim
 
 public class DivideOperation extends AbstractArithmeticOperation {
     @Override
-    public void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
+    public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws Exception {
-        double value = decp1.doubleValue();
-        value /= decp2.doubleValue();
-        dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalInteger(XSDecimalPointable decp, LongPointable longp, DataOutput dOut) throws Exception {
-        double value = decp.doubleValue();
-        value /= longp.doubleValue();
-        dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
+    public void operateDateDTDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalFloat(XSDecimalPointable decp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        float value = decp.floatValue();
-        value /= floatp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
+    public void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2,
+            DynamicContext dCtx, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalDouble(XSDecimalPointable decp, DoublePointable doublep, DataOutput dOut)
+    public void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        double value = decp.doubleValue();
-        value /= doublep.doubleValue();
-        dOut.write(ValueTag.XS_DOUBLE_TAG);
-        dOut.writeDouble(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalDTDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
+    public void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        long value = decp.longValue();
-        value /= intp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDecimalYMDuration(XSDecimalPointable decp, IntegerPointable intp, DataOutput dOut)
-            throws Exception {
-        long value = decp.longValue();
-        value /= intp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateIntegerDecimal(LongPointable longp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
-        double value = longp.doubleValue();
-        value /= decp.doubleValue();
+    public void operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2, DataOutput dOut)
+            throws Exception {
+        // Prepare
+        long value1 = decp1.getDecimalValue();
+        long value2 = decp2.getDecimalValue();
+        byte place1 = decp1.getDecimalPlace();
+        byte place2 = decp2.getDecimalPlace();
+        // Divide
+        if (value1 > Long.MAX_VALUE * value2) {
+            throw new SystemException(ErrorCode.XPDY0002);
+        }
+        value1 /= value2;
+        place1 -= place2;
+        // Save
         dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
+        dOut.writeByte(place1);
+        dOut.writeLong(value1);
     }
 
     @Override
-    public void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut) throws Exception {
-        long value = longp.getLong();
-        value /= longp2.getLong();
-        dOut.write(ValueTag.XS_INTEGER_TAG);
-        dOut.writeLong(value);
-    }
-
-    @Override
-    public void operateIntegerFloat(LongPointable longp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        float value = longp.floatValue();
-        value /= floatp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
-    }
-
-    @Override
-    public void operateIntegerDouble(LongPointable longp, DoublePointable doublep, DataOutput dOut) throws Exception {
-        double value = longp.doubleValue();
-        value /= doublep.doubleValue();
+    public void operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2, DataOutput dOut)
+            throws Exception {
+        double value = decp1.doubleValue();
+        value /= doublep2.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
         dOut.writeDouble(value);
     }
 
     @Override
-    public void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        long value = longp.longValue();
-        value /= intp.longValue();
+    public void operateDecimalDTDuration(XSDecimalPointable decp1, IntegerPointable intp2, DataOutput dOut)
+            throws Exception {
+        int value = operateDecimalInt(decp1, intp2.intValue());
         dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
-    }
-
-    @Override
-    public void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        long value = longp.longValue();
-        value /= intp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateFloatDecimal(FloatPointable floatp, XSDecimalPointable decp, DataOutput dOut) throws Exception {
-        float value = floatp.floatValue();
-        value /= decp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeDouble(value);
-    }
-
-    @Override
-    public void operateFloatInteger(FloatPointable floatp, LongPointable longp, DataOutput dOut) throws Exception {
-        float value = floatp.floatValue();
-        value /= longp.floatValue();
-        dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
-    }
-
-    @Override
-    public void operateFloatFloat(FloatPointable floatp, FloatPointable floatp2, DataOutput dOut) throws Exception {
-        float value = floatp.floatValue();
+    public void operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2, DataOutput dOut) throws Exception {
+        float value = decp1.floatValue();
         value /= floatp2.floatValue();
         dOut.write(ValueTag.XS_FLOAT_TAG);
-        dOut.writeFloat(value);
-    }
-
-    @Override
-    public void operateFloatDouble(FloatPointable floatp, DoublePointable doublep, DataOutput dOut) throws Exception {
-        double value = floatp.doubleValue();
-        value /= doublep.doubleValue();
-        dOut.write(ValueTag.XS_DOUBLE_TAG);
         dOut.writeDouble(value);
     }
 
     @Override
-    public void operateFloatDTDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        long value = floatp.longValue();
-        value /= intp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut) throws Exception {
+        // Convert
+        XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.setDecimal(longp2.longValue(), (byte) 0);
+        operateDecimalDecimal(decp1, decp2, dOut);
     }
 
     @Override
-    public void operateFloatYMDuration(FloatPointable floatp, IntegerPointable intp, DataOutput dOut) throws Exception {
-        long value = floatp.longValue();
-        value /= intp.longValue();
+    public void operateDecimalYMDuration(XSDecimalPointable decp1, IntegerPointable intp2, DataOutput dOut)
+            throws Exception {
+        int value = operateDecimalInt(decp1, intp2.intValue());
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
 
     @Override
@@ -172,14 +122,24 @@ public class DivideOperation extends Abs
     }
 
     @Override
-    public void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut) throws Exception {
+    public void operateDoubleDouble(DoublePointable doublep, DoublePointable doublep2, DataOutput dOut)
+            throws Exception {
         double value = doublep.doubleValue();
-        value /= longp.doubleValue();
+        value /= doublep2.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
         dOut.writeDouble(value);
     }
 
     @Override
+    public void operateDoubleDTDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
+            throws Exception {
+        double value = doublep.doubleValue();
+        value /= intp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt((int) value);
+    }
+
+    @Override
     public void operateDoubleFloat(DoublePointable doublep, FloatPointable floatp, DataOutput dOut) throws Exception {
         double value = doublep.doubleValue();
         value /= floatp.doubleValue();
@@ -188,195 +148,279 @@ public class DivideOperation extends Abs
     }
 
     @Override
-    public void operateDoubleDouble(DoublePointable doublep, DoublePointable doublep2, DataOutput dOut)
-            throws Exception {
+    public void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut) throws Exception {
         double value = doublep.doubleValue();
-        value /= doublep2.doubleValue();
+        value /= longp.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
         dOut.writeDouble(value);
     }
 
     @Override
-    public void operateDoubleDTDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
-            throws Exception {
-        long value = doublep.longValue();
-        value /= intp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
-    }
-
-    @Override
     public void operateDoubleYMDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
             throws Exception {
-        long value = doublep.longValue();
-        value /= intp.longValue();
+        double value = doublep.doubleValue();
+        value /= intp.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt((int) value);
     }
 
     @Override
-    public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDateDTDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+            throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
+            throws Exception {
+        int value = intp.intValue();
+        value /= decp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2, DataOutput dOut)
+    public void operateDTDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
             throws Exception {
-
+        int value = intp.intValue();
+        value /= doublep.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
+    public void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-
+        int value = intp.intValue();
+        value /= intp2.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
-            throws Exception {
-
+    public void operateDTDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        float value = intp.floatValue();
+        value /= floatp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt((int) value);
     }
 
     @Override
-    public void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
+        int value = intp.intValue();
+        value /= longp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateTimeDTDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
-
+    public void operateDTDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateTimeYMDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
+    public void operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2, DataOutput dOut) throws Exception {
+        float value = floatp1.floatValue();
+        value /= decp2.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeDouble(value);
+    }
 
+    @Override
+    public void operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2, DataOutput dOut) throws Exception {
+        double value = floatp1.doubleValue();
+        value /= doublep2.doubleValue();
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
     }
 
     @Override
-    public void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
+    public void operateFloatDTDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-        long value = intp.longValue();
-        value /= decp.longValue();
+        int value = floatp1.intValue();
+        value /= intp2.intValue();
         dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value /= longp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2, DataOutput dOut) throws Exception {
+        float value = floatp1.floatValue();
+        value /= floatp2.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeFloat(value);
     }
 
     @Override
-    public void operateDTDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value /= floatp.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateFloatInteger(FloatPointable floatp1, LongPointable longp2, DataOutput dOut) throws Exception {
+        float value = floatp1.floatValue();
+        value /= longp2.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeFloat(value);
     }
 
     @Override
-    public void operateDTDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
+    public void operateFloatYMDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-        long value = intp.longValue();
-        value /= doublep.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        long value = floatp1.longValue();
+        value /= intp2.longValue();
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
         dOut.writeLong(value);
     }
 
     @Override
-    public void operateDTDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
-
+    public void operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2, DataOutput dOut) throws Exception {
+        XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.setDecimal(longp1.longValue(), (byte) 0);
+        operateDecimalDecimal(decp1, decp2, dOut);
     }
 
     @Override
-    public void operateDTDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut) throws Exception {
-
+    public void operateIntegerDouble(LongPointable longp, DoublePointable doublep, DataOutput dOut) throws Exception {
+        double value = longp.doubleValue();
+        value /= doublep.doubleValue();
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
     }
 
     @Override
-    public void operateDTDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
-            throws Exception {
-
+    public void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        int value = longp.intValue();
+        value /= intp.intValue();
+        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
-            throws Exception {
-        long value = intp.longValue();
-        value /= intp2.longValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateIntegerFloat(LongPointable longp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        float value = longp.floatValue();
+        value /= floatp.floatValue();
+        dOut.write(ValueTag.XS_FLOAT_TAG);
+        dOut.writeFloat(value);
     }
 
     @Override
-    public void operateYMDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
-            throws Exception {
-        long value = intp.longValue();
-        value /= decp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut) throws Exception {
+        // This is an exception for integer integer operations. The divide operation returns a decimal.
+        double value = longp.doubleValue();
+        value /= longp2.doubleValue();
+        dOut.write(ValueTag.XS_DECIMAL_TAG);
+        dOut.writeDouble(value);
     }
 
     @Override
-    public void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value /= longp.longValue();
+    public void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut) throws Exception {
+        int value = longp.intValue();
+        value /= intp.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateYMDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
-        long value = intp.longValue();
-        value /= floatp.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+    public void operateTimeDTDuration(XSTimePointable timep, IntegerPointable intp, DataOutput dOut) throws Exception {
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateYMDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
+    public void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DynamicContext dCtx, DataOutput dOut)
             throws Exception {
-        long value = intp.longValue();
-        value /= doublep.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
     public void operateYMDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut) throws Exception {
-
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    public void operateYMDurationTime(IntegerPointable intp, XSTimePointable timep, DataOutput dOut) throws Exception {
+    public void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+            throws Exception {
+        throw new UnsupportedOperationException();
+    }
 
+    @Override
+    public void operateYMDurationDecimal(IntegerPointable intp1, XSDecimalPointable decp2, DataOutput dOut)
+            throws Exception {
+        int value = operateIntDecimal(intp1.intValue(), decp2);
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
-    public void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
+    public void operateYMDurationDouble(IntegerPointable intp, DoublePointable doublep, DataOutput dOut)
             throws Exception {
+        int value = intp.intValue();
+        value /= doublep.intValue();
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
+    }
 
+    @Override
+    public void operateYMDurationFloat(IntegerPointable intp, FloatPointable floatp, DataOutput dOut) throws Exception {
+        int value = intp.intValue();
+        value /= floatp.intValue();
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
+    }
+
+    @Override
+    public void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut) throws Exception {
+        int value = intp.intValue();
+        value /= longp.intValue();
+        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+        dOut.writeInt(value);
     }
 
     @Override
     public void operateYMDurationYMDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws Exception {
-        long value = intp.longValue();
-        value /= intp2.longValue();
+        int value = intp.intValue();
+        value /= intp2.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        dOut.writeInt(value);
     }
+
+    public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws Exception {
+        XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.setDecimal(intValue, (byte) 0);
+        // Prepare
+        long value1 = decp1.getDecimalValue();
+        long value2 = decp2.getDecimalValue();
+        byte place1 = decp1.getDecimalPlace();
+        byte place2 = decp2.getDecimalPlace();
+        // Divide
+        if (value1 > Long.MAX_VALUE * value2) {
+            throw new SystemException(ErrorCode.XPDY0002);
+        }
+        value1 /= value2;
+        place1 -= place2;
+        // Save
+        decp2.setDecimal(value1, place1);
+        return decp2.intValue();
+    }
+
+    public int operateDecimalInt(XSDecimalPointable decp1, int intValue) throws Exception {
+        XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.setDecimal(intValue, (byte) 0);
+        // Prepare
+        long value1 = decp1.getDecimalValue();
+        long value2 = decp2.getDecimalValue();
+        byte place1 = decp1.getDecimalPlace();
+        byte place2 = decp2.getDecimalPlace();
+        // Divide
+        if (value1 > Long.MAX_VALUE * value2) {
+            throw new SystemException(ErrorCode.XPDY0002);
+        }
+        value1 /= value2;
+        place1 -= place2;
+        // Save
+        decp2.setDecimal(value1, place1);
+        return decp2.intValue();
+    }
+
 }
\ No newline at end of file