zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #04030
[Merge] lp:~zorba-coders/zorba/markos-scratch into lp:zorba
Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch into lp:zorba.
Requested reviews:
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/89863
More types-related optimizations for the comparison operators
--
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/89863
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/runtime/booleans/BooleanImpl.cpp'
--- src/runtime/booleans/BooleanImpl.cpp 2012-01-11 16:30:06 +0000
+++ src/runtime/booleans/BooleanImpl.cpp 2012-01-24 11:27:35 +0000
@@ -821,22 +821,22 @@
********************************************************************************/
bool CompareIterator::equal(
const QueryLoc& loc,
- const store::Item_t& aItem0,
- const store::Item_t& aItem1,
+ const store::Item_t& item0,
+ const store::Item_t& item1,
const TypeManager* tm,
long timezone,
- XQPCollator* aCollation)
+ XQPCollator* collation)
{
- xqtref_t type0 = tm->create_value_type(aItem0.getp());
- xqtref_t type1 = tm->create_value_type(aItem1.getp());
+ store::SchemaTypeCode type0 = item0->getTypeCode();
+ store::SchemaTypeCode type1 = item1->getTypeCode();
- if (TypeOps::is_subtype(tm, *type0, *type1))
+ if (TypeOps::is_subtype(type0, type1))
{
- return aItem1->equals(aItem0, timezone, aCollation);
+ return item1->equals(item0, timezone, collation);
}
- else if (TypeOps::is_subtype(tm, *type1, *type0))
+ else if (TypeOps::is_subtype(type1, type0))
{
- return aItem0->equals(aItem1, timezone, aCollation);
+ return item0->equals(item1, timezone, collation);
}
else
{
@@ -847,23 +847,26 @@
// xs::duration (i.e. one is xs:yearMonthDuration and the other is
// xs:dayTimeDuration).
// The same case happens when there are two types derived from xs:NOTATION.
- if (TypeOps::is_subtype(tm, *type0, *GENV_TYPESYSTEM.INTEGER_TYPE_ONE) &&
- TypeOps::is_subtype(tm, *type1, *GENV_TYPESYSTEM.INTEGER_TYPE_ONE))
- {
- return (aItem0->getIntegerValue() == aItem1->getIntegerValue());
- }
- else if (TypeOps::is_subtype(tm, *type0, *GENV_TYPESYSTEM.DURATION_TYPE_ONE) &&
- TypeOps::is_subtype(tm, *type1, *GENV_TYPESYSTEM.DURATION_TYPE_ONE))
- {
- return (aItem0->getDurationValue() == aItem1->getDurationValue());
- }
- else if (TypeOps::is_subtype(tm, *type0, *GENV_TYPESYSTEM.NOTATION_TYPE_ONE) &&
- TypeOps::is_subtype(tm, *type1, *GENV_TYPESYSTEM.NOTATION_TYPE_ONE))
- {
- return aItem0->equals(aItem1);
+ if (TypeOps::is_subtype(type0, store::XS_INTEGER) &&
+ TypeOps::is_subtype(type1, store::XS_INTEGER))
+ {
+ return (item0->getIntegerValue() == item1->getIntegerValue());
+ }
+ else if (TypeOps::is_subtype(type0, store::XS_DURATION) &&
+ TypeOps::is_subtype(type1, store::XS_DURATION))
+ {
+ return (item0->getDurationValue() == item1->getDurationValue());
+ }
+ else if (TypeOps::is_subtype(type0, store::XS_NOTATION) &&
+ TypeOps::is_subtype(type1, store::XS_NOTATION))
+ {
+ return item0->equals(item1);
}
else
{
+ xqtref_t type0 = tm->create_value_type(item0.getp());
+ xqtref_t type1 = tm->create_value_type(item1.getp());
+
RAISE_ERROR(err::XPTY0004, loc,
ERROR_PARAMS(ZED(BadType_23o), *type0, ZED(NoCompareWithType_4), *type1));
}
@@ -890,51 +893,56 @@
********************************************************************************/
long CompareIterator::compare(
const QueryLoc& loc,
- const store::Item_t& aItem0,
- const store::Item_t& aItem1,
+ const store::Item_t& item0,
+ const store::Item_t& item1,
const TypeManager* tm,
long timezone,
- XQPCollator* aCollation)
+ XQPCollator* collation)
{
- xqtref_t type0 = tm->create_value_type(aItem0.getp());
- xqtref_t type1 = tm->create_value_type(aItem1.getp());
+ store::SchemaTypeCode type0 = item0->getTypeCode();
+ store::SchemaTypeCode type1 = item1->getTypeCode();
try
{
- if (TypeOps::is_subtype(tm, *type0, *GENV_TYPESYSTEM.DURATION_TYPE_ONE) &&
- TypeOps::is_subtype(tm, *type1, *GENV_TYPESYSTEM.DURATION_TYPE_ONE))
+ if (TypeOps::is_subtype(type0, store::XS_DURATION) &&
+ TypeOps::is_subtype(type1, store::XS_DURATION))
{
- if (TypeOps::is_equal(tm, *type0, *type1) &&
- !TypeOps::is_equal(tm, *type0, *GENV_TYPESYSTEM.DURATION_TYPE_ONE))
+ if (type0 == type1 && type0 != store::XS_DURATION)
{
- return aItem0->compare(aItem1, timezone, aCollation);
+ return item0->compare(item1, timezone, collation);
}
else
{
+ xqtref_t type0 = tm->create_value_type(item0.getp());
+ xqtref_t type1 = tm->create_value_type(item1.getp());
+
RAISE_ERROR(err::XPTY0004, loc,
ERROR_PARAMS(ZED(BadType_23o), *type0, ZED(NoCompareWithType_4), *type1));
}
}
- else if (TypeOps::is_subtype(tm, *type1, *type0))
+ else if (TypeOps::is_subtype(type1, type0))
{
- return aItem0->compare(aItem1, timezone, aCollation);
+ return item0->compare(item1, timezone, collation);
}
- else if (TypeOps::is_subtype(tm, *type0, *type1))
+ else if (TypeOps::is_subtype(type0, type1))
{
- return -aItem1->compare(aItem0, timezone, aCollation);
+ return -item1->compare(item0, timezone, collation);
}
else
{
// There is 1 case when two types are order-comparable without one being a
// subtype of the other: they belong to different branches under of the
// type-inheritance subtree rooted at xs:Integer.
- if (TypeOps::is_subtype(tm, *type0, *GENV_TYPESYSTEM.INTEGER_TYPE_ONE) &&
- TypeOps::is_subtype(tm, *type1, *GENV_TYPESYSTEM.INTEGER_TYPE_ONE))
+ if (TypeOps::is_subtype(type0, store::XS_INTEGER) &&
+ TypeOps::is_subtype(type1, store::XS_INTEGER))
{
- return aItem0->getIntegerValue().compare( aItem1->getIntegerValue() );
+ return item0->getIntegerValue().compare(item1->getIntegerValue());
}
else
{
+ xqtref_t type0 = tm->create_value_type(item0.getp());
+ xqtref_t type1 = tm->create_value_type(item1.getp());
+
RAISE_ERROR(err::XPTY0004, loc,
ERROR_PARAMS(ZED(BadType_23o), *type0, ZED(NoCompareWithType_4), *type1));
}
@@ -945,6 +953,9 @@
// For example, two QName items do not have an order relationship.
if (e.diagnostic() == zerr::ZSTR0040_TYPE_ERROR)
{
+ xqtref_t type0 = tm->create_value_type(item0.getp());
+ xqtref_t type1 = tm->create_value_type(item1.getp());
+
RAISE_ERROR(err::XPTY0004, loc,
ERROR_PARAMS(ZED(BadType_23o), *type0, ZED(NoCompareWithType_4), *type1));
}
=== modified file 'src/store/naive/qname_pool.cpp'
--- src/store/naive/qname_pool.cpp 2011-10-03 09:18:49 +0000
+++ src/store/naive/qname_pool.cpp 2012-01-24 11:27:35 +0000
@@ -63,8 +63,8 @@
********************************************************************************/
QNamePool::~QNamePool()
{
- ulong n = (ulong)theHashSet.theHashTab.size();
- for (ulong i = 0; i < n; i++)
+ csize n = theHashSet.theHashTab.size();
+ for (csize i = 0; i < n; ++i)
{
if (!theHashSet.theHashTab[i].isFree())
{
=== modified file 'src/types/casting.cpp'
--- src/types/casting.cpp 2012-01-11 10:30:49 +0000
+++ src/types/casting.cpp 2012-01-24 11:27:35 +0000
@@ -1340,7 +1340,6 @@
bool str_down(
store::Item_t& result,
const store::Item* aItem,
- RootTypeManager& aTS,
ATOMIC_CODE_T aTargetAtomicType,
store::ItemFactory* aFactory,
const ErrorInfo& aErrorInfo)
@@ -1432,7 +1431,6 @@
bool int_down(
store::Item_t& result,
const store::Item* aItem,
- RootTypeManager& aTS,
ATOMIC_CODE_T aTargetAtomicType,
store::ItemFactory* aFactory,
const ErrorInfo& aErrorInfo)
@@ -1457,11 +1455,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_long const n = ztd::aton<xs_long>(lString.c_str());
return aFactory->createLong(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1470,11 +1470,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_int const n = ztd::aton<xs_int>(lString.c_str());
return aFactory->createInt(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1483,11 +1485,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_short const n = ztd::aton<xs_short>(lString.c_str());
return aFactory->createShort(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1529,11 +1533,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_unsignedInt const n = ztd::aton<xs_unsignedInt>(lString.c_str());
return aFactory->createUnsignedInt(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1542,11 +1548,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_unsignedShort const n = ztd::aton<xs_unsignedShort>(lString.c_str());
return aFactory->createUnsignedShort(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1555,11 +1563,13 @@
{
zstring lString;
aItem->getStringValue2(lString);
- try {
+ try
+ {
xs_unsignedByte const n = ztd::aton<xs_unsignedByte>(lString.c_str());
return aFactory->createUnsignedByte(result, n);
}
- catch ( std::exception const& ) {
+ catch ( std::exception const& )
+ {
// ignore
}
break;
@@ -1818,7 +1828,6 @@
{
valid = (*lDownCastFunc)(result,
&*result,
- rtm,
targetTypeCode,
lFactory,
lErrorInfo);
@@ -1842,7 +1851,6 @@
namespace_context* nsCtx,
const QueryLoc& loc)
{
- RootTypeManager& rtm = GENV_TYPESYSTEM;
store::ItemFactory* factory = GENV_ITEMFACTORY;
ZORBA_ASSERT(aItem->isAtomic());
@@ -1925,7 +1933,6 @@
{
valid = (*downCastFunc)(result,
&*result,
- rtm,
targetTypeCode,
factory,
errorInfo);
@@ -1950,22 +1957,19 @@
namespace_context* nsCtx,
const QueryLoc& loc)
{
- RootTypeManager& rtm = GENV_TYPESYSTEM;
store::ItemFactory* factory = GENV_ITEMFACTORY;
zstring sourceString;
- ZORBA_ASSERT(item->isAtomic());
-
store::SchemaTypeCode sourceType = item->getTypeCode();
+ if (sourceType == targetType)
+ {
+ result.transfer(item);
+ return true;
+ }
+
ErrorInfo errorInfo(sourceType, targetType, loc);
- if (sourceType == targetType)
- {
- result.transfer(item);
- return true;
- }
-
if (targetType == store::XS_NOTATION ||
targetType == store::XS_ANY_ATOMIC)
{
@@ -1973,18 +1977,24 @@
}
if (sourceType == store::XS_ANY_ATOMIC)
+ {
throwTypeException(err::XPTY0004, errorInfo);
+ }
if (targetType == store::XS_NCNAME &&
sourceType != store::XS_STRING &&
sourceType != store::XS_NCNAME &&
sourceType != store::XS_UNTYPED_ATOMIC)
+ {
throwTypeException(err::XPTY0004, errorInfo);
+ }
CastFunc castFunc = theCastMatrix[theMapping[sourceType]]
[theMapping[targetType]];
if (castFunc == 0)
+ {
throwTypeException(err::XPTY0004, errorInfo);
+ }
if (theMapping[sourceType] == theMapping[store::XS_STRING])
{
@@ -2006,7 +2016,6 @@
{
valid = (*downCastFunc)(result,
&*result,
- rtm,
targetType,
factory,
errorInfo);
=== modified file 'src/types/casting.h'
--- src/types/casting.h 2012-01-11 10:30:49 +0000
+++ src/types/casting.h 2012-01-24 11:27:35 +0000
@@ -40,16 +40,15 @@
zstring& strval,
store::ItemFactory*,
namespace_context *nsCtx,
- const ErrorInfo& aErrorInfo
- );
+ const ErrorInfo& aErrorInfo);
+
typedef bool (*DownCastFunc)(
store::Item_t&,
const store::Item*,
- RootTypeManager& aTS,
store::SchemaTypeCode aTargetAtomicType,
store::ItemFactory*,
- const ErrorInfo& aErrorInfo
- );
+ const ErrorInfo& aErrorInfo);
+
private:
static const int theMapping[store::XS_LAST];
static const CastFunc theCastMatrix[23][23];
Follow ups