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/09/27 01:03:49 UTC
svn commit: r1390767 - in
/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions:
cast/CastToStringOperation.java util/FunctionHelper.java
Author: prestonc
Date: Wed Sep 26 23:03:48 2012
New Revision: 1390767
URL: http://svn.apache.org/viewvc?rev=1390767&view=rev
Log:
Moving more functions to the helper class to prepare for use in other classes.
Modified:
incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java
incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
Modified: 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=1390767&r1=1390766&r2=1390767&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/cast/CastToStringOperation.java Wed Sep 26 23:03:48 2012
@@ -27,12 +27,10 @@ import org.apache.vxquery.datamodel.acce
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.api.IDate;
-import org.apache.vxquery.datamodel.api.ITime;
-import org.apache.vxquery.datamodel.api.ITimezone;
import org.apache.vxquery.datamodel.util.DateTime;
import org.apache.vxquery.datamodel.values.ValueTag;
import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.util.FunctionHelper;
import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
import edu.uci.ics.hyracks.data.std.primitive.BytePointable;
@@ -46,25 +44,6 @@ import edu.uci.ics.hyracks.data.std.util
import edu.uci.ics.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
public class CastToStringOperation extends AbstractCastToOperation {
- private static long getPowerOf10(double value, long max, long min) {
- value = Math.abs(value);
- for (long i = min; i < max; i++) {
- if (Math.pow(10, i) > value)
- return i;
- }
- return max;
- }
-
- /**
- * Returns 0 if positive, nonzero if negative.
- *
- * @param value
- * @return
- */
- public static boolean isNumberPostive(long value) {
- return ((value & 0x8000000000000000L) == 0 ? true : false);
- }
-
private ByteArrayAccessibleOutputStream baaos = new ByteArrayAccessibleOutputStream();
private ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
private DataOutput dOutInner = abvsInner.getDataOutput();
@@ -103,9 +82,9 @@ public class CastToStringOperation exten
public void convertBoolean(BooleanPointable boolp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
if (boolp.getBoolean()) {
- writeCharSequence("true", dOutInner);
+ FunctionHelper.writeCharSequence("true", dOutInner);
} else {
- writeCharSequence("false", dOutInner);
+ FunctionHelper.writeCharSequence("false", dOutInner);
}
sendStringDataOutput(dOut);
}
@@ -113,8 +92,8 @@ public class CastToStringOperation exten
@Override
public void convertDate(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeDate(datep, dOutInner);
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeDateAsString(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -122,10 +101,10 @@ public class CastToStringOperation exten
@Override
public void convertDatetime(XSDateTimePointable datetimep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeDate(datetimep, dOutInner);
- writeChar('T', dOutInner);
- writeTime(datetimep, dOutInner);
- writeTimezone(datetimep, dOutInner);
+ FunctionHelper.writeDateAsString(datetimep, dOutInner);
+ FunctionHelper.writeChar('T', dOutInner);
+ FunctionHelper.writeTimeAsString(datetimep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datetimep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -137,14 +116,14 @@ public class CastToStringOperation exten
long value = decp.getDecimalValue();
byte nDigits = decp.getDigitCount();
- if (!isNumberPostive(value)) {
+ if (!FunctionHelper.isNumberPostive(value)) {
// Negative result, but the rest of the calculations can be based on a positive value.
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
value *= -1;
}
if (value == 0) {
- writeChar('0', dOutInner);
+ FunctionHelper.writeChar('0', dOutInner);
} else {
long pow10 = (long) Math.pow(10, nDigits - 1);
int start = Math.max(decimalPlace, nDigits - 1);
@@ -152,14 +131,14 @@ public class CastToStringOperation exten
for (int i = start; i >= end; --i) {
if (i >= nDigits || i < 0) {
- writeChar('0', dOutInner);
+ FunctionHelper.writeChar('0', dOutInner);
} else {
- writeChar((char) ('0' + (value / pow10)), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + (value / pow10)), dOutInner);
value %= pow10;
pow10 /= 10;
}
if (i == decimalPlace && value > 0) {
- writeChar('.', dOutInner);
+ FunctionHelper.writeChar('.', dOutInner);
}
}
}
@@ -184,9 +163,9 @@ public class CastToStringOperation exten
boolean negative = ((bits >> 63) == 0) ? false : true;
if (negative) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
}
- writeCharSequence("0", dOutInner);
+ FunctionHelper.writeCharSequence("0", dOutInner);
sendStringDataOutput(dOut);
} else {
convertDoubleCanonical(doublep, dOut);
@@ -199,11 +178,11 @@ public class CastToStringOperation exten
if (Double.isInfinite(value)) {
if (value == Double.NEGATIVE_INFINITY) {
- writeCharSequence("-", dOutInner);
+ FunctionHelper.writeCharSequence("-", dOutInner);
}
- writeCharSequence("INF", dOutInner);
+ FunctionHelper.writeCharSequence("INF", dOutInner);
} else if (Double.isNaN(value)) {
- writeCharSequence("NaN", dOutInner);
+ FunctionHelper.writeCharSequence("NaN", dOutInner);
} else {
/*
* The double to string algorithm is based on a paper by Robert G Burger and
@@ -218,10 +197,10 @@ public class CastToStringOperation exten
e = e + DOUBLE_MANTISSA_OFFSET;
if (negative) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
}
if (value == 0) {
- writeCharSequence("0.0E0", dOutInner);
+ FunctionHelper.writeCharSequence("0.0E0", dOutInner);
} else {
// Initialize variables
double r, s, mPlus, mMinus;
@@ -277,26 +256,26 @@ public class CastToStringOperation exten
if (r * 2 > s) {
d = d + 1;
}
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
} else if (r + mPlus > s) {
d = d + 1;
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
} else if (r < mMinus) {
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
}
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
if (!decimalPlaced) {
decimalPlaced = true;
- writeChar('.', dOutInner);
+ FunctionHelper.writeChar('.', dOutInner);
}
}
- long decimalPlace = getPowerOf10(value, DOUBLE_EXPONENT_MAX, DOUBLE_EXPONENT_MIN) - 1;
- writeChar('E', dOutInner);
- writeNumberWithPadding(decimalPlace, 1, dOutInner);
+ long decimalPlace = FunctionHelper.getPowerOf10(value, DOUBLE_EXPONENT_MAX, DOUBLE_EXPONENT_MIN) - 1;
+ FunctionHelper.writeChar('E', dOutInner);
+ FunctionHelper.writeNumberWithPadding(decimalPlace, 1, dOutInner);
}
}
sendStringDataOutput(dOut);
@@ -308,47 +287,47 @@ public class CastToStringOperation exten
long dayTime = longp.getLong();
if (dayTime == 0) {
- writeCharSequence("PT0S", dOutInner);
+ FunctionHelper.writeCharSequence("PT0S", dOutInner);
} else {
if (dayTime < 0) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
dayTime *= -1;
}
- writeChar('P', dOutInner);
+ FunctionHelper.writeChar('P', dOutInner);
// Day
if (dayTime >= DateTime.CHRONON_OF_DAY) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_DAY, 1, dOutInner);
- writeChar('D', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_DAY, 1, dOutInner);
+ FunctionHelper.writeChar('D', dOutInner);
dayTime %= DateTime.CHRONON_OF_DAY;
}
if (dayTime > 0) {
- writeChar('T', dOutInner);
+ FunctionHelper.writeChar('T', dOutInner);
}
// Hour
if (dayTime >= DateTime.CHRONON_OF_HOUR) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_HOUR, 1, dOutInner);
- writeChar('H', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_HOUR, 1, dOutInner);
+ FunctionHelper.writeChar('H', dOutInner);
dayTime %= DateTime.CHRONON_OF_HOUR;
}
// Minute
if (dayTime >= DateTime.CHRONON_OF_MINUTE) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
- writeChar('M', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
+ FunctionHelper.writeChar('M', dOutInner);
dayTime %= DateTime.CHRONON_OF_MINUTE;
}
// Milliseconds
if (dayTime > 0) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_SECOND, 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_SECOND, 1, dOutInner);
if (dayTime % DateTime.CHRONON_OF_SECOND != 0) {
- writeChar('.', dOutInner);
- writeNumberWithPadding(dayTime % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
+ FunctionHelper.writeChar('.', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
}
- writeChar('S', dOutInner);
+ FunctionHelper.writeChar('S', dOutInner);
}
}
sendStringDataOutput(dOut);
@@ -361,57 +340,57 @@ public class CastToStringOperation exten
long dayTime = durationp.getDayTime();
if (yearMonth < 0 || dayTime < 0) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
yearMonth *= -1;
dayTime *= -1;
}
- writeChar('P', dOutInner);
+ FunctionHelper.writeChar('P', dOutInner);
// Year
if (yearMonth >= 12) {
- writeNumberWithPadding(yearMonth / 12, 1, dOutInner);
- writeChar('Y', dOutInner);
+ FunctionHelper.writeNumberWithPadding(yearMonth / 12, 1, dOutInner);
+ FunctionHelper.writeChar('Y', dOutInner);
}
// Month
if (yearMonth % 12 > 0) {
- writeNumberWithPadding(yearMonth % 12, 1, dOutInner);
- writeChar('M', dOutInner);
+ FunctionHelper.writeNumberWithPadding(yearMonth % 12, 1, dOutInner);
+ FunctionHelper.writeChar('M', dOutInner);
}
// Day
if (dayTime >= DateTime.CHRONON_OF_DAY) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_DAY, 1, dOutInner);
- writeChar('D', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_DAY, 1, dOutInner);
+ FunctionHelper.writeChar('D', dOutInner);
dayTime %= DateTime.CHRONON_OF_DAY;
}
if (dayTime > 0) {
- writeChar('T', dOutInner);
+ FunctionHelper.writeChar('T', dOutInner);
}
// Hour
if (dayTime >= DateTime.CHRONON_OF_HOUR) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_HOUR, 1, dOutInner);
- writeChar('H', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_HOUR, 1, dOutInner);
+ FunctionHelper.writeChar('H', dOutInner);
dayTime %= DateTime.CHRONON_OF_HOUR;
}
// Minute
if (dayTime >= DateTime.CHRONON_OF_MINUTE) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
- writeChar('M', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_MINUTE, 1, dOutInner);
+ FunctionHelper.writeChar('M', dOutInner);
dayTime %= DateTime.CHRONON_OF_MINUTE;
}
// Milliseconds
if (dayTime > 0) {
- writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_SECOND, 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime / DateTime.CHRONON_OF_SECOND, 1, dOutInner);
if (dayTime % DateTime.CHRONON_OF_SECOND != 0) {
- writeChar('.', dOutInner);
- writeNumberWithPadding(dayTime % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
+ FunctionHelper.writeChar('.', dOutInner);
+ FunctionHelper.writeNumberWithPadding(dayTime % DateTime.CHRONON_OF_SECOND, 3, dOutInner);
}
- writeChar('S', dOutInner);
+ FunctionHelper.writeChar('S', dOutInner);
}
sendStringDataOutput(dOut);
@@ -434,9 +413,9 @@ public class CastToStringOperation exten
boolean negative = ((bits >> 31) == 0) ? false : true;
if (negative) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
}
- writeCharSequence("0", dOutInner);
+ FunctionHelper.writeCharSequence("0", dOutInner);
sendStringDataOutput(dOut);
} else {
convertFloatCanonical(floatp, dOut);
@@ -449,11 +428,11 @@ public class CastToStringOperation exten
if (Float.isInfinite(value)) {
if (value == Float.NEGATIVE_INFINITY) {
- writeCharSequence("-", dOutInner);
+ FunctionHelper.writeCharSequence("-", dOutInner);
}
- writeCharSequence("INF", dOutInner);
+ FunctionHelper.writeCharSequence("INF", dOutInner);
} else if (Float.isNaN(value)) {
- writeCharSequence("NaN", dOutInner);
+ FunctionHelper.writeCharSequence("NaN", dOutInner);
} else {
/*
* The double to string algorithm is based on a paper by Robert G Burger and
@@ -468,10 +447,10 @@ public class CastToStringOperation exten
e = e + FLOAT_MANTISSA_OFFSET;
if (negative) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
}
if (value == 0) {
- writeCharSequence("0.0E0", dOutInner);
+ FunctionHelper.writeCharSequence("0.0E0", dOutInner);
} else {
// Initialize variables
double r, s, mPlus, mMinus;
@@ -527,26 +506,26 @@ public class CastToStringOperation exten
if (r * 2 > s) {
d = d + 1;
}
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
} else if (r + mPlus > s) {
d = d + 1;
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
} else if (r < mMinus) {
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
break;
}
- writeChar((char) ('0' + d), dOutInner);
+ FunctionHelper.writeChar((char) ('0' + d), dOutInner);
if (!decimalPlaced) {
decimalPlaced = true;
- writeChar('.', dOutInner);
+ FunctionHelper.writeChar('.', dOutInner);
}
}
- long decimalPlace = getPowerOf10(value, FLOAT_EXPONENT_MAX, FLOAT_EXPONENT_MIN) - 1;
- writeChar('E', dOutInner);
- writeNumberWithPadding(decimalPlace, 1, dOutInner);
+ long decimalPlace = FunctionHelper.getPowerOf10(value, FLOAT_EXPONENT_MAX, FLOAT_EXPONENT_MIN) - 1;
+ FunctionHelper.writeChar('E', dOutInner);
+ FunctionHelper.writeNumberWithPadding(decimalPlace, 1, dOutInner);
}
}
sendStringDataOutput(dOut);
@@ -556,19 +535,19 @@ public class CastToStringOperation exten
public void convertGDay(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
// Default
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Year
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Month
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Day
- writeNumberWithPadding(datep.getDay(), 2, dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getDay(), 2, dOutInner);
// Timezone
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -577,16 +556,16 @@ public class CastToStringOperation exten
public void convertGMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
// Default
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Year
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Month
- writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
// Timezone
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -595,20 +574,20 @@ public class CastToStringOperation exten
public void convertGMonthDay(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
// Default
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Year
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Month
- writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
- writeChar('-', dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Day
- writeNumberWithPadding(datep.getDay(), 2, dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getDay(), 2, dOutInner);
// Timezone
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -617,10 +596,10 @@ public class CastToStringOperation exten
public void convertGYear(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
// Year
- writeNumberWithPadding(datep.getYear(), 4, dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getYear(), 4, dOutInner);
// Timezone
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -629,14 +608,14 @@ public class CastToStringOperation exten
public void convertGYearMonth(XSDatePointable datep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
// Year
- writeNumberWithPadding(datep.getYear(), 4, dOutInner);
- writeChar('-', dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getYear(), 4, dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
// Month
- writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
+ FunctionHelper.writeNumberWithPadding(datep.getMonth(), 2, dOutInner);
// Timezone
- writeTimezone(datep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(datep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -646,8 +625,8 @@ public class CastToStringOperation exten
abvsInner.reset();
for (int index = 0; index < binaryp.getBinaryLength(); ++index) {
int bi = binaryp.getByteArray()[binaryp.getBinaryStart() + index] & 0xff;
- writeChar(hex[(bi >> 4)], dOutInner);
- writeChar(hex[(bi & 0xf)], dOutInner);
+ FunctionHelper.writeChar(hex[(bi >> 4)], dOutInner);
+ FunctionHelper.writeChar(hex[(bi & 0xf)], dOutInner);
}
sendStringDataOutput(dOut);
}
@@ -655,7 +634,7 @@ public class CastToStringOperation exten
@Override
public void convertInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.getLong(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.getLong(), 1, dOutInner);
sendStringDataOutput(dOut);
}
@@ -671,7 +650,7 @@ public class CastToStringOperation exten
if (qnamep.getPrefixUTFLength() > 0) {
dOutInner.write(qnamep.getByteArray(), qnamep.getStartOffset() + qnamep.getUriLength() + 2,
qnamep.getPrefixUTFLength());
- writeChar(':', dOutInner);
+ FunctionHelper.writeChar(':', dOutInner);
}
dOutInner.write(qnamep.getByteArray(),
qnamep.getStartOffset() + qnamep.getUriLength() + qnamep.getPrefixLength() + 2,
@@ -689,8 +668,8 @@ public class CastToStringOperation exten
@Override
public void convertTime(XSTimePointable timep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeTime(timep, dOutInner);
- writeTimezone(timep, dOutInner);
+ FunctionHelper.writeTimeAsString(timep, dOutInner);
+ FunctionHelper.writeTimezoneAsString(timep, dOutInner);
sendStringDataOutput(dOut);
}
@@ -706,24 +685,24 @@ public class CastToStringOperation exten
int yearMonth = intp.getInteger();
if (yearMonth == 0) {
- writeCharSequence("P0M", dOutInner);
+ FunctionHelper.writeCharSequence("P0M", dOutInner);
} else {
if (yearMonth < 0) {
- writeChar('-', dOutInner);
+ FunctionHelper.writeChar('-', dOutInner);
yearMonth *= -1;
}
- writeChar('P', dOutInner);
+ FunctionHelper.writeChar('P', dOutInner);
// Year
if (yearMonth >= 12) {
- writeNumberWithPadding(yearMonth / 12, 1, dOutInner);
- writeChar('Y', dOutInner);
+ FunctionHelper.writeNumberWithPadding(yearMonth / 12, 1, dOutInner);
+ FunctionHelper.writeChar('Y', dOutInner);
}
// Month
if (yearMonth % 12 > 0) {
- writeNumberWithPadding(yearMonth % 12, 1, dOutInner);
- writeChar('M', dOutInner);
+ FunctionHelper.writeNumberWithPadding(yearMonth % 12, 1, dOutInner);
+ FunctionHelper.writeChar('M', dOutInner);
}
}
sendStringDataOutput(dOut);
@@ -734,73 +713,73 @@ public class CastToStringOperation exten
*/
public void convertByte(BytePointable bytep, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(bytep.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(bytep.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertInt(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(intp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(intp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertLong(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertNegativeInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertNonNegativeInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertNonPositiveInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertPositiveInteger(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertShort(ShortPointable shortp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(shortp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(shortp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertUnsignedByte(ShortPointable shortp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(shortp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(shortp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertUnsignedInt(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertUnsignedLong(LongPointable longp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(longp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(longp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
public void convertUnsignedShort(IntegerPointable intp, DataOutput dOut) throws SystemException, IOException {
abvsInner.reset();
- writeNumberWithPadding(intp.longValue(), 1, dOutInner);
+ FunctionHelper.writeNumberWithPadding(intp.longValue(), 1, dOutInner);
sendStringDataOutput(dOut);
}
@@ -850,7 +829,8 @@ public class CastToStringOperation exten
}
@Override
- public void convertNormalizedString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException, IOException {
+ public void convertNormalizedString(UTF8StringPointable stringp, DataOutput dOut) throws SystemException,
+ IOException {
// TODO Add check to verify string consists of limited character set.
convertString(stringp, dOut);
}
@@ -861,24 +841,6 @@ public class CastToStringOperation exten
convertString(stringp, dOut);
}
- /**
- * Returns the number of digits in a long. A few special cases that needed attention.
- */
- private int getNumberOfDigits(long value) {
- if (value == 0) {
- return 0;
- }
- double nDigitsRaw = Math.log10(value);
- int nDigits = (int) nDigitsRaw;
- if (nDigits > 11 && nDigitsRaw == nDigits) {
- // Return exact number of digits and does not need adjustment. (Ex 999999999999999999)
- return nDigits;
- } else {
- // Decimal value returned so we must increment to the next number.
- return nDigits + 1;
- }
- }
-
private void sendStringDataOutput(DataOutput dOut) throws SystemException, IOException {
dOut.write(returnTag);
dOut.write((byte) ((abvsInner.getLength() >>> 8) & 0xFF));
@@ -886,108 +848,4 @@ public class CastToStringOperation exten
dOut.write(abvsInner.getByteArray(), abvsInner.getStartOffset(), abvsInner.getLength());
}
- private void writeChar(char c, DataOutput dOut) {
- try {
- if ((c >= 0x0001) && (c <= 0x007F)) {
- dOut.write((byte) c);
- } else if (c > 0x07FF) {
- dOut.write((byte) (0xE0 | ((c >> 12) & 0x0F)));
- dOut.write((byte) (0x80 | ((c >> 6) & 0x3F)));
- dOut.write((byte) (0x80 | ((c >> 0) & 0x3F)));
- } else {
- dOut.write((byte) (0xC0 | ((c >> 6) & 0x1F)));
- dOut.write((byte) (0x80 | ((c >> 0) & 0x3F)));
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- private void writeCharSequence(CharSequence charSequence, DataOutput dOut) {
- for (int i = 0; i < charSequence.length(); ++i) {
- writeChar(charSequence.charAt(i), dOut);
- }
- }
-
- private void writeDate(IDate date, DataOutput dOut) {
- // Year
- writeNumberWithPadding(date.getYear(), 4, dOut);
- writeChar('-', dOut);
-
- // Month
- writeNumberWithPadding(date.getMonth(), 2, dOut);
- writeChar('-', dOut);
-
- // Day
- writeNumberWithPadding(date.getDay(), 2, dOut);
- }
-
- /**
- * 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) {
- if (value < 0) {
- writeChar('-', dOut);
- value = Math.abs(value);
- }
- int nDigits = getNumberOfDigits(value);
-
- // Add zero padding for set length numbers.
- while (padding > nDigits) {
- writeChar('0', dOut);
- --padding;
- }
-
- // Write the actual number.
- long pow10 = (long) Math.pow(10, nDigits - 1);
- for (int i = nDigits - 1; i >= 0; --i) {
- writeChar((char) ('0' + (value / pow10)), dOut);
- value %= pow10;
- pow10 /= 10;
- }
- }
-
- private void writeTime(ITime time, DataOutput dOut) {
- // Hours
- writeNumberWithPadding(time.getHour(), 2, dOut);
- writeChar(':', dOut);
-
- // Minute
- writeNumberWithPadding(time.getMinute(), 2, dOut);
- writeChar(':', dOut);
-
- // Milliseconds
- writeNumberWithPadding(time.getMilliSecond() / DateTime.CHRONON_OF_SECOND, 2, dOut);
- if (time.getMilliSecond() % DateTime.CHRONON_OF_SECOND != 0) {
- writeChar('.', dOut);
- writeNumberWithPadding(time.getMilliSecond() % DateTime.CHRONON_OF_SECOND, 3, dOut);
- }
- }
-
- private void writeTimezone(ITimezone timezone, DataOutput dOut) {
- long timezoneHour = timezone.getTimezoneHour();
- long timezoneMinute = timezone.getTimezoneMinute();
- if (timezoneHour != DateTime.TIMEZONE_HOUR_NULL && timezoneMinute != DateTime.TIMEZONE_MINUTE_NULL) {
- if (timezoneHour == 0 && timezoneMinute == 0) {
- writeChar('Z', dOut);
- } else {
- if (timezoneHour >= 0 && timezoneMinute >= 0) {
- writeChar('+', dOut);
- } else {
- writeChar('-', dOut);
- timezoneHour = Math.abs(timezoneHour);
- timezoneMinute = Math.abs(timezoneMinute);
- }
- writeNumberWithPadding(timezoneHour, 2, dOut);
- writeChar(':', dOut);
- writeNumberWithPadding(timezoneMinute, 2, dOut);
- }
- }
- }
-
}
\ No newline at end of file
Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java?rev=1390767&r1=1390766&r2=1390767&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java Wed Sep 26 23:03:48 2012
@@ -34,6 +34,8 @@ import org.apache.vxquery.datamodel.acce
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.api.IDate;
+import org.apache.vxquery.datamodel.api.ITime;
import org.apache.vxquery.datamodel.api.ITimezone;
import org.apache.vxquery.datamodel.util.DateTime;
import org.apache.vxquery.datamodel.values.ValueTag;
@@ -680,6 +682,33 @@ public class FunctionHelper {
dOut.writeLong(value);
}
+ /**
+ * Returns the number of digits in a long. A few special cases that needed attention.
+ */
+ public static int getNumberOfDigits(long value) {
+ if (value == 0) {
+ return 0;
+ }
+ double nDigitsRaw = Math.log10(value);
+ int nDigits = (int) nDigitsRaw;
+ if (nDigits > 11 && nDigitsRaw == nDigits) {
+ // Return exact number of digits and does not need adjustment. (Ex 999999999999999999)
+ return nDigits;
+ } else {
+ // Decimal value returned so we must increment to the next number.
+ return nDigits + 1;
+ }
+ }
+
+ public static long getPowerOf10(double value, long max, long min) {
+ value = Math.abs(value);
+ for (long i = min; i < max; i++) {
+ if (Math.pow(10, i) > value)
+ return i;
+ }
+ return max;
+ }
+
public static String getStringFromPointable(UTF8StringPointable stringp, ByteBufferInputStream bbis,
DataInputStream di) throws SystemException {
try {
@@ -744,6 +773,16 @@ public class FunctionHelper {
return false;
}
+ /**
+ * Returns 0 if positive, nonzero if negative.
+ *
+ * @param value
+ * @return
+ */
+ public static boolean isNumberPostive(long value) {
+ return ((value & 0x8000000000000000L) == 0 ? true : false);
+ }
+
public static void printUTF8String(UTF8StringPointable stringp) {
System.err.println(" printUTF8String START length = " + stringp.getUTFLength());
ICharacterIterator charIterator = new UTF8StringCharacterIterator(stringp);
@@ -769,4 +808,108 @@ public class FunctionHelper {
throw new SystemException(ErrorCode.SYSE0001, e);
}
}
+
+ public static void writeChar(char c, DataOutput dOut) {
+ try {
+ if ((c >= 0x0001) && (c <= 0x007F)) {
+ dOut.write((byte) c);
+ } else if (c > 0x07FF) {
+ dOut.write((byte) (0xE0 | ((c >> 12) & 0x0F)));
+ dOut.write((byte) (0x80 | ((c >> 6) & 0x3F)));
+ dOut.write((byte) (0x80 | ((c >> 0) & 0x3F)));
+ } else {
+ dOut.write((byte) (0xC0 | ((c >> 6) & 0x1F)));
+ dOut.write((byte) (0x80 | ((c >> 0) & 0x3F)));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void writeCharSequence(CharSequence charSequence, DataOutput dOut) {
+ for (int i = 0; i < charSequence.length(); ++i) {
+ writeChar(charSequence.charAt(i), dOut);
+ }
+ }
+
+ public static void writeDateAsString(IDate date, DataOutput dOut) {
+ // Year
+ writeNumberWithPadding(date.getYear(), 4, dOut);
+ writeChar('-', dOut);
+
+ // Month
+ writeNumberWithPadding(date.getMonth(), 2, dOut);
+ writeChar('-', dOut);
+
+ // Day
+ writeNumberWithPadding(date.getDay(), 2, dOut);
+ }
+
+ /**
+ * 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
+ */
+ public static void writeNumberWithPadding(long value, int padding, DataOutput dOut) {
+ if (value < 0) {
+ writeChar('-', dOut);
+ value = Math.abs(value);
+ }
+ int nDigits = getNumberOfDigits(value);
+
+ // Add zero padding for set length numbers.
+ while (padding > nDigits) {
+ writeChar('0', dOut);
+ --padding;
+ }
+
+ // Write the actual number.
+ long pow10 = (long) Math.pow(10, nDigits - 1);
+ for (int i = nDigits - 1; i >= 0; --i) {
+ writeChar((char) ('0' + (value / pow10)), dOut);
+ value %= pow10;
+ pow10 /= 10;
+ }
+ }
+
+ public static void writeTimeAsString(ITime time, DataOutput dOut) {
+ // Hours
+ writeNumberWithPadding(time.getHour(), 2, dOut);
+ writeChar(':', dOut);
+
+ // Minute
+ writeNumberWithPadding(time.getMinute(), 2, dOut);
+ writeChar(':', dOut);
+
+ // Milliseconds
+ writeNumberWithPadding(time.getMilliSecond() / DateTime.CHRONON_OF_SECOND, 2, dOut);
+ if (time.getMilliSecond() % DateTime.CHRONON_OF_SECOND != 0) {
+ writeChar('.', dOut);
+ writeNumberWithPadding(time.getMilliSecond() % DateTime.CHRONON_OF_SECOND, 3, dOut);
+ }
+ }
+
+ public static void writeTimezoneAsString(ITimezone timezone, DataOutput dOut) {
+ long timezoneHour = timezone.getTimezoneHour();
+ long timezoneMinute = timezone.getTimezoneMinute();
+ if (timezoneHour != DateTime.TIMEZONE_HOUR_NULL && timezoneMinute != DateTime.TIMEZONE_MINUTE_NULL) {
+ if (timezoneHour == 0 && timezoneMinute == 0) {
+ writeChar('Z', dOut);
+ } else {
+ if (timezoneHour >= 0 && timezoneMinute >= 0) {
+ writeChar('+', dOut);
+ } else {
+ writeChar('-', dOut);
+ timezoneHour = Math.abs(timezoneHour);
+ timezoneMinute = Math.abs(timezoneMinute);
+ }
+ writeNumberWithPadding(timezoneHour, 2, dOut);
+ writeChar(':', dOut);
+ writeNumberWithPadding(timezoneMinute, 2, dOut);
+ }
+ }
+ }
}