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 02:57:00 UTC
svn commit: r1390796 - in
/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions:
comparison/ comparison/general/ util/
Author: prestonc
Date: Thu Sep 27 00:56:59 2012
New Revision: 1390796
URL: http://svn.apache.org/viewvc?rev=1390796&view=rev
Log:
A few tweaks to comparisons to allow for correct errors when bad pairs of types are passes. Also updated String and AnyURI comparisons to pass.
Modified:
incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java
incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.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/comparison/AbstractValueComparisonScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java?rev=1390796&r1=1390795&r2=1390796&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java Thu Sep 27 00:56:59 2012
@@ -19,8 +19,10 @@ package org.apache.vxquery.runtime.funct
import java.io.DataOutput;
import org.apache.vxquery.context.DynamicContext;
+import org.apache.vxquery.datamodel.accessors.SequencePointable;
import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.datamodel.values.XDMConstants;
import org.apache.vxquery.exceptions.ErrorCode;
import org.apache.vxquery.exceptions.SystemException;
import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
@@ -50,7 +52,8 @@ public abstract class AbstractValueCompa
final DataOutput dOut = abvs.getDataOutput();
final AbstractValueComparisonOperation aOp = createValueComparisonOperation();
final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
-
+ final SequencePointable seqp = (SequencePointable) SequencePointable.FACTORY.createPointable();
+
final ArrayBackedValueStorage abvsInteger1 = new ArrayBackedValueStorage();
final DataOutput dOutInteger1 = abvsInteger1.getDataOutput();
final ArrayBackedValueStorage abvsInteger2 = new ArrayBackedValueStorage();
@@ -61,8 +64,25 @@ public abstract class AbstractValueCompa
protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
TaggedValuePointable tvp1 = args[0];
TaggedValuePointable tvp2 = args[1];
+
+ if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) {
+ tvp1.getValue(seqp);
+ if (seqp.getEntryCount() == 0) {
+ XDMConstants.setEmptySequence(result);
+ return;
+ }
+ throw new SystemException(ErrorCode.XPTY0004);
+ }
+ if (tvp2.getTag() == ValueTag.SEQUENCE_TAG) {
+ tvp2.getValue(seqp);
+ if (seqp.getEntryCount() == 0) {
+ XDMConstants.setEmptySequence(result);
+ return;
+ }
+ throw new SystemException(ErrorCode.XPTY0004);
+ }
+
boolean booleanResult = transformThenCompareTaggedValues(aOp, tvp1, tvp2, dCtx);
-
try {
abvs.reset();
dOut.write(ValueTag.XS_BOOLEAN_TAG);
@@ -79,7 +99,11 @@ public abstract class AbstractValueCompa
TaggedValuePointable tvp2new = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
try {
- if (FunctionHelper.isDerivedFromInteger(tvp1.getTag())) {
+ if (tvp1.getTag() == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
+ // Only need to change tag since the storage is the same for untyped atomic and string.
+ tvp1.getByteArray()[0] = ValueTag.XS_STRING_TAG;
+ tvp1new = tvp1;
+ } else if (FunctionHelper.isDerivedFromInteger(tvp1.getTag())) {
abvsInteger1.reset();
FunctionHelper.getIntegerPointable(tvp1, dOutInteger1);
tvp1new.set(abvsInteger1.getByteArray(), abvsInteger1.getStartOffset(),
@@ -87,7 +111,11 @@ public abstract class AbstractValueCompa
} else {
tvp1new = tvp1;
}
- if (FunctionHelper.isDerivedFromInteger(tvp2.getTag())) {
+ if (tvp2.getTag() == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
+ // Only need to change tag since the storage is the same for untyped atomic and string.
+ tvp2.getByteArray()[0] = ValueTag.XS_STRING_TAG;
+ tvp2new = tvp2;
+ } else if (FunctionHelper.isDerivedFromInteger(tvp2.getTag())) {
abvsInteger2.reset();
FunctionHelper.getIntegerPointable(tvp2, dOutInteger2);
tvp2new.set(abvsInteger2.getByteArray(), abvsInteger2.getStartOffset(),
Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java?rev=1390796&r1=1390795&r2=1390796&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java Thu Sep 27 00:56:59 2012
@@ -195,8 +195,8 @@ public abstract class AbstractGeneralCom
// Set up value comparison tagged value pointables.
if (tid1 == ValueTag.XS_UNTYPED_ATOMIC_TAG && tid2 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
// Only need to change tag since the storage is the same for untyped atomic and string.
- tid1 = ValueTag.XS_STRING_TAG;
- tid2 = ValueTag.XS_STRING_TAG;
+ tvp1.getByteArray()[0] = ValueTag.XS_STRING_TAG;
+ tvp2.getByteArray()[0] = ValueTag.XS_STRING_TAG;
} else if (tid1 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
tid1 = tid2;
getCastToOperator(tid2);
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=1390796&r1=1390795&r2=1390796&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 27 00:56:59 2012
@@ -86,9 +86,9 @@ public class FunctionHelper {
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:
@@ -96,23 +96,19 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DECIMAL_TAG:
tvp2.getValue(tp2.decp);
- booleanResult = aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
- break;
+ return aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
case ValueTag.XS_INTEGER_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateDecimalInteger(tp1.decp, tp2.longp);
- break;
+ return aOp.operateDecimalInteger(tp1.decp, tp2.longp);
case ValueTag.XS_FLOAT_TAG:
tvp2.getValue(tp2.floatp);
- booleanResult = aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
- break;
+ return aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
case ValueTag.XS_DOUBLE_TAG:
tvp2.getValue(tp2.doublep);
- booleanResult = aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
- break;
+ return aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
}
break;
@@ -121,23 +117,19 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DECIMAL_TAG:
tvp2.getValue(tp2.decp);
- booleanResult = aOp.operateIntegerDecimal(tp1.longp, tp2.decp);
- break;
+ return aOp.operateIntegerDecimal(tp1.longp, tp2.decp);
case ValueTag.XS_INTEGER_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateIntegerInteger(tp1.longp, tp2.longp);
- break;
+ return aOp.operateIntegerInteger(tp1.longp, tp2.longp);
case ValueTag.XS_FLOAT_TAG:
tvp2.getValue(tp2.floatp);
- booleanResult = aOp.operateIntegerFloat(tp1.longp, tp2.floatp);
- break;
+ return aOp.operateIntegerFloat(tp1.longp, tp2.floatp);
case ValueTag.XS_DOUBLE_TAG:
tvp2.getValue(tp2.doublep);
- booleanResult = aOp.operateIntegerDouble(tp1.longp, tp2.doublep);
- break;
+ return aOp.operateIntegerDouble(tp1.longp, tp2.doublep);
}
break;
@@ -146,23 +138,19 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DECIMAL_TAG:
tvp2.getValue(tp2.decp);
- booleanResult = aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
- break;
+ return aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
case ValueTag.XS_INTEGER_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateFloatInteger(tp1.floatp, tp2.longp);
- break;
+ return aOp.operateFloatInteger(tp1.floatp, tp2.longp);
case ValueTag.XS_FLOAT_TAG:
tvp2.getValue(tp2.floatp);
- booleanResult = aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
- break;
+ return aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
case ValueTag.XS_DOUBLE_TAG:
tvp2.getValue(tp2.doublep);
- booleanResult = aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
- break;
+ return aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
}
break;
@@ -171,23 +159,19 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DECIMAL_TAG:
tvp2.getValue(tp2.decp);
- booleanResult = aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
- break;
+ return aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
case ValueTag.XS_INTEGER_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateDoubleInteger(tp1.doublep, tp2.longp);
- break;
+ return aOp.operateDoubleInteger(tp1.doublep, tp2.longp);
case ValueTag.XS_FLOAT_TAG:
tvp2.getValue(tp2.floatp);
- booleanResult = aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
- break;
+ return aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
case ValueTag.XS_DOUBLE_TAG:
tvp2.getValue(tp2.doublep);
- booleanResult = aOp.operateDoubleDouble(tp1.doublep, tp2.doublep);
- break;
+ return aOp.operateDoubleDouble(tp1.doublep, tp2.doublep);
}
break;
@@ -196,8 +180,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_BOOLEAN_TAG:
tvp2.getValue(tp2.boolp);
- booleanResult = aOp.operateBooleanBoolean(tp1.boolp, tp2.boolp);
- break;
+ return aOp.operateBooleanBoolean(tp1.boolp, tp2.boolp);
}
break;
@@ -225,9 +208,9 @@ public class FunctionHelper {
case ValueTag.XS_IDREF_TAG:
case ValueTag.XS_ENTITY_TAG:
case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+ case ValueTag.XS_ANY_URI_TAG:
tvp2.getValue(tp2.utf8sp);
- booleanResult = aOp.operateStringString(tp1.utf8sp, tp2.utf8sp);
- break;
+ return aOp.operateStringString(tp1.utf8sp, tp2.utf8sp);
}
break;
@@ -236,11 +219,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DATE_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateDateDate(tp1.datep, tp2.datep, dCtx);
- break;
- default:
- // Cross comparisons between DateTime, Date and Time are not supported.
- throw new SystemException(ErrorCode.XPTY0004);
+ return aOp.operateDateDate(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -249,11 +228,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DATETIME_TAG:
tvp2.getValue(tp2.datetimep);
- booleanResult = aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx);
- break;
- default:
- // Cross comparisons between DateTime, Date and Time are not supported.
- throw new SystemException(ErrorCode.XPTY0004);
+ return aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx);
}
break;
@@ -262,11 +237,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_TIME_TAG:
tvp2.getValue(tp2.timep);
- booleanResult = aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx);
- break;
- default:
- // Cross comparisons between DateTime, Date and Time are not supported.
- throw new SystemException(ErrorCode.XPTY0004);
+ return aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx);
}
break;
@@ -275,16 +246,15 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DAY_TIME_DURATION_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateDurationDTDuration(tp1.durationp, tp2.longp);
- break;
+ return aOp.operateDurationDTDuration(tp1.durationp, tp2.longp);
+
case ValueTag.XS_DURATION_TAG:
tvp2.getValue(tp2.durationp);
- booleanResult = aOp.operateDurationDuration(tp1.durationp, tp2.durationp);
- break;
+ return aOp.operateDurationDuration(tp1.durationp, tp2.durationp);
+
case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
tvp2.getValue(tp2.intp);
- booleanResult = aOp.operateDurationYMDuration(tp1.durationp, tp2.intp);
- break;
+ return aOp.operateDurationYMDuration(tp1.durationp, tp2.intp);
}
break;
@@ -293,16 +263,15 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DAY_TIME_DURATION_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateDTDurationDTDuration(tp1.longp, tp2.longp);
- break;
+ return aOp.operateDTDurationDTDuration(tp1.longp, tp2.longp);
+
case ValueTag.XS_DURATION_TAG:
tvp2.getValue(tp2.durationp);
- booleanResult = aOp.operateDTDurationDuration(tp1.longp, tp2.durationp);
- break;
+ return aOp.operateDTDurationDuration(tp1.longp, tp2.durationp);
+
case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
tvp2.getValue(tp2.intp);
- booleanResult = aOp.operateDTDurationYMDuration(tp1.longp, tp2.intp);
- break;
+ return aOp.operateDTDurationYMDuration(tp1.longp, tp2.intp);
}
break;
@@ -311,16 +280,15 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_DAY_TIME_DURATION_TAG:
tvp2.getValue(tp2.longp);
- booleanResult = aOp.operateYMDurationDTDuration(tp1.intp, tp2.longp);
- break;
+ return aOp.operateYMDurationDTDuration(tp1.intp, tp2.longp);
+
case ValueTag.XS_DURATION_TAG:
tvp2.getValue(tp2.durationp);
- booleanResult = aOp.operateYMDurationDuration(tp1.intp, tp2.durationp);
- break;
+ return aOp.operateYMDurationDuration(tp1.intp, tp2.durationp);
+
case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
tvp2.getValue(tp2.intp);
- booleanResult = aOp.operateYMDurationYMDuration(tp1.intp, tp2.intp);
- break;
+ return aOp.operateYMDurationYMDuration(tp1.intp, tp2.intp);
}
break;
@@ -329,8 +297,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_G_DAY_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateGDayGDay(tp1.datep, tp2.datep, dCtx);
- break;
+ return aOp.operateGDayGDay(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -339,8 +306,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_G_MONTH_DAY_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateGMonthDayGMonthDay(tp1.datep, tp2.datep, dCtx);
- break;
+ return aOp.operateGMonthDayGMonthDay(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -349,8 +315,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_G_MONTH_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateGMonthGMonth(tp1.datep, tp2.datep, dCtx);
- break;
+ return aOp.operateGMonthGMonth(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -359,8 +324,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_G_YEAR_MONTH_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateGYearMonthGYearMonth(tp1.datep, tp2.datep, dCtx);
- break;
+ return aOp.operateGYearMonthGYearMonth(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -369,8 +333,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_G_YEAR_TAG:
tvp2.getValue(tp2.datep);
- booleanResult = aOp.operateGYearGYear(tp1.datep, tp2.datep, dCtx);
- break;
+ return aOp.operateGYearGYear(tp1.datep, tp2.datep, dCtx);
}
break;
@@ -379,8 +342,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_HEX_BINARY_TAG:
tvp2.getValue(tp2.binaryp);
- booleanResult = aOp.operateHexBinaryHexBinary(tp1.binaryp, tp2.binaryp);
- break;
+ return aOp.operateHexBinaryHexBinary(tp1.binaryp, tp2.binaryp);
}
break;
@@ -389,8 +351,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_BASE64_BINARY_TAG:
tvp2.getValue(tp2.binaryp);
- booleanResult = aOp.operateBase64BinaryBase64Binary(tp1.binaryp, tp2.binaryp);
- break;
+ return aOp.operateBase64BinaryBase64Binary(tp1.binaryp, tp2.binaryp);
}
break;
@@ -399,8 +360,21 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_ANY_URI_TAG:
tvp2.getValue(tp2.utf8sp);
- booleanResult = aOp.operateAnyURIAnyURI(tp1.utf8sp, tp2.utf8sp);
- break;
+ return aOp.operateAnyURIAnyURI(tp1.utf8sp, tp2.utf8sp);
+
+ 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:
+ case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+ tvp2.getValue(tp2.utf8sp);
+ return aOp.operateStringString(tp1.utf8sp, tp2.utf8sp);
}
break;
@@ -409,8 +383,7 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_QNAME_TAG:
tvp2.getValue(tp2.qnamep);
- booleanResult = aOp.operateQNameQName(tp1.qnamep, tp2.qnamep);
- break;
+ return aOp.operateQNameQName(tp1.qnamep, tp2.qnamep);
}
break;
@@ -419,18 +392,16 @@ public class FunctionHelper {
switch (tid2) {
case ValueTag.XS_NOTATION_TAG:
tvp2.getValue(tp2.utf8sp);
- booleanResult = aOp.operateNotationNotation(tp1.utf8sp, tp2.utf8sp);
- break;
+ return aOp.operateNotationNotation(tp1.utf8sp, tp2.utf8sp);
}
break;
}
- return booleanResult;
-
} catch (SystemException se) {
throw se;
} catch (Exception e) {
throw new SystemException(ErrorCode.SYSE0001, e);
}
+ throw new SystemException(ErrorCode.XPTY0004);
}
public static int getBaseTypeForArithmetics(int tid) throws SystemException {
@@ -528,6 +499,7 @@ public class FunctionHelper {
return ValueTag.XS_INTEGER_TAG;
case ValueTag.XS_ANY_ATOMIC_TAG:
+ case ValueTag.SEQUENCE_TAG:
throw new SystemException(ErrorCode.XPTY0004);
default: