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(