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/08/23 02:40:19 UTC

svn commit: r1376335 - in /incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery: datamodel/util/ runtime/functions/comparison/

Author: prestonc
Date: Thu Aug 23 00:40:19 2012
New Revision: 1376335

URL: http://svn.apache.org/viewvc?rev=1376335&view=rev
Log:
Went through many of the Value Comparison test and fixed several types of errors.
 * Wrong use of the array back value store
 * Missing functions
 * Bad date manipulation
 * Added missing errors

Modified:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/util/DateTime.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractDisjunctiveComparisonOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractNegatingComparisonOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueLtComparisonOperation.java

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/util/DateTime.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/util/DateTime.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/util/DateTime.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/util/DateTime.java Thu Aug 23 00:40:19 2012
@@ -109,8 +109,8 @@ public class DateTime {
         long minute = dayTime / CHRONON_OF_MINUTE;
         dayTime %= CHRONON_OF_MINUTE;
         long millisecond = dayTime;
-        long month = yearMonth % 12;
-        long year = yearMonth / 12;
+        long month = (yearMonth % 12 == 0 ? 12 : yearMonth % 12);
+        long year = (yearMonth / 12) + (month == 12 ? -1 : 0);
 
         monthDayLimits = (isLeapYear(year) ? DateTime.DAYS_OF_MONTH_LEAP : DateTime.DAYS_OF_MONTH_ORDI);
         while (day < DateTime.FIELD_MINS[DateTime.DAY_FIELD_INDEX] || day > monthDayLimits[(int) month - 1]
@@ -163,8 +163,8 @@ public class DateTime {
             timezoneHour = timezonep.getTimezoneHour();
             timezoneMinute = timezonep.getTimezoneMinute();
         }
-        long dayTime = timezonep.getDayTime() + timezoneHour * DateTime.CHRONON_OF_HOUR + timezoneMinute
-                * DateTime.CHRONON_OF_HOUR;
+        long dayTime = timezonep.getDayTime() - (timezoneHour * DateTime.CHRONON_OF_HOUR + timezoneMinute
+                * DateTime.CHRONON_OF_HOUR);
         DateTime.normalizeDateTime(timezonep.getYearMonth(), dayTime, dOut);
     }
 

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractDisjunctiveComparisonOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractDisjunctiveComparisonOperation.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractDisjunctiveComparisonOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractDisjunctiveComparisonOperation.java Thu Aug 23 00:40:19 2012
@@ -114,6 +114,20 @@ public abstract class AbstractDisjunctiv
     }
 
     @Override
+    public boolean operateDTDurationDuration(LongPointable longp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        return (aOp1.operateDTDurationDuration(longp1, durationp2) || aOp2
+                .operateDTDurationDuration(longp1, durationp2));
+    }
+
+    @Override
+    public boolean operateDurationDTDuration(XSDurationPointable durationp1, LongPointable longp2)
+            throws SystemException, IOException {
+        return (aOp1.operateDurationDTDuration(durationp1, longp2) || aOp2
+                .operateDurationDTDuration(durationp1, longp2));
+    }
+
+    @Override
     public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException {
         return (aOp1.operateDurationDuration(durationp1, durationp2) || aOp2.operateDurationDuration(durationp1,
@@ -121,6 +135,12 @@ public abstract class AbstractDisjunctiv
     }
 
     @Override
+    public boolean operateDurationYMDuration(XSDurationPointable durationp1, IntegerPointable intp2)
+            throws SystemException, IOException {
+        return (aOp1.operateDurationYMDuration(durationp1, intp2) || aOp2.operateDurationYMDuration(durationp1, intp2));
+    }
+
+    @Override
     public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) throws SystemException,
             IOException {
         return (aOp1.operateFloatDecimal(floatp1, decp2) || aOp2.operateFloatDecimal(floatp1, decp2));
@@ -232,6 +252,12 @@ public abstract class AbstractDisjunctiv
     }
 
     @Override
+    public boolean operateYMDurationDuration(IntegerPointable intp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        return (aOp1.operateYMDurationDuration(intp1, durationp2) || aOp2.operateYMDurationDuration(intp1, durationp2));
+    }
+
+    @Override
     public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException,
             IOException {
         return (aOp1.operateYMDurationYMDuration(intp1, intp2) || aOp2.operateYMDurationYMDuration(intp1, intp2));

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractNegatingComparisonOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractNegatingComparisonOperation.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractNegatingComparisonOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractNegatingComparisonOperation.java Thu Aug 23 00:40:19 2012
@@ -109,12 +109,30 @@ public abstract class AbstractNegatingCo
     }
 
     @Override
+    public boolean operateDTDurationDuration(LongPointable longp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        return !aOp.operateDTDurationDuration(longp1, durationp2);
+    }
+
+    @Override
+    public boolean operateDurationDTDuration(XSDurationPointable durationp1, LongPointable longp2)
+            throws SystemException, IOException {
+        return !aOp.operateDurationDTDuration(durationp1, longp2);
+    }
+
+    @Override
     public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException {
         return !aOp.operateDurationDuration(durationp1, durationp2);
     }
 
     @Override
+    public boolean operateDurationYMDuration(XSDurationPointable durationp1, IntegerPointable intp2)
+            throws SystemException, IOException {
+        return !aOp.operateDurationYMDuration(durationp1, intp2);
+    }
+
+    @Override
     public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) throws SystemException,
             IOException {
         return !aOp.operateFloatDecimal(floatp1, decp2);
@@ -223,6 +241,12 @@ public abstract class AbstractNegatingCo
     }
 
     @Override
+    public boolean operateYMDurationDuration(IntegerPointable intp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        return !aOp.operateYMDurationDuration(intp1, durationp2);
+    }
+
+    @Override
     public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException,
             IOException {
         return !aOp.operateYMDurationYMDuration(intp1, intp2);

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonOperation.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonOperation.java Thu Aug 23 00:40:19 2012
@@ -62,9 +62,18 @@ public abstract class AbstractValueCompa
     public abstract boolean operateDTDurationDTDuration(LongPointable longp1, LongPointable longp2)
             throws SystemException, IOException;
 
+    public abstract boolean operateDTDurationDuration(LongPointable longp1, XSDurationPointable durationp2)
+            throws SystemException, IOException;
+
+    public abstract boolean operateDurationDTDuration(XSDurationPointable durationp1, LongPointable longp2)
+            throws SystemException, IOException;
+
     public abstract boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException;
 
+    public abstract boolean operateDurationYMDuration(XSDurationPointable durationp1, IntegerPointable intp2)
+            throws SystemException, IOException;
+
     public abstract boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2)
             throws SystemException, IOException;
 
@@ -119,6 +128,9 @@ public abstract class AbstractValueCompa
     public abstract boolean operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx)
             throws SystemException, IOException;
 
+    public abstract boolean operateYMDurationDuration(IntegerPointable intp1, XSDurationPointable durationp2)
+            throws SystemException, IOException;
+
     public abstract boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2)
             throws SystemException, IOException;
 }
\ No newline at end of file

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java Thu Aug 23 00:40:19 2012
@@ -16,6 +16,9 @@
 */
 package org.apache.vxquery.runtime.functions.comparison;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSBinaryPointable;
@@ -38,11 +41,14 @@ import edu.uci.ics.hyracks.algebricks.ru
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.data.std.api.IPointable;
 import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
+import edu.uci.ics.hyracks.data.std.primitive.BytePointable;
 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.data.std.primitive.ShortPointable;
 import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public abstract class AbstractValueComparisonScalarEvaluatorFactory extends
         AbstractTaggedValueArgumentScalarEvaluatorFactory {
@@ -56,6 +62,10 @@ public abstract class AbstractValueCompa
     protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
             throws AlgebricksException {
         final AbstractValueComparisonOperation aOp = createValueComparisonOperation();
+        final ArrayBackedValueStorage abvsInteger1 = new ArrayBackedValueStorage();
+        final DataOutput dOutInteger1 = abvsInteger1.getDataOutput();
+        final ArrayBackedValueStorage abvsInteger2 = new ArrayBackedValueStorage();
+        final DataOutput dOutInteger2 = abvsInteger2.getDataOutput();
         final TypedPointables tp1 = new TypedPointables();
         final TypedPointables tp2 = new TypedPointables();
         final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
@@ -79,6 +89,46 @@ public abstract class AbstractValueCompa
                     throw new UnsupportedOperationException();
                 }
                 try {
+                    LongPointable longp1 = (LongPointable) LongPointable.FACTORY.createPointable();
+                    switch (tvp1.getTag()) {
+                        case ValueTag.XS_INTEGER_TAG:
+                        case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                        case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                        case ValueTag.XS_LONG_TAG:
+                        case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                        case ValueTag.XS_UNSIGNED_LONG_TAG:
+                        case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                        case ValueTag.XS_INT_TAG:
+                        case ValueTag.XS_UNSIGNED_INT_TAG:
+                        case ValueTag.XS_SHORT_TAG:
+                        case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                        case ValueTag.XS_BYTE_TAG:
+                        case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                            abvsInteger1.reset();
+                            getIntegerPointable(tp1, tvp1, dOutInteger1);
+                            longp1.set(abvsInteger1.getByteArray(), abvsInteger1.getStartOffset() + 1,
+                                    LongPointable.TYPE_TRAITS.getFixedLength());
+                    }
+                    LongPointable longp2 = (LongPointable) LongPointable.FACTORY.createPointable();
+                    switch (tvp2.getTag()) {
+                        case ValueTag.XS_INTEGER_TAG:
+                        case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                        case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                        case ValueTag.XS_LONG_TAG:
+                        case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                        case ValueTag.XS_UNSIGNED_LONG_TAG:
+                        case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                        case ValueTag.XS_INT_TAG:
+                        case ValueTag.XS_UNSIGNED_INT_TAG:
+                        case ValueTag.XS_SHORT_TAG:
+                        case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                        case ValueTag.XS_BYTE_TAG:
+                        case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                            abvsInteger2.reset();
+                            getIntegerPointable(tp2, tvp2, dOutInteger2);
+                            longp2.set(abvsInteger2.getByteArray(), abvsInteger2.getStartOffset() + 1,
+                                    LongPointable.TYPE_TRAITS.getFixedLength());
+                    }
                     switch (tid1) {
                         case ValueTag.XS_DECIMAL_TAG:
                             tvp1.getValue(tp1.decp);
@@ -89,8 +139,7 @@ public abstract class AbstractValueCompa
                                     break;
 
                                 case ValueTag.XS_INTEGER_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateDecimalInteger(tp1.decp, tp2.longp);
+                                    booleanResult = aOp.operateDecimalInteger(tp1.decp, longp2);
                                     break;
 
                                 case ValueTag.XS_FLOAT_TAG:
@@ -106,26 +155,24 @@ public abstract class AbstractValueCompa
                             break;
 
                         case ValueTag.XS_INTEGER_TAG:
-                            tvp1.getValue(tp1.longp);
                             switch (tid2) {
                                 case ValueTag.XS_DECIMAL_TAG:
                                     tvp2.getValue(tp2.decp);
-                                    booleanResult = aOp.operateIntegerDecimal(tp1.longp, tp2.decp);
+                                    booleanResult = aOp.operateIntegerDecimal(longp1, tp2.decp);
                                     break;
 
                                 case ValueTag.XS_INTEGER_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateIntegerInteger(tp1.longp, tp2.longp);
+                                    booleanResult = aOp.operateIntegerInteger(longp1, longp2);
                                     break;
 
                                 case ValueTag.XS_FLOAT_TAG:
                                     tvp2.getValue(tp2.floatp);
-                                    booleanResult = aOp.operateIntegerFloat(tp1.longp, tp2.floatp);
+                                    booleanResult = aOp.operateIntegerFloat(longp1, tp2.floatp);
                                     break;
 
                                 case ValueTag.XS_DOUBLE_TAG:
                                     tvp2.getValue(tp2.doublep);
-                                    booleanResult = aOp.operateIntegerDouble(tp1.longp, tp2.doublep);
+                                    booleanResult = aOp.operateIntegerDouble(longp1, tp2.doublep);
                                     break;
                             }
                             break;
@@ -139,8 +186,7 @@ public abstract class AbstractValueCompa
                                     break;
 
                                 case ValueTag.XS_INTEGER_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateFloatInteger(tp1.floatp, tp2.longp);
+                                    booleanResult = aOp.operateFloatInteger(tp1.floatp, longp2);
                                     break;
 
                                 case ValueTag.XS_FLOAT_TAG:
@@ -164,8 +210,7 @@ public abstract class AbstractValueCompa
                                     break;
 
                                 case ValueTag.XS_INTEGER_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateDoubleInteger(tp1.doublep, tp2.longp);
+                                    booleanResult = aOp.operateDoubleInteger(tp1.doublep, longp2);
                                     break;
 
                                 case ValueTag.XS_FLOAT_TAG:
@@ -207,6 +252,9 @@ public abstract class AbstractValueCompa
                                     tvp2.getValue(tp2.datep);
                                     booleanResult = aOp.operateDateDate(tp1.datep, tp2.datep, dCtx);
                                     break;
+                                default:
+                                    // Cross comparisons between DateTime, Date and Time are not supported.
+                                    throw new SystemException(ErrorCode.XPTY0004);
                             }
                             break;
 
@@ -217,6 +265,9 @@ public abstract class AbstractValueCompa
                                     tvp2.getValue(tp2.datetimep);
                                     booleanResult = aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx);
                                     break;
+                                default:
+                                    // Cross comparisons between DateTime, Date and Time are not supported.
+                                    throw new SystemException(ErrorCode.XPTY0004);
                             }
                             break;
 
@@ -227,16 +278,27 @@ public abstract class AbstractValueCompa
                                     tvp2.getValue(tp2.timep);
                                     booleanResult = aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx);
                                     break;
+                                default:
+                                    // Cross comparisons between DateTime, Date and Time are not supported.
+                                    throw new SystemException(ErrorCode.XPTY0004);
                             }
                             break;
 
                         case ValueTag.XS_DURATION_TAG:
                             tvp1.getValue(tp1.durationp);
                             switch (tid2) {
+                                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                                    tvp2.getValue(tp2.longp);
+                                    booleanResult = aOp.operateDurationDTDuration(tp1.durationp, tp2.longp);
+                                    break;
                                 case ValueTag.XS_DURATION_TAG:
                                     tvp2.getValue(tp2.durationp);
                                     booleanResult = aOp.operateDurationDuration(tp1.durationp, tp2.durationp);
                                     break;
+                                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                                    tvp2.getValue(tp2.intp);
+                                    booleanResult = aOp.operateDurationYMDuration(tp1.durationp, tp2.intp);
+                                    break;
                             }
                             break;
 
@@ -247,12 +309,20 @@ public abstract class AbstractValueCompa
                                     tvp2.getValue(tp2.longp);
                                     booleanResult = aOp.operateDTDurationDTDuration(tp1.longp, tp2.longp);
                                     break;
+                                case ValueTag.XS_DURATION_TAG:
+                                    tvp2.getValue(tp2.durationp);
+                                    booleanResult = aOp.operateDTDurationDuration(tp1.longp, tp2.durationp);
+                                    break;
                             }
                             break;
 
                         case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
                             tvp1.getValue(tp1.intp);
                             switch (tid2) {
+                                case ValueTag.XS_DURATION_TAG:
+                                    tvp2.getValue(tp2.durationp);
+                                    booleanResult = aOp.operateYMDurationDuration(tp1.intp, tp2.durationp);
+                                    break;
                                 case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
                                     tvp2.getValue(tp2.intp);
                                     booleanResult = aOp.operateYMDurationYMDuration(tp1.intp, tp2.intp);
@@ -372,30 +442,71 @@ public abstract class AbstractValueCompa
                 }
             }
 
+            private void getIntegerPointable(TypedPointables tp, TaggedValuePointable tvp, DataOutput dOut)
+                    throws SystemException, IOException {
+                long value;
+                switch (tvp.getTag()) {
+                    case ValueTag.XS_INTEGER_TAG:
+                    case ValueTag.XS_LONG_TAG:
+                    case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                    case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                    case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                    case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                    case ValueTag.XS_UNSIGNED_INT_TAG:
+                    case ValueTag.XS_UNSIGNED_LONG_TAG:
+                        tvp.getValue(tp.longp);
+                        value = tp.longp.longValue();
+                        break;
+
+                    case ValueTag.XS_INT_TAG:
+                    case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                        tvp.getValue(tp.intp);
+                        value = tp.intp.longValue();
+                        break;
+
+                    case ValueTag.XS_SHORT_TAG:
+                    case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                        tvp.getValue(tp.shortp);
+                        value = tp.shortp.longValue();
+                        break;
+
+                    case ValueTag.XS_BYTE_TAG:
+                        tvp.getValue(tp.bytep);
+                        value = tp.bytep.longValue();
+                        break;
+
+                    default:
+                        value = 0;
+                }
+                dOut.write(ValueTag.XS_INTEGER_TAG);
+                dOut.writeLong(value);
+            }
+
             private int getBaseTypeForComparisons(int tid) throws SystemException {
                 while (true) {
                     switch (tid) {
-                        case ValueTag.XS_STRING_TAG:
-                        case ValueTag.XS_DECIMAL_TAG:
-                        case ValueTag.XS_INTEGER_TAG:
-                        case ValueTag.XS_FLOAT_TAG:
-                        case ValueTag.XS_DOUBLE_TAG:
                         case ValueTag.XS_ANY_URI_TAG:
+                        case ValueTag.XS_BASE64_BINARY_TAG:
                         case ValueTag.XS_BOOLEAN_TAG:
                         case ValueTag.XS_DATE_TAG:
                         case ValueTag.XS_DATETIME_TAG:
-                        case ValueTag.XS_TIME_TAG:
                         case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                        case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                        case ValueTag.XS_BASE64_BINARY_TAG:
+                        case ValueTag.XS_DECIMAL_TAG:
+                        case ValueTag.XS_DOUBLE_TAG:
+                        case ValueTag.XS_DURATION_TAG:
+                        case ValueTag.XS_FLOAT_TAG:
                         case ValueTag.XS_HEX_BINARY_TAG:
-                        case ValueTag.XS_QNAME_TAG:
+                        case ValueTag.XS_INTEGER_TAG:
                         case ValueTag.XS_G_DAY_TAG:
                         case ValueTag.XS_G_MONTH_DAY_TAG:
                         case ValueTag.XS_G_MONTH_TAG:
                         case ValueTag.XS_G_YEAR_MONTH_TAG:
                         case ValueTag.XS_G_YEAR_TAG:
+                        case ValueTag.XS_QNAME_TAG:
+                        case ValueTag.XS_STRING_TAG:
+                        case ValueTag.XS_TIME_TAG:
                         case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+                        case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
                             return tid;
 
                         case ValueTag.XS_ANY_ATOMIC_TAG:
@@ -411,10 +522,12 @@ public abstract class AbstractValueCompa
 
     private static class TypedPointables {
         BooleanPointable boolp = (BooleanPointable) BooleanPointable.FACTORY.createPointable();
+        BytePointable bytep = (BytePointable) BytePointable.FACTORY.createPointable();
+        DoublePointable doublep = (DoublePointable) DoublePointable.FACTORY.createPointable();
+        FloatPointable floatp = (FloatPointable) FloatPointable.FACTORY.createPointable();
         IntegerPointable intp = (IntegerPointable) IntegerPointable.FACTORY.createPointable();
         LongPointable longp = (LongPointable) LongPointable.FACTORY.createPointable();
-        FloatPointable floatp = (FloatPointable) FloatPointable.FACTORY.createPointable();
-        DoublePointable doublep = (DoublePointable) DoublePointable.FACTORY.createPointable();
+        ShortPointable shortp = (ShortPointable) ShortPointable.FACTORY.createPointable();
         UTF8StringPointable utf8sp = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable();
         XSBinaryPointable binaryp = (XSBinaryPointable) XSBinaryPointable.FACTORY.createPointable();
         XSDatePointable datep = (XSDatePointable) XSDatePointable.FACTORY.createPointable();

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java Thu Aug 23 00:40:19 2012
@@ -53,10 +53,10 @@ public class ValueEqComparisonOperation 
         DateTime.getTimezoneDateTime(datep2, dCtx, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
-        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getYearMonth(
-                abvsInner.getByteArray(), startOffset2)
-                && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
-                        .getDayTime(abvsInner.getByteArray(), startOffset2)) {
+        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
+                .getYearMonth(abvsInner.getByteArray(), startOffset2)
+                && XSDateTimePointable.getDay(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getDay(
+                        abvsInner.getByteArray(), startOffset2)) {
             return true;
         }
         return false;
@@ -70,8 +70,8 @@ public class ValueEqComparisonOperation 
         DateTime.getTimezoneDateTime(datetimep2, dCtx, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
-        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getYearMonth(
-                abvsInner.getByteArray(), startOffset2)
+        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
+                .getYearMonth(abvsInner.getByteArray(), startOffset2)
                 && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
                         .getDayTime(abvsInner.getByteArray(), startOffset2)) {
             return true;
@@ -90,6 +90,9 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = decp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Double.isNaN(doublep2.getDouble())) {
+            return false;
+        }
         return (double1 == double2);
     }
 
@@ -98,13 +101,18 @@ public class ValueEqComparisonOperation 
             IOException {
         float float1 = decp1.floatValue();
         float float2 = floatp2.floatValue();
+        if (Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (float1 == float2);
     }
 
     @Override
     public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2) throws SystemException,
             IOException {
+        abvsInner.reset();
         XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == 0);
     }
@@ -114,12 +122,18 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = decp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble())) {
+            return false;
+        }
         return (double1 == double2);
     }
 
     @Override
     public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2) throws SystemException,
             IOException {
+        if (Double.isNaN(doublep1.getDouble()) || Double.isNaN(doublep2.getDouble())) {
+            return false;
+        }
         return (doublep1.compareTo(doublep2) == 0);
     }
 
@@ -128,6 +142,9 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = floatp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble()) || Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (double1 == double2);
     }
 
@@ -136,6 +153,9 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = longp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble())) {
+            return false;
+        }
         return (double1 == double2);
     }
 
@@ -146,6 +166,24 @@ public class ValueEqComparisonOperation 
     }
 
     @Override
+    public boolean operateDTDurationDuration(LongPointable longp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        if (durationp2.getYearMonth() == 0 && durationp2.getDayTime() == longp1.getLong()) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean operateDurationDTDuration(XSDurationPointable durationp1, LongPointable longp2)
+            throws SystemException, IOException {
+        if (durationp1.getYearMonth() == 0 && durationp1.getDayTime() == longp2.getLong()) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException {
         return arraysEqual(durationp1.getByteArray(), durationp1.getStartOffset(), durationp1.getLength(),
@@ -153,10 +191,22 @@ public class ValueEqComparisonOperation 
     }
 
     @Override
+    public boolean operateDurationYMDuration(XSDurationPointable durationp1, IntegerPointable intp2)
+            throws SystemException, IOException {
+        if (durationp1.getYearMonth() == intp2.getInteger() && durationp1.getDayTime() == 0) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) throws SystemException,
             IOException {
         float float1 = floatp1.floatValue();
         float float2 = decp2.floatValue();
+        if (Float.isNaN(floatp1.getFloat())) {
+            return false;
+        }
         return (float1 == float2);
     }
 
@@ -165,12 +215,18 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = floatp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Float.isNaN(floatp1.getFloat()) || Double.isNaN(double2)) {
+            return false;
+        }
         return (double1 == double2);
     }
 
     @Override
     public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2) throws SystemException,
             IOException {
+        if (Float.isNaN(floatp1.getFloat()) || Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (floatp1.compareTo(floatp2) == 0);
     }
 
@@ -179,6 +235,9 @@ public class ValueEqComparisonOperation 
             IOException {
         float float1 = floatp1.floatValue();
         float float2 = longp2.floatValue();
+        if (Float.isNaN(floatp1.getFloat())) {
+            return false;
+        }
         return (float1 == float2);
     }
 
@@ -222,7 +281,9 @@ public class ValueEqComparisonOperation 
     @Override
     public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2) throws SystemException,
             IOException {
+        abvsInner.reset();
         XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(longp1.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == 0);
     }
@@ -232,6 +293,9 @@ public class ValueEqComparisonOperation 
             IOException {
         double double1 = longp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Double.isNaN(double2)) {
+            return false;
+        }
         return (double1 == double2);
     }
 
@@ -240,6 +304,9 @@ public class ValueEqComparisonOperation 
             IOException {
         float float1 = longp1.floatValue();
         float float2 = floatp2.floatValue();
+        if (Float.isNaN(float2)) {
+            return false;
+        }
         return (float1 == float2);
     }
 
@@ -276,8 +343,8 @@ public class ValueEqComparisonOperation 
         DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
-        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getYearMonth(
-                abvsInner.getByteArray(), startOffset2)
+        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
+                .getYearMonth(abvsInner.getByteArray(), startOffset2)
                 && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
                         .getDayTime(abvsInner.getByteArray(), startOffset2)) {
             return true;
@@ -286,6 +353,15 @@ public class ValueEqComparisonOperation 
     }
 
     @Override
+    public boolean operateYMDurationDuration(IntegerPointable intp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        if (durationp2.getYearMonth() == intp1.getInteger() && durationp2.getDayTime() == 0) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException,
             IOException {
         return (intp1.compareTo(intp2) == 0);

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueLtComparisonOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueLtComparisonOperation.java?rev=1376335&r1=1376334&r2=1376335&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueLtComparisonOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueLtComparisonOperation.java Thu Aug 23 00:40:19 2012
@@ -12,6 +12,7 @@ import org.apache.vxquery.datamodel.acce
 import org.apache.vxquery.datamodel.accessors.atomic.XSQNamePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable;
 import org.apache.vxquery.datamodel.util.DateTime;
+import org.apache.vxquery.exceptions.ErrorCode;
 import org.apache.vxquery.exceptions.SystemException;
 
 import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
@@ -35,7 +36,7 @@ public class ValueLtComparisonOperation 
     @Override
     public boolean operateBase64BinaryBase64Binary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -53,6 +54,9 @@ public class ValueLtComparisonOperation 
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
+                .getYearMonth(abvsInner.getByteArray(), startOffset2)) {
+            return true;
+        } else if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
                 .getYearMonth(abvsInner.getByteArray(), startOffset2)
                 && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
                         .getDayTime(abvsInner.getByteArray(), startOffset2)) {
@@ -70,6 +74,9 @@ public class ValueLtComparisonOperation 
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
+                .getYearMonth(abvsInner.getByteArray(), startOffset2)) {
+            return true;
+        } else if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
                 .getYearMonth(abvsInner.getByteArray(), startOffset2)
                 && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
                         .getDayTime(abvsInner.getByteArray(), startOffset2)) {
@@ -89,6 +96,9 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = decp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Double.isNaN(doublep2.getDouble())) {
+            return false;
+        }
         return (double1 < double2);
     }
 
@@ -97,13 +107,18 @@ public class ValueLtComparisonOperation 
             IOException {
         float float1 = decp1.floatValue();
         float float2 = floatp2.floatValue();
+        if (Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (float1 < float2);
     }
 
     @Override
     public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2) throws SystemException,
             IOException {
+        abvsInner.reset();
         XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == -1);
     }
@@ -113,12 +128,18 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = decp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble())) {
+            return false;
+        }
         return (double1 < double2);
     }
 
     @Override
     public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2) throws SystemException,
             IOException {
+        if (Double.isNaN(doublep1.getDouble()) || Double.isNaN(doublep2.getDouble())) {
+            return false;
+        }
         return (doublep1.compareTo(doublep2) == -1);
     }
 
@@ -127,6 +148,9 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = floatp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble()) || Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (double1 < double2);
     }
 
@@ -135,6 +159,9 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = doublep1.doubleValue();
         double double2 = longp2.doubleValue();
+        if (Double.isNaN(doublep1.getDouble())) {
+            return false;
+        }
         return (double1 < double2);
     }
 
@@ -145,9 +172,27 @@ public class ValueLtComparisonOperation 
     }
 
     @Override
+    public boolean operateDTDurationDuration(LongPointable longp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        throw new SystemException(ErrorCode.XPTY0004);
+    }
+
+    @Override
+    public boolean operateDurationDTDuration(XSDurationPointable durationp1, LongPointable longp2)
+            throws SystemException, IOException {
+        throw new SystemException(ErrorCode.XPTY0004);
+    }
+
+    @Override
     public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
+    }
+
+    @Override
+    public boolean operateDurationYMDuration(XSDurationPointable durationp1, IntegerPointable intp2)
+            throws SystemException, IOException {
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -155,6 +200,9 @@ public class ValueLtComparisonOperation 
             IOException {
         float float1 = floatp1.floatValue();
         float float2 = decp2.floatValue();
+        if (Float.isNaN(floatp1.getFloat())) {
+            return false;
+        }
         return (float1 < float2);
     }
 
@@ -163,12 +211,18 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = floatp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Float.isNaN(floatp1.getFloat()) || Double.isNaN(double2)) {
+            return false;
+        }
         return (double1 < double2);
     }
 
     @Override
     public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2) throws SystemException,
             IOException {
+        if (Float.isNaN(floatp1.getFloat()) || Float.isNaN(floatp2.getFloat())) {
+            return false;
+        }
         return (floatp1.compareTo(floatp2) == -1);
     }
 
@@ -177,49 +231,54 @@ public class ValueLtComparisonOperation 
             IOException {
         float float1 = floatp1.floatValue();
         float float2 = longp2.floatValue();
+        if (Float.isNaN(floatp1.getFloat())) {
+            return false;
+        }
         return (float1 < float2);
     }
 
     @Override
     public boolean operateGDayGDay(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateGMonthDayGMonthDay(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateGMonthGMonth(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateGYearGYear(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateGYearMonthGYearMonth(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateHexBinaryHexBinary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2) throws SystemException,
             IOException {
+        abvsInner.reset();
         XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(longp1.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == -1);
     }
@@ -229,6 +288,9 @@ public class ValueLtComparisonOperation 
             IOException {
         double double1 = longp1.doubleValue();
         double double2 = doublep2.doubleValue();
+        if (Double.isNaN(double2)) {
+            return false;
+        }
         return (double1 < double2);
     }
 
@@ -237,6 +299,9 @@ public class ValueLtComparisonOperation 
             IOException {
         float float1 = longp1.floatValue();
         float float2 = floatp2.floatValue();
+        if (Float.isNaN(float2)) {
+            return false;
+        }
         return (float1 < float2);
     }
 
@@ -249,13 +314,13 @@ public class ValueLtComparisonOperation 
     @Override
     public boolean operateNotationNotation(UTF8StringPointable stringp1, UTF8StringPointable stringp2)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public boolean operateQNameQName(XSQNamePointable qnamep1, XSQNamePointable qnamep2) throws SystemException,
             IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -272,16 +337,20 @@ public class ValueLtComparisonOperation 
         DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
-        if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable.getYearMonth(
-                abvsInner.getByteArray(), startOffset2)
-                && XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
-                        .getDayTime(abvsInner.getByteArray(), startOffset2)) {
+        if (XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable.getDayTime(
+                abvsInner.getByteArray(), startOffset2)) {
             return true;
         }
         return false;
     }
 
     @Override
+    public boolean operateYMDurationDuration(IntegerPointable intp1, XSDurationPointable durationp2)
+            throws SystemException, IOException {
+        throw new SystemException(ErrorCode.XPTY0004);
+    }
+
+    @Override
     public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException,
             IOException {
         return (intp1.compareTo(intp2) == -1);