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/01 20:15:23 UTC
svn commit: r1368152 [2/2] - in
/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery:
functions/ runtime/functions/cast/
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGMonthOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGMonthOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGMonthOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGMonthOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,91 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
+import org.apache.vxquery.datamodel.util.DateTime;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToGMonthOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertDate(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_MONTH_TAG);
+ dOut.writeShort((short) 1972);
+ dOut.write((byte) datep.getMonth());
+ dOut.write((byte) 29);
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_MONTH_TAG);
+ dOut.writeShort((short) 1972);
+ dOut.write((byte) datetimep.getMonth());
+ dOut.write((byte) 29);
+ dOut.write((byte) 0);
+ dOut.write((byte) 0);
+ dOut.writeInt((int) 0);
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertGMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_MONTH_TAG);
+ dOut.write(datep.getByteArray(), datep.getStartOffset(), datep.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ int c;
+ int index = 0;
+ long[] date = new long[3];
+ boolean positiveTimezone = false;
+
+ // Set defaults
+ date[1] = DateTime.TIMEZONE_HOUR_NULL;
+ date[2] = DateTime.TIMEZONE_MINUTE_NULL;
+
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ date[index] = date[index] * 10 + Character.getNumericValue(c);
+ } else if (c == Character.valueOf('-') || c == Character.valueOf(':')) {
+ ++index;
+ } else if (c == Character.valueOf('+')) {
+ positiveTimezone = true;
+ ++index;
+ } else {
+ // Invalid date format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+ if (!DateTime.valid(1972, date[0], 29, 0, 0, 0, date[1], date[2])) {
+ throw new SystemException(ErrorCode.FODT0001);
+ }
+
+ dOut.write(ValueTag.XS_G_MONTH_TAG);
+ dOut.writeShort((short) 1972);
+ dOut.write((byte) date[0]);
+ dOut.write((byte) 29);
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[1]));
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[2]));
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGMonthOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearMonthOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearMonthOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearMonthOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearMonthOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,105 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
+import org.apache.vxquery.datamodel.util.DateTime;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToGYearMonthOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertDate(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_MONTH_TAG);
+ dOut.writeShort((short) datep.getYear());
+ dOut.write((byte) datep.getMonth());
+ if (DateTime.isLeapYear(datep.getYear())) {
+ dOut.write((byte) DateTime.DAYS_OF_MONTH_ORDI[(int) (datep.getMonth() - 1)]);
+ } else {
+ dOut.write((byte) DateTime.DAYS_OF_MONTH_LEAP[(int) (datep.getMonth() - 1)]);
+ }
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_MONTH_TAG);
+ dOut.writeShort((short) datetimep.getYear());
+ dOut.write((byte) datetimep.getMonth());
+ if (DateTime.isLeapYear(datetimep.getYear())) {
+ dOut.write((byte) DateTime.DAYS_OF_MONTH_ORDI[(int) (datetimep.getMonth() - 1)]);
+ } else {
+ dOut.write((byte) DateTime.DAYS_OF_MONTH_LEAP[(int) (datetimep.getMonth() - 1)]);
+ }
+ dOut.write((byte) 0);
+ dOut.write((byte) 0);
+ dOut.writeInt((int) 0);
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertGYearMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_MONTH_TAG);
+ dOut.write(datep.getByteArray(), datep.getStartOffset(), datep.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ int c;
+ int index = 0;
+ long[] date = new long[4];
+ boolean positiveTimezone = false;
+
+ // Set defaults
+ date[2] = DateTime.TIMEZONE_HOUR_NULL;
+ date[3] = DateTime.TIMEZONE_MINUTE_NULL;
+
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ date[index] = date[index] * 10 + Character.getNumericValue(c);
+ } else if (c == Character.valueOf('-') || c == Character.valueOf(':')) {
+ ++index;
+ } else if (c == Character.valueOf('+')) {
+ positiveTimezone = true;
+ ++index;
+ } else {
+ // Invalid date format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+ long day;
+ if (DateTime.isLeapYear(date[0])) {
+ day = DateTime.DAYS_OF_MONTH_ORDI[(int) (date[1] - 1)];
+ } else {
+ day = DateTime.DAYS_OF_MONTH_LEAP[(int) (date[1] - 1)];
+ }
+ if (!DateTime.valid(date[0], date[1], day, 0, 0, 0, date[2], date[3])) {
+ throw new SystemException(ErrorCode.FODT0001);
+ }
+
+ dOut.write(ValueTag.XS_G_YEAR_MONTH_TAG);
+ dOut.writeShort((short) date[0]);
+ dOut.write((byte) date[1]);
+ dOut.write((byte) day);
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[2]));
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[3]));
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearMonthOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,91 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
+import org.apache.vxquery.datamodel.util.DateTime;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToGYearOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertDate(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_TAG);
+ dOut.writeShort((short) datep.getYear());
+ dOut.write((byte) 1);
+ dOut.write((byte) 1);
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_TAG);
+ dOut.writeShort((short) datetimep.getYear());
+ dOut.write((byte) 1);
+ dOut.write((byte) 1);
+ dOut.write((byte) 0);
+ dOut.write((byte) 0);
+ dOut.writeInt((int) 0);
+ dOut.write((byte) DateTime.TIMEZONE_HOUR_NULL);
+ dOut.write((byte) DateTime.TIMEZONE_MINUTE_NULL);
+ }
+
+ @Override
+ public void convertGYear(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_G_YEAR_TAG);
+ dOut.write(datep.getByteArray(), datep.getStartOffset(), datep.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ int c;
+ int index = 0;
+ long[] date = new long[3];
+ boolean positiveTimezone = false;
+
+ // Set defaults
+ date[1] = DateTime.TIMEZONE_HOUR_NULL;
+ date[2] = DateTime.TIMEZONE_MINUTE_NULL;
+
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ date[index] = date[index] * 10 + Character.getNumericValue(c);
+ } else if (c == Character.valueOf('-') || c == Character.valueOf(':')) {
+ ++index;
+ } else if (c == Character.valueOf('+')) {
+ positiveTimezone = true;
+ ++index;
+ } else {
+ // Invalid date format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+ if (!DateTime.valid(date[0], 1, 1, 0, 0, 0, date[1], date[2])) {
+ throw new SystemException(ErrorCode.FODT0001);
+ }
+
+ dOut.write(ValueTag.XS_G_YEAR_TAG);
+ dOut.writeShort((short) date[0]);
+ dOut.write((byte) 1);
+ dOut.write((byte) 1);
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[1]));
+ dOut.write((byte) ((positiveTimezone ? 1 : -1) * date[2]));
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToGYearOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToHexBinaryOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToHexBinaryOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToHexBinaryOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToHexBinaryOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,92 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSBinaryPointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
+
+public class CastToHexBinaryOperation extends AbstractCastToOperation {
+ private ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+ private DataOutput dOutInner = abvsInner.getDataOutput();
+
+ @Override
+ public void convertBase64Binary(XSBinaryPointable binaryp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_HEX_BINARY_TAG);
+ dOut.write(binaryp.getByteArray(), binaryp.getStartOffset(), binaryp.getLength());
+ }
+
+ @Override
+ public void convertHexBinary(XSBinaryPointable binaryp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_HEX_BINARY_TAG);
+ dOut.write(binaryp.getByteArray(), binaryp.getStartOffset(), binaryp.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ abvsInner.reset();
+ int c = 0;
+ byte halfByte1, halfByte2;
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ halfByte1 = getHexBinary((char) c);
+ halfByte2 = getHexBinary((char) c);
+
+ dOutInner.write(((halfByte1 & 0xf0) << 4) + (halfByte2 & 0x0f));
+ }
+
+ dOut.write(ValueTag.XS_HEX_BINARY_TAG);
+ dOut.write((byte) ((abvsInner.getLength() >>> 8) & 0xFF));
+ dOut.write((byte) ((abvsInner.getLength() >>> 0) & 0xFF));
+ dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset(), abvsInner.getLength());
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+ private byte getHexBinary(char hexCharacter) {
+ if (hexCharacter == Character.valueOf('0')) {
+ return 0x00;
+ } else if (hexCharacter == Character.valueOf('1')) {
+ return 0x01;
+ } else if (hexCharacter == Character.valueOf('2')) {
+ return 0x02;
+ } else if (hexCharacter == Character.valueOf('3')) {
+ return 0x03;
+ } else if (hexCharacter == Character.valueOf('4')) {
+ return 0x04;
+ } else if (hexCharacter == Character.valueOf('5')) {
+ return 0x05;
+ } else if (hexCharacter == Character.valueOf('6')) {
+ return 0x06;
+ } else if (hexCharacter == Character.valueOf('7')) {
+ return 0x07;
+ } else if (hexCharacter == Character.valueOf('8')) {
+ return 0x08;
+ } else if (hexCharacter == Character.valueOf('9')) {
+ return 0x09;
+ } else if (hexCharacter == Character.valueOf('a')) {
+ return 0x0a;
+ } else if (hexCharacter == Character.valueOf('b')) {
+ return 0x0b;
+ } else if (hexCharacter == Character.valueOf('c')) {
+ return 0x0c;
+ } else if (hexCharacter == Character.valueOf('d')) {
+ return 0x0d;
+ } else if (hexCharacter == Character.valueOf('e')) {
+ return 0x0e;
+ } else {
+ return 0x0f;
+ }
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToHexBinaryOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToIntegerOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToIntegerOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToIntegerOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToIntegerOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,87 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDecimalPointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
+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.LongPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToIntegerOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertBoolean(BooleanPointable boolp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.writeLong((long) (boolp.getBoolean() ? 1 : 0));
+ }
+
+ @Override
+ public void convertDecimal(XSDecimalPointable decp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.writeLong(decp.longValue());
+ }
+
+ @Override
+ public void convertDouble(DoublePointable doublep, DataOutput dOut) throws SystemException, IOException {
+ if (doublep.getDouble() > Long.MAX_VALUE || doublep.getDouble() < Long.MIN_VALUE) {
+ throw new SystemException(ErrorCode.FOCA0003);
+ }
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.writeLong(doublep.longValue());
+ }
+
+ @Override
+ public void convertFloat(FloatPointable floatp, DataOutput dOut) throws SystemException, IOException {
+ if (floatp.getFloat() > Long.MAX_VALUE || floatp.getFloat() < Long.MIN_VALUE) {
+ throw new SystemException(ErrorCode.FOCA0003);
+ }
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.writeLong(floatp.longValue());
+ }
+
+ @Override
+ public void convertInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.write(longp.getByteArray(), longp.getStartOffset(), longp.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ long value = 0;
+ int c = 0;
+ boolean negative = false;
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ value = value * 10 + Character.getNumericValue(c);
+ } else if (c == Character.valueOf('-')) {
+ negative = true;
+ } else {
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+ if (negative) {
+ value *= -1;
+ }
+ System.err.println(" int value = " + value);
+
+ dOut.write(ValueTag.XS_INTEGER_TAG);
+ dOut.writeLong(value);
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToIntegerOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToNotationOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToNotationOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToNotationOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToNotationOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,25 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToNotationOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertNotation(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_NOTATION_TAG);
+ dOut.write(stringp.getByteArray(), stringp.getStartOffset(), stringp.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_NOTATION_TAG);
+ dOut.write(stringp.getByteArray(), stringp.getStartOffset(), stringp.getLength());
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToNotationOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToQNameOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToQNameOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToQNameOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToQNameOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,55 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSQNamePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
+
+public class CastToQNameOperation extends AbstractCastToOperation {
+ ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+ DataOutput dOutInner = abvsInner.getDataOutput();
+
+ @Override
+ public void convertQName(XSQNamePointable qnamep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_QNAME_TAG);
+ dOut.write(qnamep.getByteArray(), qnamep.getStartOffset(), qnamep.getLength());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ int c = 0;
+ int prefixLength = 0;
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (c == Character.valueOf(':')) {
+ prefixLength = abvsInner.getLength();
+ } else {
+ dOutInner.writeChar(c);
+ }
+ }
+
+ dOut.write(ValueTag.XS_QNAME_TAG);
+ dOut.write((byte) ((0 >>> 8) & 0xFF));
+ dOut.write((byte) ((0 >>> 0) & 0xFF));
+ // No URI
+
+ dOut.write((byte) ((prefixLength >>> 8) & 0xFF));
+ dOut.write((byte) ((prefixLength >>> 0) & 0xFF));
+ dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset(), prefixLength);
+
+ int localNameLength = abvsInner.getLength() - prefixLength;
+ dOut.write((byte) ((localNameLength >>> 8) & 0xFF));
+ dOut.write((byte) ((localNameLength >>> 0) & 0xFF));
+ dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset() + prefixLength, localNameLength);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToQNameOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,715 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.commons.codec.binary.Base64OutputStream;
+import org.apache.vxquery.datamodel.accessors.atomic.XSBinaryPointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDatePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDecimalPointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSDurationPointable;
+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.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
+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.UTF8StringPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
+import edu.uci.ics.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
+
+public class CastToStringOperation extends AbstractCastToOperation {
+ private ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+ private DataOutput dOutInner = abvsInner.getDataOutput();
+ int returnTag = ValueTag.XS_STRING_TAG;
+
+ @Override
+ public void convertAnyURI(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(returnTag);
+ dOut.write(stringp.getByteArray(), stringp.getStartOffset(), stringp.getLength());
+ }
+
+ @Override
+ public void convertBase64Binary(XSBinaryPointable binaryp, DataOutput dOut) throws SystemException, IOException {
+ ByteArrayAccessibleOutputStream baaos = new ByteArrayAccessibleOutputStream();
+ Base64OutputStream b64os = new Base64OutputStream(baaos, false);
+ b64os.write(binaryp.getByteArray(), binaryp.getStartOffset() + 2, binaryp.getLength() - 2);
+
+ dOut.write(returnTag);
+ dOut.write((byte) ((baaos.size() >>> 8) & 0xFF));
+ dOut.write((byte) ((baaos.size() >>> 0) & 0xFF));
+ dOut.write(baaos.getByteArray());
+ }
+
+ @Override
+ public void convertBoolean(BooleanPointable boolp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ if (boolp.getBoolean()) {
+ dOutInner.writeChars("true");
+ } else {
+ dOutInner.writeChars("false");
+ }
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDate(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Year
+ dOutInner.writeChars(String.format("%04d", datep.getYear()));
+ dOutInner.writeChar('-');
+
+ // Month
+ dOutInner.writeChars(String.format("%02d", datep.getMonth()));
+ dOutInner.writeChar('-');
+
+ // Day
+ dOutInner.writeChars(String.format("%02d", datep.getDay()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Year
+ writeNumberWithPadding(datetimep.getYear(), 4, dOutInner);
+ dOutInner.writeChar('-');
+
+ // Month
+ writeNumberWithPadding(datetimep.getMonth(), 2, dOutInner);
+ dOutInner.writeChar('-');
+
+ // Day
+ writeNumberWithPadding(datetimep.getDay(), 2, dOutInner);
+ dOutInner.writeChar('T');
+
+ // Hour
+ writeNumberWithPadding(datetimep.getHour(), 2, dOutInner);
+ dOutInner.writeChar(':');
+
+ // Minute
+ writeNumberWithPadding(datetimep.getMinute(), 2, dOutInner);
+ dOutInner.writeChar(':');
+
+ // Milliseconds
+ writeNumberWithPadding(datetimep.getMilliSecond(), 2, dOutInner);
+ if (datetimep.getMilliSecond() % DateTime.CHRONON_OF_SECOND != 0) {
+ dOutInner.writeChar('.');
+ writeNumberWithPadding(datetimep.getMilliSecond() % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
+ }
+
+ // Timezone
+ if (datetimep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datetimep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datetimep.getTimezoneMinute() >= 0 && datetimep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ writeNumberWithPadding(datetimep.getTimezoneHour(), 2, dOutInner);
+ dOutInner.writeChar(':');
+ writeNumberWithPadding(datetimep.getTimezoneMinute(), 2, dOutInner);
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDecimal(XSDecimalPointable decp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ byte decimalPlace = decp.getDecimalPlace();
+ long value = decp.getDecimalValue();
+ if (value < 0) {
+ // Negative result, but the rest of the calculations can be based on a positive value.
+ dOutInner.writeChar('-');
+ value *= -1;
+ }
+ int nDigits = (int) Math.log10(value) + 1;
+ long pow10 = (long) Math.pow(10, nDigits - 1);
+ int start = Math.max(decimalPlace, nDigits - 1);
+ int end = Math.min(0, decimalPlace);
+
+ for (int i = start; i >= end; --i) {
+ if (i >= nDigits || i < 0) {
+ dOutInner.writeChar('0');
+ } else {
+ dOutInner.writeChar((char) ('0' + (value / pow10)));
+ value %= pow10;
+ pow10 /= 10;
+ }
+ if (i == decimalPlace) {
+ dOutInner.writeChar('.');
+ }
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDouble(DoublePointable doublep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ double value = doublep.getDouble();
+
+ if (value < 0) {
+ // Negative result, but the rest of the calculations can be based on a positive value.
+ dOutInner.writeChar('-');
+ value *= -1;
+ }
+ byte decimalPlace = 0;
+ // Move the decimal
+ while (value % 1 != 0) {
+ --decimalPlace;
+ value *= 10;
+ }
+ // Remove extra zeros
+ while (value != 0 && value % 10 == 0) {
+ value /= 10;
+ ++decimalPlace;
+ }
+ // Print out the value.
+ int nDigits = (int) Math.log10(value) + 1;
+ long pow10 = (long) Math.pow(10, nDigits - 1);
+ if (nDigits < 0) {
+ dOutInner.writeChars("0.0");
+ } else {
+ for (int i = nDigits - 1; i >= 0; --i) {
+ dOutInner.writeChar((char) ('0' + (value / pow10)));
+ value %= pow10;
+ pow10 /= 10;
+ if (i == nDigits - 1) {
+ dOutInner.writeChar('.');
+ } else {
+ ++decimalPlace;
+ }
+ }
+ }
+ dOutInner.writeChar('E');
+ writeNumberWithPadding(decimalPlace, 1, dOutInner);
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDTDuration(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ int dayTime = intp.getInteger();
+
+ if (dayTime < 0) {
+ dOutInner.writeChar('-');
+ dayTime *= -1;
+ }
+ dOutInner.writeChar('P');
+
+ // Day
+ if (dayTime > DateTime.CHRONON_OF_DAY) {
+ writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_DAY, 1, dOutInner);
+ dOutInner.writeChar('D');
+ dayTime %= DateTime.CHRONON_OF_DAY;
+ }
+
+ if (dayTime > 0) {
+ dOutInner.writeChar('T');
+ }
+
+ // Hour
+ if (dayTime > DateTime.CHRONON_OF_HOUR) {
+ writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_HOUR, 1, dOutInner);
+ dOutInner.writeChar('H');
+ dayTime %= DateTime.CHRONON_OF_HOUR;
+ }
+
+ // Minute
+ if (dayTime > DateTime.CHRONON_OF_MINUTE) {
+ writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
+ dOutInner.writeChar('M');
+ dayTime %= DateTime.CHRONON_OF_MINUTE;
+ }
+
+ // Milliseconds
+ if (dayTime > 0) {
+ writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_SECOND, 1, dOutInner);
+ if (dayTime % DateTime.CHRONON_OF_SECOND != 0) {
+ dOutInner.writeChar('.');
+ writeNumberWithPadding(dayTime % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
+ }
+ dOutInner.writeChar('S');
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertDuration(XSDurationPointable durationp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ int dayTime = durationp.getDayTime();
+
+ if (durationp.getYearMonth() < 0 || dayTime < 0) {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChar('P');
+
+ // Year
+ if (durationp.getYearMonth() > 12) {
+ dOutInner.writeChars(String.format("%01d", durationp.getYearMonth() / 12));
+ dOutInner.writeChar('Y');
+ }
+
+ // Month
+ if (durationp.getYearMonth() % 12 > 0) {
+ dOutInner.writeChars(String.format("%01d", durationp.getYearMonth() % 12));
+ dOutInner.writeChar('M');
+ }
+
+ // Day
+ if (dayTime > DateTime.CHRONON_OF_DAY) {
+ dOutInner.writeChars(String.format("%01d", dayTime / DateTime.CHRONON_OF_DAY));
+ dOutInner.writeChar('D');
+ dayTime %= DateTime.CHRONON_OF_DAY;
+ }
+
+ if (dayTime > 0) {
+ dOutInner.writeChar('T');
+ }
+
+ // Hour
+ if (dayTime > DateTime.CHRONON_OF_HOUR) {
+ dOutInner.writeChars(String.format("%01d", dayTime / DateTime.CHRONON_OF_HOUR));
+ dOutInner.writeChar('H');
+ dayTime %= DateTime.CHRONON_OF_HOUR;
+ }
+
+ // Minute
+ if (dayTime > DateTime.CHRONON_OF_MINUTE) {
+ writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
+ dOutInner.writeChar('M');
+ dayTime %= DateTime.CHRONON_OF_MINUTE;
+ }
+
+ // Milliseconds
+ if (dayTime > 0) {
+ dOutInner.writeChars(String.format("%01d", dayTime / DateTime.CHRONON_OF_SECOND));
+ if (dayTime % DateTime.CHRONON_OF_SECOND != 0) {
+ dOutInner.writeChar('.');
+ dOutInner.writeChars(String.format("%03d", dayTime % DateTime.CHRONON_OF_SECOND));
+ }
+ dOutInner.writeChar('S');
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertFloat(FloatPointable floatp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ float value = floatp.getFloat();
+
+ if (value < 0) {
+ // Negative result, but the rest of the calculations can be based on a positive value.
+ dOutInner.writeChar('-');
+ value *= -1;
+ }
+ byte decimalPlace = 0;
+ // Move the decimal
+ while (value % 1 != 0) {
+ --decimalPlace;
+ value *= 10;
+ }
+ // Remove extra zeros
+ while (value != 0 && value % 10 == 0) {
+ value /= 10;
+ ++decimalPlace;
+ }
+ // Print out the value.
+ int nDigits = (int) Math.log10(value) + 1;
+ long pow10 = (long) Math.pow(10, nDigits - 1);
+ if (nDigits < 0) {
+ dOutInner.writeChars("0.0");
+ } else {
+ for (int i = nDigits - 1; i >= 0; --i) {
+ dOutInner.writeChar((char) ('0' + (value / pow10)));
+ value %= pow10;
+ pow10 /= 10;
+ if (i == nDigits - 1) {
+ dOutInner.writeChar('.');
+ } else {
+ ++decimalPlace;
+ }
+ }
+ }
+ dOutInner.writeChar('E');
+ writeNumberWithPadding(decimalPlace, 1, dOutInner);
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertGDay(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+
+ dOutInner.writeChar('-');
+ dOutInner.writeChar('-');
+ dOutInner.writeChar('-');
+
+ // Day
+ dOutInner.writeChars(String.format("%02d", datep.getDay()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertGMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+
+ dOutInner.writeChar('-');
+ dOutInner.writeChar('-');
+
+ // Month
+ dOutInner.writeChars(String.format("%02d", datep.getMonth()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertGMonthDay(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Year
+ dOutInner.writeChar('-');
+
+ // Month
+ dOutInner.writeChars(String.format("%02d", datep.getMonth()));
+ dOutInner.writeChar('-');
+
+ // Day
+ dOutInner.writeChars(String.format("%02d", datep.getDay()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertGYear(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Year
+ dOutInner.writeChars(String.format("%04d", datep.getYear()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertGYearMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Year
+ dOutInner.writeChars(String.format("%04d", datep.getYear()));
+ dOutInner.writeChar('-');
+
+ // Month
+ dOutInner.writeChars(String.format("%02d", datep.getMonth()));
+
+ // Timezone
+ if (datep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && datep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (datep.getTimezoneMinute() >= 0 && datep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", datep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertHexBinary(XSBinaryPointable binaryp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // int index = 0;
+ // while (index < binaryp.getBinaryLength()) {
+ // byte characterTuple = binaryp.getByteArray()[0];
+ // writeHexCharacter(characterTuple & 0x0f, dOutInner);
+ // writeHexCharacter((characterTuple & 0xf0) << 4, dOutInner);
+ // }
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ long value = longp.getLong();
+ if (value < 0) {
+ // Negative result, but the rest of the calculations can be based on a positive value.
+ dOutInner.writeChar('-');
+ value *= -1;
+ }
+ int nDigits = (int) Math.log10(value) + 1;
+ long pow10 = (long) Math.pow(10, nDigits - 1);
+ for (int i = nDigits - 1; i >= 0; --i) {
+ dOutInner.writeChar((char) ('0' + (value / pow10)));
+ value %= pow10;
+ pow10 /= 10;
+ }
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertNotation(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(returnTag);
+ dOut.write(stringp.getByteArray(), stringp.getStartOffset(), stringp.getLength());
+ }
+
+ @Override
+ public void convertQName(XSQNamePointable qnamep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ dOutInner.write(qnamep.getByteArray(), qnamep.getStartOffset() + qnamep.getUriLength() + 4,
+ qnamep.getPrefixLength());
+ dOutInner.writeChar(':');
+ dOutInner.write(qnamep.getByteArray(),
+ qnamep.getStartOffset() + qnamep.getUriLength() + qnamep.getPrefixLength() + 6,
+ qnamep.getLocalNameLength());
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ // System.err.println(" convertString in CastToString length = " + stringp.getUTFLength());
+ // ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ // charIterator.reset();
+ // for (int c = charIterator.next(); c != ICharacterIterator.EOS_CHAR; c = charIterator.next()) {
+ // System.err.println(" parse value '" + c + "' as '" + Character.valueOf((char) c) + "'");
+ // }
+ // System.err.println(" convertString in CastToString AFTER");
+
+ dOut.write(returnTag);
+ dOut.write(stringp.getByteArray(), stringp.getStartOffset(), stringp.getLength());
+ }
+
+ @Override
+ public void convertTime(XSTimePointable timep, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ // Hours
+ dOutInner.writeChars(String.format("%02d", timep.getHour()));
+ dOutInner.writeChar(':');
+
+ // Minute
+ dOutInner.writeChars(String.format("%02d", timep.getMinute()));
+ dOutInner.writeChar(':');
+
+ // Milliseconds
+ dOutInner.writeChars(String.format("%02d", timep.getMilliSecond() / DateTime.CHRONON_OF_SECOND));
+ if (timep.getMilliSecond() % DateTime.CHRONON_OF_SECOND != 0) {
+ dOutInner.writeChar('.');
+ dOutInner.writeChars(String.format("%03d", timep.getMilliSecond() % DateTime.CHRONON_OF_SECOND));
+ }
+
+ // Timezone
+ if (timep.getTimezoneHour() != DateTime.TIMEZONE_HOUR_NULL
+ && timep.getTimezoneMinute() != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (timep.getTimezoneMinute() >= 0 && timep.getTimezoneMinute() >= 0) {
+ dOutInner.writeChar('+');
+ } else {
+ dOutInner.writeChar('-');
+ }
+ dOutInner.writeChars(String.format("%02d", timep.getTimezoneHour()));
+ dOutInner.writeChar(':');
+ dOutInner.writeChars(String.format("%02d", timep.getTimezoneMinute()));
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+ @Override
+ public void convertYMDuration(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
+ abvsInner.reset();
+ int yearMonth = intp.getInteger();
+
+ if (yearMonth < 0) {
+ dOutInner.writeChar('-');
+ yearMonth *= -1;
+ }
+ dOutInner.writeChar('P');
+
+ // Year
+ if (yearMonth > 12) {
+ writeNumberWithPadding(yearMonth / 12, 1, dOutInner);
+ dOutInner.writeChar('Y');
+ }
+
+ // Month
+ if (yearMonth % 12 > 0) {
+ writeNumberWithPadding(yearMonth % 12, 1, dOutInner);
+ dOutInner.writeChar('M');
+ }
+
+ sendStringDataOutput(dOut);
+ }
+
+ private void sendStringDataOutput(DataOutput dOut) throws SystemException, IOException {
+ dOut.write(returnTag);
+ dOut.write((byte) ((abvsInner.getLength() >>> 8) & 0xFF));
+ dOut.write((byte) ((abvsInner.getLength() >>> 0) & 0xFF));
+ dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset(), abvsInner.getLength());
+ }
+
+ private void writeHexCharacter(int hexCharacter, DataOutput dOut) throws IOException {
+ switch (hexCharacter) {
+ case 0:
+ dOut.writeChar('0');
+ break;
+ case 1:
+ dOut.writeChar('1');
+ break;
+ case 2:
+ dOut.writeChar('2');
+ break;
+ case 3:
+ dOut.writeChar('3');
+ break;
+ case 4:
+ dOut.writeChar('4');
+ break;
+ case 5:
+ dOut.writeChar('5');
+ break;
+ case 6:
+ dOut.writeChar('6');
+ break;
+ case 7:
+ dOut.writeChar('7');
+ break;
+ case 8:
+ dOut.writeChar('8');
+ break;
+ case 9:
+ dOut.writeChar('9');
+ break;
+ case 10:
+ dOut.writeChar('a');
+ break;
+ case 11:
+ dOut.writeChar('b');
+ break;
+ case 12:
+ dOut.writeChar('c');
+ break;
+ case 13:
+ dOut.writeChar('d');
+ break;
+ case 14:
+ dOut.writeChar('e');
+ break;
+ case 15:
+ dOut.writeChar('f');
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Writes a number to the DataOutput with zeros as place holders if the number is too small to fill the padding.
+ *
+ * @param value
+ * @param padding
+ * @param dOut
+ * @throws IOException
+ */
+ private void writeNumberWithPadding(long value, int padding, DataOutput dOut) throws IOException {
+ if (value < 0) {
+ dOut.writeChar('-');
+ }
+ value = Math.abs(value);
+ int nDigits = (value == 0 ? 0 : (int) Math.log10(value) + 1);
+
+ while (padding > nDigits) {
+ dOut.writeChar('0');
+ --padding;
+ }
+ int number;
+ while (nDigits > 0) {
+ number = (int) (value / Math.pow(10, nDigits - 1));
+ dOut.writeChar(Character.forDigit(number, 10));
+ value = (int) (value - number * Math.pow(10, nDigits - 1));
+ --nDigits;
+ }
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToTimeOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToTimeOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToTimeOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToTimeOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,96 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDateTimePointable;
+import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable;
+import org.apache.vxquery.datamodel.util.DateTime;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToTimeOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_TIME_TAG);
+ dOut.write((byte) datetimep.getHour());
+ dOut.write((byte) datetimep.getMinute());
+ dOut.writeLong(datetimep.getMilliSecond());
+ dOut.write((byte) datetimep.getTimezoneHour());
+ dOut.write((byte) datetimep.getTimezoneMinute());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+ int c;
+ int index = 0;
+ long[] date = new long[5];
+ boolean positiveTimezone = false;
+ boolean pastDecimal = false;
+ byte decimalPlace = 3;
+
+ // Set defaults
+ date[3] = DateTime.TIMEZONE_HOUR_NULL;
+ date[4] = DateTime.TIMEZONE_MINUTE_NULL;
+
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ date[index] = date[index] * 10 + Character.getNumericValue(c);
+ if (pastDecimal) {
+ --decimalPlace;
+ }
+ } else if (c == Character.valueOf('-') || c == Character.valueOf(':')) {
+ ++index;
+ pastDecimal = false;
+ } else if (c == Character.valueOf('+')) {
+ pastDecimal = false;
+ positiveTimezone = true;
+ ++index;
+ } else if (c == Character.valueOf('.')) {
+ pastDecimal = true;
+ } else {
+ // Invalid date format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+ // Final touches on seconds and timezone.
+ date[2] = (long) (date[2] * Math.pow(10, decimalPlace));
+ if (!positiveTimezone && date[3] != DateTime.TIMEZONE_HOUR_NULL) {
+ date[3] *= -1;
+ }
+ if (!positiveTimezone && date[4] != DateTime.TIMEZONE_MINUTE_NULL) {
+ date[4] *= -1;
+ }
+ // Double check for a valid time
+ if (!DateTime.valid(1972, 12, 31, date[0], date[1], date[2], date[3], date[4])) {
+ throw new SystemException(ErrorCode.FODT0001);
+ }
+
+ dOut.write(ValueTag.XS_TIME_TAG);
+ dOut.write((byte) date[0]);
+ dOut.write((byte) date[1]);
+ dOut.writeInt((int) date[2]);
+ dOut.write((byte) date[3]);
+ dOut.write((byte) date[4]);
+ }
+
+ @Override
+ public void convertTime(XSTimePointable timep, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_TIME_TAG);
+ dOut.write(timep.getByteArray(), timep.getStartOffset(), timep.getLength());
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToTimeOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToUntypedAtomicOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToUntypedAtomicOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToUntypedAtomicOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToUntypedAtomicOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,7 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import org.apache.vxquery.datamodel.values.ValueTag;
+
+public class CastToUntypedAtomicOperation extends CastToStringOperation {
+ int returnTag = ValueTag.XS_UNTYPED_ATOMIC_TAG;
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToUntypedAtomicOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToYMDurationOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToYMDurationOperation.java?rev=1368152&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToYMDurationOperation.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToYMDurationOperation.java Wed Aug 1 18:15:22 2012
@@ -0,0 +1,81 @@
+package org.apache.vxquery.runtime.functions.cast;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.atomic.XSDurationPointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
+
+import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class CastToYMDurationOperation extends AbstractCastToOperation {
+
+ @Override
+ public void convertDTDuration(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+ dOut.writeInt(0);
+ }
+
+ @Override
+ public void convertDuration(XSDurationPointable durationp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+ dOut.writeInt(durationp.getYearMonth());
+ }
+
+ @Override
+ public void convertString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
+ charIterator.reset();
+
+ int value = 0;
+ long year = 0, month = 0;
+ long negativeResult = 1;
+
+ // First character
+ int c = charIterator.next();
+ if (c == Character.valueOf('-')) {
+ negativeResult = -1;
+ c = charIterator.next();
+ }
+ if (c != Character.valueOf('P')) {
+ // Invalid duration format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+
+ while ((c = charIterator.next()) != ICharacterIterator.EOS_CHAR) {
+ if (Character.isDigit(c)) {
+ value = value * 10 + Character.getNumericValue(c);
+ } else if (c == Character.valueOf('Y')) {
+ year = value;
+ value = 0;
+ } else if (c == Character.valueOf('M')) {
+ month = value;
+ value = 0;
+ } else {
+ // Invalid duration format.
+ throw new SystemException(ErrorCode.FORG0001);
+ }
+ }
+
+ long yearMonth = year * 12 + month;
+ dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+ dOut.writeInt((int) (negativeResult * yearMonth));
+ }
+
+ @Override
+ public void convertUntypedAtomic(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ convertString(stringp, dOut);
+ }
+
+ @Override
+ public void convertYMDuration(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
+ dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
+ dOut.write(intp.getByteArray(), intp.getStartOffset(), intp.getLength());
+ }
+
+}
\ No newline at end of file
Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToYMDurationOperation.java
------------------------------------------------------------------------------
svn:eol-style = native