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/20 21:28:45 UTC

svn commit: r1388170 - in /incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions: cast/CastToStringOperation.java util/FunctionHelper.java

Author: prestonc
Date: Thu Sep 20 19:28:45 2012
New Revision: 1388170

URL: http://svn.apache.org/viewvc?rev=1388170&view=rev
Log:
Added a function to print the UFT8 String Pointable. Helpful in some testing situations.

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=1388170&r1=1388169&r2=1388170&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 Thu Sep 20 19:28:45 2012
@@ -682,14 +682,6 @@ public class CastToStringOperation exten
 
     @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());
     }

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=1388170&r1=1388169&r2=1388170&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 Thu Sep 20 19:28:45 2012
@@ -35,6 +35,8 @@ import org.apache.vxquery.datamodel.valu
 import org.apache.vxquery.exceptions.ErrorCode;
 import org.apache.vxquery.exceptions.SystemException;
 import org.apache.vxquery.runtime.functions.comparison.AbstractValueComparisonOperation;
+import org.apache.vxquery.runtime.functions.strings.ICharacterIterator;
+import org.apache.vxquery.runtime.functions.strings.UTF8StringCharacterIterator;
 import org.apache.vxquery.types.BuiltinTypeConstants;
 import org.apache.vxquery.types.BuiltinTypeRegistry;
 
@@ -68,409 +70,108 @@ public class FunctionHelper {
         public XSQNamePointable qnamep = (XSQNamePointable) XSQNamePointable.FACTORY.createPointable();
     }
 
-    public static int getBaseTypeForArithmetics(int tid) throws SystemException {
-        if (tid >= BuiltinTypeConstants.BUILTIN_TYPE_COUNT) {
-            throw new SystemException(ErrorCode.XPTY0004);
-        }
-        while (true) {
-            switch (tid) {
-                case ValueTag.XS_STRING_TAG:
+    public static boolean compareTaggedValues(AbstractValueComparisonOperation aOp, TaggedValuePointable tvp1,
+            TaggedValuePointable tvp2, DynamicContext dCtx) throws SystemException {
+        final TypedPointables tp1 = new TypedPointables();
+        final TypedPointables tp2 = new TypedPointables();
+
+        boolean booleanResult = false;
+        int tid1 = getBaseTypeForComparisons(tvp1.getTag());
+        int tid2 = getBaseTypeForComparisons(tvp2.getTag());
+        try {
+            switch (tid1) {
                 case ValueTag.XS_DECIMAL_TAG:
-                case ValueTag.XS_INTEGER_TAG:
-                case ValueTag.XS_FLOAT_TAG:
-                case ValueTag.XS_DOUBLE_TAG:
-                case ValueTag.XS_ANY_URI_TAG:
-                case ValueTag.XS_BOOLEAN_TAG:
-                case ValueTag.XS_DATE_TAG:
-                case ValueTag.XS_DATETIME_TAG:
-                case ValueTag.XS_TIME_TAG:
-                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                case ValueTag.XS_BASE64_BINARY_TAG:
-                case ValueTag.XS_HEX_BINARY_TAG:
-                case ValueTag.XS_QNAME_TAG:
-                case ValueTag.XS_G_DAY_TAG:
-                case ValueTag.XS_G_MONTH_DAY_TAG:
-                case ValueTag.XS_G_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_TAG:
-                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
-                    return tid;
+                    tvp1.getValue(tp1.decp);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
+                            break;
 
-                case ValueTag.XS_LONG_TAG:
-                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_UNSIGNED_INT_TAG:
-                case ValueTag.XS_UNSIGNED_LONG_TAG:
-                case ValueTag.XS_INT_TAG:
-                case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                case ValueTag.XS_SHORT_TAG:
-                case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                case ValueTag.XS_BYTE_TAG:
-                    return ValueTag.XS_INTEGER_TAG;
+                        case ValueTag.XS_INTEGER_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateDecimalInteger(tp1.decp, tp2.longp);
+                            break;
 
-                case ValueTag.XS_ANY_ATOMIC_TAG:
-                    throw new SystemException(ErrorCode.XPTY0004);
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
+                            break;
 
-                default:
-                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
-                    return tid;
-            }
-        }
-    }
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
+                            break;
+                    }
+                    break;
 
-    public static int getBaseTypeForComparisons(int tid) throws SystemException {
-        while (true) {
-            switch (tid) {
-                case ValueTag.XS_ANY_URI_TAG:
-                case ValueTag.XS_BASE64_BINARY_TAG:
-                case ValueTag.XS_BOOLEAN_TAG:
-                case ValueTag.XS_DATE_TAG:
-                case ValueTag.XS_DATETIME_TAG:
-                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                case ValueTag.XS_DECIMAL_TAG:
-                case ValueTag.XS_DOUBLE_TAG:
-                case ValueTag.XS_DURATION_TAG:
-                case ValueTag.XS_FLOAT_TAG:
-                case ValueTag.XS_HEX_BINARY_TAG:
                 case ValueTag.XS_INTEGER_TAG:
-                case ValueTag.XS_G_DAY_TAG:
-                case ValueTag.XS_G_MONTH_DAY_TAG:
-                case ValueTag.XS_G_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_TAG:
-                case ValueTag.XS_QNAME_TAG:
-                case ValueTag.XS_STRING_TAG:
-                case ValueTag.XS_TIME_TAG:
-                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
-                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                    return tid;
+                    tvp1.getValue(tp1.longp);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateIntegerDecimal(tp1.longp, tp2.decp);
+                            break;
 
-                case ValueTag.XS_LONG_TAG:
-                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_UNSIGNED_INT_TAG:
-                case ValueTag.XS_UNSIGNED_LONG_TAG:
-                case ValueTag.XS_INT_TAG:
-                case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                case ValueTag.XS_SHORT_TAG:
-                case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                case ValueTag.XS_BYTE_TAG:
-                    return ValueTag.XS_INTEGER_TAG;
+                        case ValueTag.XS_INTEGER_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateIntegerInteger(tp1.longp, tp2.longp);
+                            break;
 
-                case ValueTag.XS_ANY_ATOMIC_TAG:
-                    throw new SystemException(ErrorCode.XPTY0004);
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateIntegerFloat(tp1.longp, tp2.floatp);
+                            break;
 
-                default:
-                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
-            }
-        }
-    }
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateIntegerDouble(tp1.longp, tp2.doublep);
+                            break;
+                    }
+                    break;
 
-    public static int getBaseTypeForGeneralComparisons(int tid) throws SystemException {
-        while (true) {
-            switch (tid) {
-                case ValueTag.XS_ANY_URI_TAG:
-                case ValueTag.XS_BASE64_BINARY_TAG:
-                case ValueTag.XS_BOOLEAN_TAG:
-                case ValueTag.XS_DATE_TAG:
-                case ValueTag.XS_DATETIME_TAG:
-                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                case ValueTag.XS_DURATION_TAG:
-                case ValueTag.XS_HEX_BINARY_TAG:
-                case ValueTag.XS_G_DAY_TAG:
-                case ValueTag.XS_G_MONTH_DAY_TAG:
-                case ValueTag.XS_G_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_MONTH_TAG:
-                case ValueTag.XS_G_YEAR_TAG:
-                case ValueTag.XS_QNAME_TAG:
-                case ValueTag.XS_STRING_TAG:
-                case ValueTag.XS_TIME_TAG:
-                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
-                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                    return tid;
-                case ValueTag.XS_DECIMAL_TAG:
-                case ValueTag.XS_DOUBLE_TAG:
                 case ValueTag.XS_FLOAT_TAG:
-                case ValueTag.XS_INTEGER_TAG:
-                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_LONG_TAG:
-                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                case ValueTag.XS_UNSIGNED_LONG_TAG:
-                case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                case ValueTag.XS_INT_TAG:
-                case ValueTag.XS_UNSIGNED_INT_TAG:
-                case ValueTag.XS_SHORT_TAG:
-                case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                case ValueTag.XS_BYTE_TAG:
-                case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                    return ValueTag.XS_DOUBLE_TAG;
+                    tvp1.getValue(tp1.floatp);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
+                            break;
 
-                case ValueTag.XS_ANY_ATOMIC_TAG:
-                    throw new SystemException(ErrorCode.XPTY0004);
+                        case ValueTag.XS_INTEGER_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateFloatInteger(tp1.floatp, tp2.longp);
+                            break;
 
-                default:
-                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
-            }
-        }
-    }
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
+                            break;
 
-    public static void getDoublePointable(TaggedValuePointable tvp, DataOutput dOut) throws SystemException,
-            IOException {
-        TypedPointables tp = new TypedPointables();
-        double value;
-        switch (tvp.getTag()) {
-            case ValueTag.XS_DECIMAL_TAG:
-                tvp.getValue(tp.decp);
-                value = tp.decp.doubleValue();
-                break;
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
+                            break;
+                    }
+                    break;
 
-            case ValueTag.XS_DOUBLE_TAG:
-                tvp.getValue(tp.doublep);
-                value = tp.doublep.doubleValue();
-                break;
+                case ValueTag.XS_DOUBLE_TAG:
+                    tvp1.getValue(tp1.doublep);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
+                            break;
 
-            case ValueTag.XS_FLOAT_TAG:
-                tvp.getValue(tp.floatp);
-                value = tp.floatp.doubleValue();
-                break;
+                        case ValueTag.XS_INTEGER_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateDoubleInteger(tp1.doublep, tp2.longp);
+                            break;
 
-            case ValueTag.XS_INTEGER_TAG:
-            case ValueTag.XS_LONG_TAG:
-            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_UNSIGNED_INT_TAG:
-            case ValueTag.XS_UNSIGNED_LONG_TAG:
-                tvp.getValue(tp.longp);
-                value = tp.longp.doubleValue();
-                break;
-
-            case ValueTag.XS_INT_TAG:
-            case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                tvp.getValue(tp.intp);
-                value = tp.intp.doubleValue();
-                break;
-
-            case ValueTag.XS_SHORT_TAG:
-            case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                tvp.getValue(tp.shortp);
-                value = tp.shortp.doubleValue();
-                break;
-
-            case ValueTag.XS_BYTE_TAG:
-                tvp.getValue(tp.bytep);
-                value = tp.bytep.doubleValue();
-                break;
-
-            default:
-                value = 0;
-        }
-        dOut.write(ValueTag.XS_DOUBLE_TAG);
-        dOut.writeDouble(value);
-    }
-
-    public static void getIntegerPointable(TaggedValuePointable tvp, DataOutput dOut) throws SystemException,
-            IOException {
-        TypedPointables tp = new TypedPointables();
-        long value;
-        switch (tvp.getTag()) {
-            case ValueTag.XS_INTEGER_TAG:
-            case ValueTag.XS_LONG_TAG:
-            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_UNSIGNED_INT_TAG:
-            case ValueTag.XS_UNSIGNED_LONG_TAG:
-                tvp.getValue(tp.longp);
-                value = tp.longp.longValue();
-                break;
-
-            case ValueTag.XS_INT_TAG:
-            case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                tvp.getValue(tp.intp);
-                value = tp.intp.longValue();
-                break;
-
-            case ValueTag.XS_SHORT_TAG:
-            case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                tvp.getValue(tp.shortp);
-                value = tp.shortp.longValue();
-                break;
-
-            case ValueTag.XS_BYTE_TAG:
-                tvp.getValue(tp.bytep);
-                value = tp.bytep.longValue();
-                break;
-
-            default:
-                value = 0;
-        }
-        dOut.write(ValueTag.XS_INTEGER_TAG);
-        dOut.writeLong(value);
-    }
-
-    public static long getTimezone(ITimezone timezonep) {
-        return timezonep.getTimezoneHour() * DateTime.CHRONON_OF_HOUR + timezonep.getTimezoneMinute()
-                * DateTime.CHRONON_OF_MINUTE;
-    }
-
-    public static boolean isDerivedFromDouble(int tid) {
-        switch (tid) {
-            case ValueTag.XS_DECIMAL_TAG:
-            case ValueTag.XS_DOUBLE_TAG:
-            case ValueTag.XS_FLOAT_TAG:
-                return true;
-        }
-        return isDerivedFromInteger(tid);
-    }
-
-    public static boolean isDerivedFromInteger(int tid) {
-        switch (tid) {
-            case ValueTag.XS_INTEGER_TAG:
-            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_LONG_TAG:
-            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-            case ValueTag.XS_UNSIGNED_LONG_TAG:
-            case ValueTag.XS_POSITIVE_INTEGER_TAG:
-            case ValueTag.XS_INT_TAG:
-            case ValueTag.XS_UNSIGNED_INT_TAG:
-            case ValueTag.XS_SHORT_TAG:
-            case ValueTag.XS_UNSIGNED_SHORT_TAG:
-            case ValueTag.XS_BYTE_TAG:
-            case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                return true;
-        }
-        return false;
-    }
-
-    public static boolean isDerivedFromString(int tid) {
-        switch (tid) {
-            case ValueTag.XS_STRING_TAG:
-            case ValueTag.XS_NORMALIZED_STRING_TAG:
-            case ValueTag.XS_TOKEN_TAG:
-            case ValueTag.XS_LANGUAGE_TAG:
-            case ValueTag.XS_NMTOKEN_TAG:
-            case ValueTag.XS_NAME_TAG:
-            case ValueTag.XS_NCNAME_TAG:
-            case ValueTag.XS_ID_TAG:
-            case ValueTag.XS_IDREF_TAG:
-            case ValueTag.XS_ENTITY_TAG:
-                return true;
-        }
-        return false;
-    }
-
-    public static boolean compareTaggedValues(AbstractValueComparisonOperation aOp, TaggedValuePointable tvp1,
-            TaggedValuePointable tvp2, DynamicContext dCtx) throws SystemException {
-        final TypedPointables tp1 = new TypedPointables();
-        final TypedPointables tp2 = new TypedPointables();
-
-        boolean booleanResult = false;
-        int tid1 = getBaseTypeForComparisons(tvp1.getTag());
-        int tid2 = getBaseTypeForComparisons(tvp2.getTag());
-        try {
-            switch (tid1) {
-                case ValueTag.XS_DECIMAL_TAG:
-                    tvp1.getValue(tp1.decp);
-                    switch (tid2) {
-                        case ValueTag.XS_DECIMAL_TAG:
-                            tvp2.getValue(tp2.decp);
-                            booleanResult = aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
-                            break;
-
-                        case ValueTag.XS_INTEGER_TAG:
-                            tvp2.getValue(tp2.longp);
-                            booleanResult = aOp.operateDecimalInteger(tp1.decp, tp2.longp);
-                            break;
-
-                        case ValueTag.XS_FLOAT_TAG:
-                            tvp2.getValue(tp2.floatp);
-                            booleanResult = aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
-                            break;
-
-                        case ValueTag.XS_DOUBLE_TAG:
-                            tvp2.getValue(tp2.doublep);
-                            booleanResult = aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
-                            break;
-                    }
-                    break;
-
-                case ValueTag.XS_INTEGER_TAG:
-                    tvp1.getValue(tp1.longp);
-                    switch (tid2) {
-                        case ValueTag.XS_DECIMAL_TAG:
-                            tvp2.getValue(tp2.decp);
-                            booleanResult = aOp.operateIntegerDecimal(tp1.longp, tp2.decp);
-                            break;
-
-                        case ValueTag.XS_INTEGER_TAG:
-                            tvp2.getValue(tp2.longp);
-                            booleanResult = aOp.operateIntegerInteger(tp1.longp, tp2.longp);
-                            break;
-
-                        case ValueTag.XS_FLOAT_TAG:
-                            tvp2.getValue(tp2.floatp);
-                            booleanResult = aOp.operateIntegerFloat(tp1.longp, tp2.floatp);
-                            break;
-
-                        case ValueTag.XS_DOUBLE_TAG:
-                            tvp2.getValue(tp2.doublep);
-                            booleanResult = aOp.operateIntegerDouble(tp1.longp, tp2.doublep);
-                            break;
-                    }
-                    break;
-
-                case ValueTag.XS_FLOAT_TAG:
-                    tvp1.getValue(tp1.floatp);
-                    switch (tid2) {
-                        case ValueTag.XS_DECIMAL_TAG:
-                            tvp2.getValue(tp2.decp);
-                            booleanResult = aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
-                            break;
-
-                        case ValueTag.XS_INTEGER_TAG:
-                            tvp2.getValue(tp2.longp);
-                            booleanResult = aOp.operateFloatInteger(tp1.floatp, tp2.longp);
-                            break;
-
-                        case ValueTag.XS_FLOAT_TAG:
-                            tvp2.getValue(tp2.floatp);
-                            booleanResult = aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
-                            break;
-
-                        case ValueTag.XS_DOUBLE_TAG:
-                            tvp2.getValue(tp2.doublep);
-                            booleanResult = aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
-                            break;
-                    }
-                    break;
-
-                case ValueTag.XS_DOUBLE_TAG:
-                    tvp1.getValue(tp1.doublep);
-                    switch (tid2) {
-                        case ValueTag.XS_DECIMAL_TAG:
-                            tvp2.getValue(tp2.decp);
-                            booleanResult = aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
-                            break;
-
-                        case ValueTag.XS_INTEGER_TAG:
-                            tvp2.getValue(tp2.longp);
-                            booleanResult = aOp.operateDoubleInteger(tp1.doublep, tp2.longp);
-                            break;
-
-                        case ValueTag.XS_FLOAT_TAG:
-                            tvp2.getValue(tp2.floatp);
-                            booleanResult = aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
-                            break;
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
+                            break;
 
                         case ValueTag.XS_DOUBLE_TAG:
                             tvp2.getValue(tp2.doublep);
@@ -720,4 +421,315 @@ public class FunctionHelper {
             throw new SystemException(ErrorCode.SYSE0001, e);
         }
     }
+
+    public static int getBaseTypeForArithmetics(int tid) throws SystemException {
+        if (tid >= BuiltinTypeConstants.BUILTIN_TYPE_COUNT) {
+            throw new SystemException(ErrorCode.XPTY0004);
+        }
+        while (true) {
+            switch (tid) {
+                case ValueTag.XS_STRING_TAG:
+                case ValueTag.XS_DECIMAL_TAG:
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_FLOAT_TAG:
+                case ValueTag.XS_DOUBLE_TAG:
+                case ValueTag.XS_ANY_URI_TAG:
+                case ValueTag.XS_BOOLEAN_TAG:
+                case ValueTag.XS_DATE_TAG:
+                case ValueTag.XS_DATETIME_TAG:
+                case ValueTag.XS_TIME_TAG:
+                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                case ValueTag.XS_BASE64_BINARY_TAG:
+                case ValueTag.XS_HEX_BINARY_TAG:
+                case ValueTag.XS_QNAME_TAG:
+                case ValueTag.XS_G_DAY_TAG:
+                case ValueTag.XS_G_MONTH_DAY_TAG:
+                case ValueTag.XS_G_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_TAG:
+                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+                    return tid;
+
+                case ValueTag.XS_LONG_TAG:
+                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_UNSIGNED_INT_TAG:
+                case ValueTag.XS_UNSIGNED_LONG_TAG:
+                case ValueTag.XS_INT_TAG:
+                case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                case ValueTag.XS_SHORT_TAG:
+                case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                case ValueTag.XS_BYTE_TAG:
+                    return ValueTag.XS_INTEGER_TAG;
+
+                case ValueTag.XS_ANY_ATOMIC_TAG:
+                    throw new SystemException(ErrorCode.XPTY0004);
+
+                default:
+                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
+                    return tid;
+            }
+        }
+    }
+
+    public static int getBaseTypeForComparisons(int tid) throws SystemException {
+        while (true) {
+            switch (tid) {
+                case ValueTag.XS_ANY_URI_TAG:
+                case ValueTag.XS_BASE64_BINARY_TAG:
+                case ValueTag.XS_BOOLEAN_TAG:
+                case ValueTag.XS_DATE_TAG:
+                case ValueTag.XS_DATETIME_TAG:
+                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                case ValueTag.XS_DECIMAL_TAG:
+                case ValueTag.XS_DOUBLE_TAG:
+                case ValueTag.XS_DURATION_TAG:
+                case ValueTag.XS_FLOAT_TAG:
+                case ValueTag.XS_HEX_BINARY_TAG:
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_G_DAY_TAG:
+                case ValueTag.XS_G_MONTH_DAY_TAG:
+                case ValueTag.XS_G_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_TAG:
+                case ValueTag.XS_QNAME_TAG:
+                case ValueTag.XS_STRING_TAG:
+                case ValueTag.XS_TIME_TAG:
+                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                    return tid;
+
+                case ValueTag.XS_LONG_TAG:
+                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_UNSIGNED_INT_TAG:
+                case ValueTag.XS_UNSIGNED_LONG_TAG:
+                case ValueTag.XS_INT_TAG:
+                case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                case ValueTag.XS_SHORT_TAG:
+                case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                case ValueTag.XS_BYTE_TAG:
+                    return ValueTag.XS_INTEGER_TAG;
+
+                case ValueTag.XS_ANY_ATOMIC_TAG:
+                    throw new SystemException(ErrorCode.XPTY0004);
+
+                default:
+                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
+            }
+        }
+    }
+
+    public static int getBaseTypeForGeneralComparisons(int tid) throws SystemException {
+        while (true) {
+            switch (tid) {
+                case ValueTag.XS_ANY_URI_TAG:
+                case ValueTag.XS_BASE64_BINARY_TAG:
+                case ValueTag.XS_BOOLEAN_TAG:
+                case ValueTag.XS_DATE_TAG:
+                case ValueTag.XS_DATETIME_TAG:
+                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                case ValueTag.XS_DURATION_TAG:
+                case ValueTag.XS_HEX_BINARY_TAG:
+                case ValueTag.XS_G_DAY_TAG:
+                case ValueTag.XS_G_MONTH_DAY_TAG:
+                case ValueTag.XS_G_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_TAG:
+                case ValueTag.XS_QNAME_TAG:
+                case ValueTag.XS_STRING_TAG:
+                case ValueTag.XS_TIME_TAG:
+                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                    return tid;
+                case ValueTag.XS_DECIMAL_TAG:
+                case ValueTag.XS_DOUBLE_TAG:
+                case ValueTag.XS_FLOAT_TAG:
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_LONG_TAG:
+                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_UNSIGNED_LONG_TAG:
+                case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_INT_TAG:
+                case ValueTag.XS_UNSIGNED_INT_TAG:
+                case ValueTag.XS_SHORT_TAG:
+                case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                case ValueTag.XS_BYTE_TAG:
+                case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                    return ValueTag.XS_DOUBLE_TAG;
+
+                case ValueTag.XS_ANY_ATOMIC_TAG:
+                    throw new SystemException(ErrorCode.XPTY0004);
+
+                default:
+                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
+            }
+        }
+    }
+
+    public static void getDoublePointable(TaggedValuePointable tvp, DataOutput dOut) throws SystemException,
+            IOException {
+        TypedPointables tp = new TypedPointables();
+        double value;
+        switch (tvp.getTag()) {
+            case ValueTag.XS_DECIMAL_TAG:
+                tvp.getValue(tp.decp);
+                value = tp.decp.doubleValue();
+                break;
+
+            case ValueTag.XS_DOUBLE_TAG:
+                tvp.getValue(tp.doublep);
+                value = tp.doublep.doubleValue();
+                break;
+
+            case ValueTag.XS_FLOAT_TAG:
+                tvp.getValue(tp.floatp);
+                value = tp.floatp.doubleValue();
+                break;
+
+            case ValueTag.XS_INTEGER_TAG:
+            case ValueTag.XS_LONG_TAG:
+            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_UNSIGNED_INT_TAG:
+            case ValueTag.XS_UNSIGNED_LONG_TAG:
+                tvp.getValue(tp.longp);
+                value = tp.longp.doubleValue();
+                break;
+
+            case ValueTag.XS_INT_TAG:
+            case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                tvp.getValue(tp.intp);
+                value = tp.intp.doubleValue();
+                break;
+
+            case ValueTag.XS_SHORT_TAG:
+            case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                tvp.getValue(tp.shortp);
+                value = tp.shortp.doubleValue();
+                break;
+
+            case ValueTag.XS_BYTE_TAG:
+                tvp.getValue(tp.bytep);
+                value = tp.bytep.doubleValue();
+                break;
+
+            default:
+                value = 0;
+        }
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
+    }
+
+    public static void getIntegerPointable(TaggedValuePointable tvp, DataOutput dOut) throws SystemException,
+            IOException {
+        TypedPointables tp = new TypedPointables();
+        long value;
+        switch (tvp.getTag()) {
+            case ValueTag.XS_INTEGER_TAG:
+            case ValueTag.XS_LONG_TAG:
+            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_UNSIGNED_INT_TAG:
+            case ValueTag.XS_UNSIGNED_LONG_TAG:
+                tvp.getValue(tp.longp);
+                value = tp.longp.longValue();
+                break;
+
+            case ValueTag.XS_INT_TAG:
+            case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                tvp.getValue(tp.intp);
+                value = tp.intp.longValue();
+                break;
+
+            case ValueTag.XS_SHORT_TAG:
+            case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                tvp.getValue(tp.shortp);
+                value = tp.shortp.longValue();
+                break;
+
+            case ValueTag.XS_BYTE_TAG:
+                tvp.getValue(tp.bytep);
+                value = tp.bytep.longValue();
+                break;
+
+            default:
+                value = 0;
+        }
+        dOut.write(ValueTag.XS_INTEGER_TAG);
+        dOut.writeLong(value);
+    }
+
+    public static long getTimezone(ITimezone timezonep) {
+        return timezonep.getTimezoneHour() * DateTime.CHRONON_OF_HOUR + timezonep.getTimezoneMinute()
+                * DateTime.CHRONON_OF_MINUTE;
+    }
+
+    public static boolean isDerivedFromDouble(int tid) {
+        switch (tid) {
+            case ValueTag.XS_DECIMAL_TAG:
+            case ValueTag.XS_DOUBLE_TAG:
+            case ValueTag.XS_FLOAT_TAG:
+                return true;
+        }
+        return isDerivedFromInteger(tid);
+    }
+
+    public static boolean isDerivedFromInteger(int tid) {
+        switch (tid) {
+            case ValueTag.XS_INTEGER_TAG:
+            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_LONG_TAG:
+            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_UNSIGNED_LONG_TAG:
+            case ValueTag.XS_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_INT_TAG:
+            case ValueTag.XS_UNSIGNED_INT_TAG:
+            case ValueTag.XS_SHORT_TAG:
+            case ValueTag.XS_UNSIGNED_SHORT_TAG:
+            case ValueTag.XS_BYTE_TAG:
+            case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                return true;
+        }
+        return false;
+    }
+
+    public static boolean isDerivedFromString(int tid) {
+        switch (tid) {
+            case ValueTag.XS_STRING_TAG:
+            case ValueTag.XS_NORMALIZED_STRING_TAG:
+            case ValueTag.XS_TOKEN_TAG:
+            case ValueTag.XS_LANGUAGE_TAG:
+            case ValueTag.XS_NMTOKEN_TAG:
+            case ValueTag.XS_NAME_TAG:
+            case ValueTag.XS_NCNAME_TAG:
+            case ValueTag.XS_ID_TAG:
+            case ValueTag.XS_IDREF_TAG:
+            case ValueTag.XS_ENTITY_TAG:
+                return true;
+        }
+        return false;
+    }
+
+    public static void printUTF8String(UTF8StringPointable stringp) {
+        System.err.println(" printUTF8String START 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(" printUTF8String END");
+    }
 }