Ah, yes. Now I remember the split again. Thanks, Till
> On Apr 1, 2015, at 09:19, Eldon Carman <[email protected]> wrote: > > Yes. Two new pages (one for the user and another for developer) were added > to help a person get started with the community. The page was supposed to > be deleted when the two new pages were added. > >> On Tue, Mar 31, 2015 at 10:36 PM, Till Westmann <[email protected]> wrote: >> >> Hi Preston, >> >> was the removal of the webpage intended? >> >> Cheers, >> Till >> >> >> On 31 Mar 2015, at 13:37, [email protected] wrote: >> >> Repository: vxquery >>> Updated Branches: >>> refs/heads/prestonc/patch 6370087b4 -> 54753294d >>> >>> >>> Update for double conversion using JDK. >>> >>> >>> Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo >>> Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/54753294 >>> Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/54753294 >>> Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/54753294 >>> >>> Branch: refs/heads/prestonc/patch >>> Commit: 54753294d7b75aed2db9c82779a71731951c9d10 >>> Parents: 6370087 >>> Author: Eldon Carman <[email protected]> >>> Authored: Tue Mar 31 13:37:23 2015 -0700 >>> Committer: Eldon Carman <[email protected]> >>> Committed: Tue Mar 31 13:37:23 2015 -0700 >>> >>> ---------------------------------------------------------------------- >>> src/site/apt/join_the_community.apt | 61 ------- >>> .../functions/cast/CastToDoubleOperation.java | 171 +++---------------- >>> 2 files changed, 28 insertions(+), 204 deletions(-) >>> ---------------------------------------------------------------------- >>> >>> >>> http://git-wip-us.apache.org/repos/asf/vxquery/blob/ >>> 54753294/src/site/apt/join_the_community.apt >>> ---------------------------------------------------------------------- >>> diff --git a/src/site/apt/join_the_community.apt b/src/site/apt/join_the_ >>> community.apt >>> deleted file mode 100644 >>> index 75c6b07..0000000 >>> --- a/src/site/apt/join_the_community.apt >>> +++ /dev/null >>> @@ -1,61 +0,0 @@ >>> -~~ Licensed to the Apache Software Foundation (ASF) under one or more >>> -~~ contributor license agreements. See the NOTICE file distributed with >>> -~~ this work for additional information regarding copyright ownership. >>> -~~ The ASF licenses this file to You under the Apache License, Version >>> 2.0 >>> -~~ (the "License"); you may not use this file except in compliance with >>> -~~ the License. You may obtain a copy of the License at >>> -~~ >>> -~~ http://www.apache.org/licenses/LICENSE-2.0 >>> -~~ >>> -~~ Unless required by applicable law or agreed to in writing, software >>> -~~ distributed under the License is distributed on an "AS IS" BASIS, >>> -~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>> implied. >>> -~~ See the License for the specific language governing permissions and >>> -~~ limitations under the License. >>> - >>> -Joining the Apache VXQuery Community >>> - >>> - The following steps are here to help new Apache VXQuery developer get >>> up to speed. >>> - These steps will connect you with the community and give you a place >>> to start. >>> - >>> -* Community Member >>> - >>> - * Sign up for the mailing list: [email protected] >>> - >>> - * Download the latest release and run a few queries. >>> - >>> - * {{{http://vxquery.apache.org/user_installation.html}Installation >>> instructions}}. >>> - >>> - * {{{http://vxquery.apache.org/user_query.html}Execute a query}}. >>> - >>> - * If you want more information on XQuery: >>> - >>> - * Go through the {{{http://www.w3schools.com/xquery/}W3Schools >>> XQuery tutorial}}. >>> - >>> - * Review the {{{http://www.w3.org/TR/xquery/}XQuery specification}}. >>> - >>> -* Developer >>> - >>> - * Go through the community member steps. >>> - >>> - * Setup your eclipse development environment. >>> - >>> - * {{{http://vxquery.apache.org/development_eclipse_setup.html}Setup >>> instructions}}. >>> - >>> - * XQuery has a test suite to verify XQuery specifications. >>> - >>> - * Run the test suite for XQTS. >>> - >>> - * {{{http://vxquery.apache.org/user_running_tests.html}Testing >>> instructions}}. >>> - >>> - * Review the test structure. >>> - >>> - * Code is found in the "VXQuery XTest" module. >>> - >>> - * Review open issues for the project. >>> - >>> - * {{{http://vxquery.apache.org/issue-tracking.html}Issues list}}. >>> - >>> - >>> - >>> - >>> >>> http://git-wip-us.apache.org/repos/asf/vxquery/blob/ >>> 54753294/vxquery-core/src/main/java/org/apache/vxquery/ >>> runtime/functions/cast/CastToDoubleOperation.java >>> ---------------------------------------------------------------------- >>> diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/ >>> functions/cast/CastToDoubleOperation.java b/vxquery-core/src/main/java/ >>> org/apache/vxquery/runtime/functions/cast/CastToDoubleOperation.java >>> index 499c1d3..13bb1f0 100644 >>> --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/ >>> functions/cast/CastToDoubleOperation.java >>> +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/ >>> functions/cast/CastToDoubleOperation.java >>> @@ -37,13 +37,6 @@ import edu.uci.ics.hyracks.data.std. >>> primitive.ShortPointable; >>> import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable; >>> >>> public class CastToDoubleOperation extends AbstractCastToOperation { >>> - /* >>> - * All the positive powers of 10 that can be represented exactly in >>> float. >>> - */ >>> - private static final double powersOf10[] = { 1.0e0, 1.0e1, 1.0e2, >>> 1.0e3, 1.0e4, 1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9, >>> - 1.0e10, 1.0e11, 1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, >>> 1.0e17, 1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22 }; >>> - private static final double powersOf2[] = { 1.0e16d, 1.0e32f, >>> 1.0e64, 1.0e128, 1.0e256 }; >>> - >>> @Override >>> public void convertBoolean(BooleanPointable boolp, DataOutput dOut) >>> throws SystemException, IOException { >>> double value = (boolp.getBoolean() ? 1 : 0); >>> @@ -73,30 +66,24 @@ public class CastToDoubleOperation extends >>> AbstractCastToOperation { >>> >>> @Override >>> public void convertInteger(LongPointable longp, DataOutput dOut) throws >>> SystemException, IOException { >>> - double value = longp.doubleValue(); >>> - dOut.write(ValueTag.XS_DOUBLE_TAG); >>> - dOut.writeDouble(value); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> @Override >>> public void convertString(UTF8StringPointable stringp, DataOutput >>> dOut) throws SystemException, IOException { >>> ICharacterIterator charIterator = new UTF8StringCharacterIterator( >>> stringp); >>> charIterator.reset(); >>> - short decimalPlace = 0; >>> - long value = 0; >>> double valueDouble; >>> - boolean pastDecimal = false, negativeValue = false; >>> + boolean negativeValue = false; >>> int c = ICharacterIterator.EOS_CHAR; >>> int c2 = ICharacterIterator.EOS_CHAR; >>> int c3 = ICharacterIterator.EOS_CHAR; >>> - long limit = -Long.MAX_VALUE; >>> >>> // Check sign. >>> c = charIterator.next(); >>> if (c == Character.valueOf('-')) { >>> negativeValue = true; >>> c = charIterator.next(); >>> - limit = Long.MIN_VALUE; >>> } >>> // Check the special cases. >>> if (c == Character.valueOf('I') || c == Character.valueOf('N')) { >>> @@ -105,128 +92,26 @@ public class CastToDoubleOperation extends >>> AbstractCastToOperation { >>> if (charIterator.next() != ICharacterIterator.EOS_CHAR) { >>> throw new SystemException(ErrorCode.FORG0001); >>> } else if (c == Character.valueOf('I') && c2 == >>> Character.valueOf('N') && c3 == Character.valueOf('F')) { >>> - valueDouble = Double.NEGATIVE_INFINITY; >>> + valueDouble = Double.POSITIVE_INFINITY; >>> } else if (c == Character.valueOf('N') && c2 == >>> Character.valueOf('a') && c3 == Character.valueOf('N')) { >>> valueDouble = Double.NaN; >>> } else { >>> throw new SystemException(ErrorCode.FORG0001); >>> } >>> + dOut.write(ValueTag.XS_DOUBLE_TAG); >>> + dOut.writeDouble((negativeValue ? -valueDouble : >>> valueDouble)); >>> } else { >>> - // Read in the number. >>> - do { >>> - if (Character.isDigit(c)) { >>> - if (value < limit / 10 + >>> Character.getNumericValue(c)) { >>> - throw new SystemException(ErrorCode.FOCA0006); >>> - } >>> - value = value * 10 - Character.getNumericValue(c); >>> - if (pastDecimal) { >>> - decimalPlace--; >>> - } >>> - } else if (c == Character.valueOf('.') && pastDecimal == >>> false) { >>> - pastDecimal = true; >>> - } else if (c == Character.valueOf('E') || c == >>> Character.valueOf('e')) { >>> - break; >>> - } else { >>> - throw new SystemException(ErrorCode.FORG0001); >>> - } >>> - } while ((c = charIterator.next()) != >>> ICharacterIterator.EOS_CHAR); >>> - >>> - // Parse the exponent. >>> - if (c == Character.valueOf('E') || c == >>> Character.valueOf('e')) { >>> - int moveOffset = 0; >>> - boolean negativeOffset = false; >>> - // Check for the negative sign. >>> - c = charIterator.next(); >>> - if (c == Character.valueOf('-')) { >>> - negativeOffset = true; >>> - c = charIterator.next(); >>> - } >>> - // Process the numeric value. >>> - do { >>> - if (Character.isDigit(c)) { >>> - moveOffset = moveOffset * 10 + >>> Character.getNumericValue(c); >>> - } else { >>> - throw new SystemException(ErrorCode.FORG0001); >>> - } >>> - } while ((c = charIterator.next()) != >>> ICharacterIterator.EOS_CHAR); >>> - if (moveOffset > 324 || moveOffset < -324) { >>> - throw new SystemException(ErrorCode.FOCA0006); >>> - } >>> - decimalPlace += (negativeOffset ? -moveOffset : >>> moveOffset); >>> - } >>> - >>> - /* >>> - * The following conditions to create the floating point >>> value is using known valid float values. >>> - * In addition, each one only needs one or two operations to >>> get the float value, further minimizing >>> - * possible errors. (Not perfect, but pretty good.) >>> - */ >>> - valueDouble = (double) value; >>> - if (decimalPlace == 0 || valueDouble == 0.0f) { >>> - // No modification required to float value. >>> - } else if (decimalPlace >= 0) { >>> - if (decimalPlace <= 16) { >>> - valueDouble *= powersOf10[decimalPlace]; >>> - } else { >>> - // Multiply the value based on the exponent binary. >>> - if ((decimalPlace & 15) != 0) { >>> - valueDouble *= powersOf10[decimalPlace & 15]; >>> - } >>> - if ((decimalPlace >>= 4) != 0) { >>> - int j; >>> - for (j = 0; decimalPlace > 1; j++, decimalPlace >>>>> = 1) { >>> - if ((decimalPlace & 1) != 0) >>> - valueDouble *= powersOf2[j]; >>> - } >>> - // Handle the last cast for infinity and max >>> value. >>> - double t = valueDouble * powersOf2[j]; >>> - if (Double.isInfinite(t)) { >>> - // Overflow >>> - t = valueDouble / 2.0; >>> - t *= powersOf2[j]; >>> - if (Double.isInfinite(t)) { >>> - valueDouble = Double.POSITIVE_INFINITY; >>> - } >>> - t = -Double.MAX_VALUE; >>> - } >>> - valueDouble = t; >>> - } >>> - } >>> - } else { >>> - if (decimalPlace >= -16) { >>> - valueDouble /= powersOf10[-decimalPlace]; >>> - } else { >>> - if ((decimalPlace & 15) != 0) { >>> - valueDouble /= powersOf10[decimalPlace & 15]; >>> - } >>> - if ((decimalPlace >>= 4) != 0) { >>> - int j; >>> - for (j = 0; decimalPlace > 1; j++, decimalPlace >>>>> = 1) { >>> - if ((decimalPlace & 1) != 0) >>> - valueDouble /= powersOf2[j]; >>> - } >>> - // Handle the last cast for zero and min value. >>> - double t = valueDouble / powersOf2[j]; >>> - if (t == 0.0) { >>> - // Underflow. >>> - t = valueDouble * 2.0; >>> - t /= powersOf2[j]; >>> - if (t == 0.0) { >>> - valueDouble = 0.0; >>> - } >>> - t = Double.MIN_VALUE; >>> - } >>> - valueDouble = t; >>> - } >>> - } >>> + // We create an object to keep the conversion algorithm >>> simple and improve precision. >>> + // While a better solution may be available this will hold >>> us over until then. >>> + StringBuilder sb = new StringBuilder(); >>> + stringp.toString(sb); >>> + try { >>> + valueDouble = Double.parseDouble(sb.toString()); >>> + } catch (NumberFormatException e) { >>> + throw new SystemException(ErrorCode.FORG0001); >>> } >>> - >>> - } >>> - >>> - dOut.write(ValueTag.XS_DOUBLE_TAG); >>> - if (valueDouble == 0.0) { >>> - dOut.writeDouble((negativeValue ? -0.0 : 0.0)); >>> - } else { >>> - dOut.writeDouble((negativeValue ? valueDouble : >>> -valueDouble)); >>> + dOut.write(ValueTag.XS_DOUBLE_TAG); >>> + dOut.writeDouble(valueDouble); >>> } >>> } >>> >>> @@ -239,54 +124,54 @@ public class CastToDoubleOperation extends >>> AbstractCastToOperation { >>> * Derived Datatypes >>> */ >>> public void convertByte(BytePointable bytep, DataOutput dOut) throws >>> SystemException, IOException { >>> - writeDoubleValue(bytep, dOut); >>> + writeIntegerAsDouble(bytep, dOut); >>> } >>> >>> public void convertInt(IntegerPointable intp, DataOutput dOut) throws >>> SystemException, IOException { >>> - writeDoubleValue(intp, dOut); >>> + writeIntegerAsDouble(intp, dOut); >>> } >>> >>> public void convertLong(LongPointable longp, DataOutput dOut) throws >>> SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertNegativeInteger(LongPointable longp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertNonNegativeInteger(LongPointable longp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertNonPositiveInteger(LongPointable longp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertPositiveInteger(LongPointable longp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertShort(ShortPointable shortp, DataOutput dOut) throws >>> SystemException, IOException { >>> - writeDoubleValue(shortp, dOut); >>> + writeIntegerAsDouble(shortp, dOut); >>> } >>> >>> public void convertUnsignedByte(ShortPointable shortp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(shortp, dOut); >>> + writeIntegerAsDouble(shortp, dOut); >>> } >>> >>> public void convertUnsignedInt(LongPointable longp, DataOutput dOut) >>> throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertUnsignedLong(LongPointable longp, DataOutput dOut) >>> throws SystemException, IOException { >>> - writeDoubleValue(longp, dOut); >>> + writeIntegerAsDouble(longp, dOut); >>> } >>> >>> public void convertUnsignedShort(IntegerPointable intp, DataOutput >>> dOut) throws SystemException, IOException { >>> - writeDoubleValue(intp, dOut); >>> + writeIntegerAsDouble(intp, dOut); >>> } >>> >>> - private void writeDoubleValue(INumeric numericp, DataOutput dOut) >>> throws SystemException, IOException { >>> + private void writeIntegerAsDouble(INumeric numericp, DataOutput >>> dOut) throws SystemException, IOException { >>> dOut.write(ValueTag.XS_DOUBLE_TAG); >>> dOut.writeDouble(numericp.doubleValue()); >>> } >>
