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/30 02:25:44 UTC

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

Author: prestonc
Date: Thu Aug 30 00:25:44 2012
New Revision: 1378778

URL: http://svn.apache.org/viewvc?rev=1378778&view=rev
Log:
Update the add and subtract operations for date, time, and datetime. A few of the supporting DateTime functions also needed to be updated.

Modified:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/atomic/XSDateTimePointable.java
    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/arithmetic/AddOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.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/accessors/atomic/XSDateTimePointable.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/atomic/XSDateTimePointable.java?rev=1378778&r1=1378777&r2=1378778&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/atomic/XSDateTimePointable.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/atomic/XSDateTimePointable.java Thu Aug 30 00:25:44 2012
@@ -193,7 +193,7 @@ public class XSDateTimePointable extends
                 + getMilliSecond(bytes, start)
                 + (getTimezoneHour(bytes, start) != DateTime.TIMEZONE_HOUR_NULL
                         && getTimezoneMinute(bytes, start) != DateTime.TIMEZONE_MINUTE_NULL ? (getTimezoneHour(bytes,
-                        start) < 0 || getTimezoneMinute(bytes, start) < 0 ? "-" : "+")
+                        start) < 0 || getTimezoneMinute(bytes, start) < 0 ? "" : "+")
                         + getTimezoneHour(bytes, start) + ":" + getTimezoneMinute(bytes, start) : "");
     }
 

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=1378778&r1=1378777&r2=1378778&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 30 00:25:44 2012
@@ -3,8 +3,6 @@ package org.apache.vxquery.datamodel.uti
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.context.DynamicContext;
-import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
 import org.apache.vxquery.datamodel.api.ITimezone;
 import org.apache.vxquery.datamodel.values.ValueTag;
 
@@ -44,6 +42,9 @@ public class DateTime {
     public static final int YEAR_FIELD_INDEX = 0, MONTH_FIELD_INDEX = 1, DAY_FIELD_INDEX = 2, HOUR_FIELD_INDEX = 3,
             MINUTE_FIELD_INDEX = 4, MILLISECOND_FIELD_INDEX = 5;
 
+    // Default date for time to datetime conversions.
+    public static final int TIME_DEFAULT_YEAR = 1972, TIME_DEFAULT_MONTH = 12, TIME_DEFAULT_DAY = 31;
+
     /**
      * Check whether a given year is a leap year.
      * 
@@ -116,7 +117,40 @@ public class DateTime {
         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]
                 || month < DateTime.FIELD_MINS[DateTime.MONTH_FIELD_INDEX]
-                || month > DateTime.FIELD_MAXS[DateTime.MONTH_FIELD_INDEX]) {
+                || month > DateTime.FIELD_MAXS[DateTime.MONTH_FIELD_INDEX]
+                || hour < DateTime.FIELD_MINS[DateTime.HOUR_FIELD_INDEX]
+                || hour > DateTime.FIELD_MAXS[DateTime.HOUR_FIELD_INDEX]
+                || minute < DateTime.FIELD_MINS[DateTime.MINUTE_FIELD_INDEX]
+                || minute > DateTime.FIELD_MAXS[DateTime.MINUTE_FIELD_INDEX]
+                || millisecond < DateTime.FIELD_MINS[DateTime.MILLISECOND_FIELD_INDEX]
+                || millisecond > DateTime.FIELD_MAXS[DateTime.MILLISECOND_FIELD_INDEX]) {
+            if (millisecond < DateTime.FIELD_MINS[DateTime.MILLISECOND_FIELD_INDEX]) {
+                // Too small
+                --minute;
+                millisecond += 60000;
+            } else if (millisecond > DateTime.FIELD_MAXS[DateTime.MILLISECOND_FIELD_INDEX]) {
+                // Too large
+                ++minute;
+                millisecond -= 60000;
+            }
+            if (minute < DateTime.FIELD_MINS[DateTime.MINUTE_FIELD_INDEX]) {
+                // Too small
+                --hour;
+                minute += 60;
+            } else if (minute > DateTime.FIELD_MAXS[DateTime.MINUTE_FIELD_INDEX]) {
+                // Too large
+                ++hour;
+                minute -= 60;
+            }
+            if (hour < DateTime.FIELD_MINS[DateTime.HOUR_FIELD_INDEX]) {
+                // Too small
+                --day;
+                hour += 24;
+            } else if (hour > DateTime.FIELD_MAXS[DateTime.HOUR_FIELD_INDEX]) {
+                // Too large
+                ++day;
+                hour -= 24;
+            }
             if (day < DateTime.FIELD_MINS[DateTime.DAY_FIELD_INDEX]) {
                 // Too small
                 --month;
@@ -126,8 +160,7 @@ public class DateTime {
                     --year;
                 }
                 day += monthDayLimits[(int) month - 1];
-            }
-            if (day > monthDayLimits[(int) month - 1]) {
+            } else if (day > monthDayLimits[(int) month - 1]) {
                 // Too large
                 day -= monthDayLimits[(int) month - 1];
                 ++month;
@@ -154,24 +187,22 @@ public class DateTime {
         dOut.writeByte((byte) timezoneMinute);
     }
 
-    public static void getTimezoneDateTime(ITimezone timezonep, DynamicContext dCtx, DataOutput dOut)
+    public static void getUtcTimezoneDateTime(ITimezone timezonep, ITimezone defaultTimezonep, DataOutput dOut)
             throws IOException {
         long timezoneHour;
         long timezoneMinute;
         // Consider time zones.
         if (timezonep.getTimezoneHour() == DateTime.TIMEZONE_HOUR_NULL
                 || timezonep.getTimezoneMinute() == DateTime.TIMEZONE_MINUTE_NULL) {
-            XSDateTimePointable defaultTimezone = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
-            dCtx.getCurrentDateTime(defaultTimezone);
-            timezoneHour = defaultTimezone.getTimezoneHour();
-            timezoneMinute = defaultTimezone.getTimezoneMinute();
+            timezoneHour = defaultTimezonep.getTimezoneHour();
+            timezoneMinute = defaultTimezonep.getTimezoneMinute();
         } else {
             timezoneHour = timezonep.getTimezoneHour();
             timezoneMinute = timezonep.getTimezoneMinute();
         }
         long dayTime = timezonep.getDayTime()
-                - (timezoneHour * DateTime.CHRONON_OF_HOUR + timezoneMinute * DateTime.CHRONON_OF_HOUR);
-        DateTime.normalizeDateTime(timezonep.getYearMonth(), dayTime, dOut);
+                - (timezoneHour * DateTime.CHRONON_OF_HOUR + timezoneMinute * DateTime.CHRONON_OF_MINUTE);
+        DateTime.normalizeDateTime(timezonep.getYearMonth(), dayTime, 0, 0, dOut);
     }
 
     public static void adjustDateTimeToTimezone(ITimezone timezonep, long timezone, DataOutput dOut) throws IOException {
@@ -189,8 +220,4 @@ public class DateTime {
         DateTime.normalizeDateTime(timezonep.getYearMonth(), dayTime, timezoneHour, timezoneMinute, dOut);
     }
 
-    public static void normalizeDateTime(long yearMonth, long dayTime, DataOutput dOut) throws IOException {
-        normalizeDateTime(yearMonth, dayTime, 0, 0, dOut);
-    }
-
 }

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java?rev=1378778&r1=1378777&r2=1378778&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java Thu Aug 30 00:25:44 2012
@@ -24,11 +24,12 @@ public class AddOperation extends Abstra
     protected final DataOutput dOutInner = abvsInner.getDataOutput();
     private XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
     private XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
-    
+    private XSDateTimePointable datetimep1 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+
     @Override
     public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -36,7 +37,8 @@ public class AddOperation extends Abstra
             throws SystemException, IOException {
         abvsInner.reset();
         // Add duration.
-        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() + longp2.getLong(), dOutInner);
+        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() + longp2.getLong(),
+                datep1.getTimezoneHour(), datep1.getTimezoneMinute(), dOutInner);
         byte[] bytes = abvsInner.getByteArray();
         int startOffset = abvsInner.getStartOffset() + 1;
         // Convert to date.
@@ -51,7 +53,7 @@ public class AddOperation extends Abstra
     @Override
     public void operateDatetimeDatetime(XSDateTimePointable datetimep, XSDateTimePointable datetimep2,
             DynamicContext dCtx, DataOutput dOut) throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -59,7 +61,8 @@ public class AddOperation extends Abstra
             throws SystemException, IOException {
         // Add duration.
         abvsInner.reset();
-        DateTime.normalizeDateTime(datetimep1.getYearMonth(), datetimep1.getDayTime() + longp2.getLong(), dOutInner);
+        DateTime.normalizeDateTime(datetimep1.getYearMonth(), datetimep1.getDayTime() + longp2.getLong(),
+                datetimep1.getTimezoneHour(), datetimep1.getTimezoneMinute(), dOutInner);
         dOut.write(ValueTag.XS_DATETIME_TAG);
         dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset() + 1,
                 XSDateTimePointable.TYPE_TRAITS.getFixedLength());
@@ -70,7 +73,8 @@ public class AddOperation extends Abstra
             throws SystemException, IOException {
         // Add duration.
         abvsInner.reset();
-        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() + intp.getInteger(), dOutInner);
+        DateTime.normalizeDateTime(datetimep.getYearMonth() + intp.getInteger(), datetimep.getDayTime(),
+                datetimep.getTimezoneHour(), datetimep.getTimezoneMinute(), dOutInner);
         dOut.write(ValueTag.XS_DATETIME_TAG);
         dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset() + 1,
                 XSDateTimePointable.TYPE_TRAITS.getFixedLength());
@@ -81,7 +85,8 @@ public class AddOperation extends Abstra
             throws SystemException, IOException {
         abvsInner.reset();
         // Add duration.
-        DateTime.normalizeDateTime(datep.getYearMonth(), datep.getDayTime() + intp.getInteger(), dOutInner);
+        DateTime.normalizeDateTime(datep.getYearMonth() + intp.getInteger(), datep.getDayTime(),
+                datep.getTimezoneHour(), datep.getTimezoneMinute(), dOutInner);
         byte[] bytes = abvsInner.getByteArray();
         int startOffset = abvsInner.getStartOffset() + 1;
         // Convert to date.
@@ -274,14 +279,22 @@ public class AddOperation extends Abstra
     @Override
     public void operateDTDurationTime(LongPointable longp1, XSTimePointable timep2, DataOutput dOut)
             throws SystemException, IOException {
+        // Get time into a datetime value.
         abvsInner.reset();
-        // Add duration.
-        DateTime.normalizeDateTime(timep2.getYearMonth(), timep2.getDayTime() + longp1.getLong(), dOutInner);
-        byte[] bytes = abvsInner.getByteArray();
-        int startOffset = abvsInner.getStartOffset() + 1;
+        datetimep1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep1.setDateTime(DateTime.TIME_DEFAULT_YEAR, DateTime.TIME_DEFAULT_MONTH, DateTime.TIME_DEFAULT_DAY,
+                timep2.getHour(), timep2.getMinute(), timep2.getMilliSecond(), timep2.getTimezoneHour(),
+                timep2.getTimezoneMinute());
+
+        // Subtract.
+        DateTime.normalizeDateTime(datetimep1.getYearMonth(), datetimep1.getDayTime() + longp1.getLong(),
+                timep2.getTimezoneHour(), timep2.getTimezoneMinute(), dOutInner);
+
         // Convert to time.
+        int startOffset = abvsInner.getStartOffset() + 1 + XSDateTimePointable.HOUR_OFFSET;
         dOut.write(ValueTag.XS_TIME_TAG);
-        dOut.write(bytes, startOffset + XSDateTimePointable.HOUR_OFFSET, XSTimePointable.TYPE_TRAITS.getFixedLength());
+        dOut.write(abvsInner.getByteArray(), startOffset, XSTimePointable.TYPE_TRAITS.getFixedLength());
     }
 
     @Override
@@ -377,7 +390,7 @@ public class AddOperation extends Abstra
     @Override
     public void operateTimeTime(XSTimePointable timep, XSTimePointable timep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java?rev=1378778&r1=1378777&r2=1378778&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java Thu Aug 30 00:25:44 2012
@@ -26,18 +26,25 @@ public class SubtractOperation extends A
     protected final DataOutput dOutInner2 = abvsInner2.getDataOutput();
     private XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
     private XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
+    private XSDateTimePointable ctxDatetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    private XSDateTimePointable datetimep1 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    private XSDateTimePointable datetimep2 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    private XSDateTimePointable datetimep3 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    private XSDateTimePointable datetimep4 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
 
     public void operateDateDate(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
         abvsInner1.reset();
-        DateTime.getTimezoneDateTime(datep1, dCtx, dOutInner1);
-        XSDateTimePointable datetimep1 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
-        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset() + 1, abvsInner1.getLength());
+        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep1.setDateTime(datep1.getYear(), datep1.getMonth(), datep1.getDay(), 0, 0, 0, datep1.getTimezoneHour(),
+                datep1.getTimezoneMinute());
 
-        abvsInner2.reset();
-        DateTime.getTimezoneDateTime(datep2, dCtx, dOutInner2);
-        XSDateTimePointable datetimep2 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
-        datetimep2.set(abvsInner2.getByteArray(), abvsInner2.getStartOffset() + 1, abvsInner2.getLength());
+        datetimep2.set(abvsInner1.getByteArray(),
+                abvsInner1.getStartOffset() + XSDateTimePointable.TYPE_TRAITS.getFixedLength(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep2.setDateTime(datep2.getYear(), datep2.getMonth(), datep2.getDay(), 0, 0, 0, datep2.getTimezoneHour(),
+                datep2.getTimezoneMinute());
 
         operateDatetimeDatetime(datetimep1, datetimep2, dCtx, dOut);
     }
@@ -47,7 +54,8 @@ public class SubtractOperation extends A
             throws SystemException, IOException {
         // Add duration.
         abvsInner1.reset();
-        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() - longp2.getLong(), dOutInner1);
+        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() - longp2.getLong(),
+                datep1.getTimezoneHour(), datep1.getTimezoneMinute(), dOutInner1);
         byte[] bytes = abvsInner1.getByteArray();
         int startOffset = abvsInner1.getStartOffset() + 1;
         // Convert to date.
@@ -62,49 +70,62 @@ public class SubtractOperation extends A
     @Override
     public void operateDatetimeDatetime(XSDateTimePointable datetimep1, XSDateTimePointable datetimep2,
             DynamicContext dCtx, DataOutput dOut) throws SystemException, IOException {
-        abvsInner1.reset();
-        DateTime.getTimezoneDateTime(datetimep1, dCtx, dOutInner1);
-        byte[] bytes1 = abvsInner1.getByteArray();
-        int startOffset1 = abvsInner1.getStartOffset() + 1;
+        dCtx.getCurrentDateTime(ctxDatetimep);
 
         abvsInner2.reset();
-        DateTime.getTimezoneDateTime(datetimep2, dCtx, dOutInner2);
-        byte[] bytes2 = abvsInner2.getByteArray();
-        int startOffset2 = abvsInner2.getStartOffset() + 1;
-
-        long dayTime1 = XSDateTimePointable.getDayTime(bytes1, startOffset1);
-        long dayTime2 = XSDateTimePointable.getDayTime(bytes2, startOffset2);
-        long yearMonth = XSDateTimePointable.getYearMonth(bytes1, startOffset1)
-                - XSDateTimePointable.getYearMonth(bytes2, startOffset2);
-        // Find duration.
-        dayTime1 -= dayTime2;
+        DateTime.getUtcTimezoneDateTime(datetimep1, ctxDatetimep, dOutInner2);
+        int startOffset1 = abvsInner2.getStartOffset() + 1;
+        datetimep3.set(abvsInner2.getByteArray(), startOffset1, XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+
+        DateTime.getUtcTimezoneDateTime(datetimep2, ctxDatetimep, dOutInner2);
+        int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
+        datetimep4.set(abvsInner2.getByteArray(), startOffset2, XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+
         // Default
-        long year = datetimep1.getYear();
-        long month = datetimep1.getMonth();
-        int change = 1;
-        if (yearMonth > 0) {
-            change = -1;
-        }
+        long year = datetimep3.getYear();
+        long month = datetimep3.getMonth();
+        long dayTime = datetimep3.getDayTime();
+
+        // Loop is based on the YYYY-MM-01 00:00:00
         long[] monthDayLimits = (DateTime.isLeapYear(year) ? DateTime.DAYS_OF_MONTH_LEAP : DateTime.DAYS_OF_MONTH_ORDI);
-        while (yearMonth != 0) {
-            dayTime1 += monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
-            month += change;
-            yearMonth += change;
-
-            if (month < DateTime.FIELD_MINS[DateTime.MONTH_FIELD_INDEX]) {
-                // Too small
-                month = DateTime.FIELD_MAXS[DateTime.MONTH_FIELD_INDEX];
-                --year;
-            } else if (month > DateTime.FIELD_MAXS[DateTime.MONTH_FIELD_INDEX]) {
-                // Too large
-                month = DateTime.FIELD_MINS[DateTime.MONTH_FIELD_INDEX];
-                ++year;
+        while (year != datetimep4.getYear() || (year == datetimep4.getYear() && month != datetimep4.getMonth())) {
+            if (year > datetimep4.getYear()) {
+                if (month == 1) {
+                    --year;
+                    monthDayLimits = (DateTime.isLeapYear(year) ? DateTime.DAYS_OF_MONTH_LEAP
+                            : DateTime.DAYS_OF_MONTH_ORDI);
+                    month = 12;
+                    dayTime += monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                } else {
+                    --month;
+                    dayTime += monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                }
+            } else if (year < datetimep4.getYear()) {
+                if (month == 12) {
+                    month = 1;
+                    ++year;
+                    monthDayLimits = (DateTime.isLeapYear(year) ? DateTime.DAYS_OF_MONTH_LEAP
+                            : DateTime.DAYS_OF_MONTH_ORDI);
+                    dayTime -= monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                } else {
+                    ++month;
+                    dayTime -= monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                }
+            } else {
+                if (month > datetimep4.getMonth()) {
+                    --month;
+                    dayTime += monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                } else if (month < datetimep4.getMonth()) {
+                    ++month;
+                    dayTime -= monthDayLimits[(int) month - 1] * DateTime.CHRONON_OF_DAY;
+                }
             }
-            monthDayLimits = (DateTime.isLeapYear(year) ? DateTime.DAYS_OF_MONTH_LEAP : DateTime.DAYS_OF_MONTH_ORDI);
         }
+        dayTime -= datetimep4.getDayTime();
+
         // Save.
         dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeLong(dayTime1);
+        dOut.writeLong(dayTime);
     }
 
     @Override
@@ -112,7 +133,8 @@ public class SubtractOperation extends A
             throws SystemException, IOException {
         // Add duration.
         abvsInner1.reset();
-        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() - longp.getLong(), dOutInner1);
+        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() - longp.getLong(),
+                datetimep.getTimezoneHour(), datetimep.getTimezoneMinute(), dOutInner1);
         dOut.write(ValueTag.XS_DATETIME_TAG);
         dOut.write(abvsInner1.getByteArray(), abvsInner1.getStartOffset() + 1,
                 XSDateTimePointable.TYPE_TRAITS.getFixedLength());
@@ -123,7 +145,8 @@ public class SubtractOperation extends A
             throws SystemException, IOException {
         // Add duration.
         abvsInner1.reset();
-        DateTime.normalizeDateTime(datetimep.getYearMonth() - intp.getInteger(), datetimep.getDayTime(), dOutInner1);
+        DateTime.normalizeDateTime(datetimep.getYearMonth() - intp.getInteger(), datetimep.getDayTime(),
+                datetimep.getTimezoneHour(), datetimep.getTimezoneMinute(), dOutInner1);
         dOut.write(ValueTag.XS_DATETIME_TAG);
         dOut.write(abvsInner1.getByteArray(), abvsInner1.getStartOffset() + 1,
                 XSDateTimePointable.TYPE_TRAITS.getFixedLength());
@@ -134,7 +157,8 @@ public class SubtractOperation extends A
             throws SystemException, IOException {
         // Add duration.
         abvsInner1.reset();
-        DateTime.normalizeDateTime(datep.getYearMonth() - intp.getInteger(), datep.getDayTime(), dOutInner1);
+        DateTime.normalizeDateTime(datep.getYearMonth() - intp.getInteger(), datep.getDayTime(),
+                datep.getTimezoneHour(), datep.getTimezoneMinute(), dOutInner1);
         byte[] bytes = abvsInner1.getByteArray();
         int startOffset = abvsInner1.getStartOffset() + 1;
         // Convert to date.
@@ -279,13 +303,13 @@ public class SubtractOperation extends A
     @Override
     public void operateDTDurationDate(LongPointable longp, XSDatePointable datep, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public void operateDTDurationDatetime(LongPointable longp, XSDateTimePointable datetimep, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -336,7 +360,7 @@ public class SubtractOperation extends A
     @Override
     public void operateDTDurationTime(LongPointable longp, XSTimePointable timep, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
@@ -450,34 +474,40 @@ public class SubtractOperation extends A
     @Override
     public void operateTimeDTDuration(XSTimePointable timep1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
-        // Add duration.
+        // Get time into a datetime value.
         abvsInner1.reset();
-        DateTime.normalizeDateTime(0, timep1.getDayTime() - longp2.getLong(), dOutInner1);
-        byte[] bytes = abvsInner1.getByteArray();
-        // Convert to date.
-        int startOffset1 = abvsInner1.getStartOffset() + 1;
-        bytes[startOffset1 + XSTimePointable.HOUR_OFFSET] = bytes[startOffset1 + XSDateTimePointable.HOUR_OFFSET];
-        bytes[startOffset1 + XSTimePointable.MINUTE_OFFSET] = bytes[startOffset1 + XSDateTimePointable.MINUTE_OFFSET];
-        bytes[startOffset1 + XSTimePointable.MILLISECOND_OFFSET] = bytes[startOffset1
-                + XSDateTimePointable.MILLISECOND_OFFSET];
-        bytes[startOffset1 + XSTimePointable.TIMEZONE_HOUR_OFFSET] = (byte) timep1.getTimezoneHour();
-        bytes[startOffset1 + XSTimePointable.TIMEZONE_MINUTE_OFFSET] = (byte) timep1.getTimezoneMinute();
+        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep1.setDateTime(DateTime.TIME_DEFAULT_YEAR, DateTime.TIME_DEFAULT_MONTH, DateTime.TIME_DEFAULT_DAY,
+                timep1.getHour(), timep1.getMinute(), timep1.getMilliSecond(), timep1.getTimezoneHour(),
+                timep1.getTimezoneMinute());
+
+        // Subtract.
+        DateTime.normalizeDateTime(datetimep1.getYearMonth(), datetimep1.getDayTime() - longp2.getLong(),
+                timep1.getTimezoneHour(), timep1.getTimezoneMinute(), dOutInner1);
+
+        // Convert to time.
+        int startOffset = abvsInner1.getStartOffset() + 1 + XSDateTimePointable.HOUR_OFFSET;
         dOut.write(ValueTag.XS_TIME_TAG);
-        dOut.write(bytes, startOffset1, XSDatePointable.TYPE_TRAITS.getFixedLength());
+        dOut.write(abvsInner1.getByteArray(), startOffset, XSTimePointable.TYPE_TRAITS.getFixedLength());
     }
 
     @Override
     public void operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
         abvsInner1.reset();
-        DateTime.getTimezoneDateTime(timep1, dCtx, dOutInner1);
-        XSDateTimePointable datetimep1 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
-        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), abvsInner1.getLength());
+        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep1.setDateTime(DateTime.TIME_DEFAULT_YEAR, DateTime.TIME_DEFAULT_MONTH, DateTime.TIME_DEFAULT_DAY,
+                timep1.getHour(), timep1.getMinute(), timep1.getMilliSecond(), timep1.getTimezoneHour(),
+                timep1.getTimezoneMinute());
 
-        abvsInner2.reset();
-        DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner2);
-        XSDateTimePointable datetimep2 = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
-        datetimep2.set(abvsInner2.getByteArray(), abvsInner2.getStartOffset(), abvsInner2.getLength());
+        datetimep2.set(abvsInner1.getByteArray(),
+                abvsInner1.getStartOffset() + XSDateTimePointable.TYPE_TRAITS.getFixedLength(),
+                XSDateTimePointable.TYPE_TRAITS.getFixedLength());
+        datetimep2.setDateTime(DateTime.TIME_DEFAULT_YEAR, DateTime.TIME_DEFAULT_MONTH, DateTime.TIME_DEFAULT_DAY,
+                timep2.getHour(), timep2.getMinute(), timep2.getMilliSecond(), timep2.getTimezoneHour(),
+                timep2.getTimezoneMinute());
 
         operateDatetimeDatetime(datetimep1, datetimep2, dCtx, dOut);
     }
@@ -485,13 +515,13 @@ public class SubtractOperation extends A
     @Override
     public void operateYMDurationDate(IntegerPointable intp, XSDatePointable datep, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override
     public void operateYMDurationDatetime(IntegerPointable intp, XSDateTimePointable datetimep, DataOutput dOut)
             throws SystemException, IOException {
-        throw new UnsupportedOperationException();
+        throw new SystemException(ErrorCode.XPTY0004);
     }
 
     @Override

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=1378778&r1=1378777&r2=1378778&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 30 00:25:44 2012
@@ -25,7 +25,8 @@ import edu.uci.ics.hyracks.data.std.util
 public class ValueEqComparisonOperation extends AbstractValueComparisonOperation {
     protected final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
     protected final DataOutput dOutInner = abvsInner.getDataOutput();
-
+    private XSDateTimePointable ctxDatetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    
     @Override
     public boolean operateAnyURIAnyURI(UTF8StringPointable stringp1, UTF8StringPointable stringp2)
             throws SystemException, IOException {
@@ -49,8 +50,9 @@ public class ValueEqComparisonOperation 
     public boolean operateDateDate(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(datep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(datep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(datep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(datep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
@@ -66,8 +68,9 @@ public class ValueEqComparisonOperation 
     public boolean operateDatetimeDatetime(XSDateTimePointable datetimep1, XSDateTimePointable datetimep2,
             DynamicContext dCtx) throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(datetimep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(datetimep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(datetimep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(datetimep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
@@ -344,8 +347,9 @@ public class ValueEqComparisonOperation 
     public boolean operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx)
             throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(timep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(timep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(timep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable

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=1378778&r1=1378777&r2=1378778&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 30 00:25:44 2012
@@ -26,7 +26,8 @@ import edu.uci.ics.hyracks.data.std.util
 public class ValueLtComparisonOperation extends AbstractValueComparisonOperation {
     protected final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
     protected final DataOutput dOutInner = abvsInner.getDataOutput();
-
+    private XSDateTimePointable ctxDatetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
+    
     @Override
     public boolean operateAnyURIAnyURI(UTF8StringPointable stringp1, UTF8StringPointable stringp2)
             throws SystemException, IOException {
@@ -49,8 +50,9 @@ public class ValueLtComparisonOperation 
     public boolean operateDateDate(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx)
             throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(datep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(datep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(datep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(datep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
@@ -69,8 +71,9 @@ public class ValueLtComparisonOperation 
     public boolean operateDatetimeDatetime(XSDateTimePointable datetimep1, XSDateTimePointable datetimep2,
             DynamicContext dCtx) throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(datetimep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(datetimep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(datetimep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(datetimep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable
@@ -333,8 +336,9 @@ public class ValueLtComparisonOperation 
     public boolean operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx)
             throws SystemException, IOException {
         abvsInner.reset();
-        DateTime.getTimezoneDateTime(timep1, dCtx, dOutInner);
-        DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner);
+        dCtx.getCurrentDateTime(ctxDatetimep);
+        DateTime.getUtcTimezoneDateTime(timep1, ctxDatetimep, dOutInner);
+        DateTime.getUtcTimezoneDateTime(timep2, ctxDatetimep, dOutInner);
         int startOffset1 = abvsInner.getStartOffset() + 1;
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getDayTime(abvsInner.getByteArray(), startOffset1) < XSDateTimePointable.getDayTime(