Item::Ptr Multiply::execute(const AnyAtomicType::Ptr &atom1, const AnyAtomicType::Ptr &atom2, DynamicContext *context) const { if(atom1.isNull() || atom2.isNull()) return 0; // xs:double * xs:duration (only xdt:dayTimeDuration and xdt:yearMonthDuration) if(atom1->isNumericValue() && (atom2->getPrimitiveTypeIndex() == AnyAtomicType::DAY_TIME_DURATION || atom2->getPrimitiveTypeIndex() == AnyAtomicType::YEAR_MONTH_DURATION)) { return ((const ATDurationOrDerived*)atom2.get())->multiply((const Numeric*)atom1.get(), context); } // xs:duration * xs:double (only xdt:dayTimeDuration and xdt:yearMonthDuration) if(atom2->isNumericValue() && (atom1->getPrimitiveTypeIndex() == AnyAtomicType::DAY_TIME_DURATION || atom1->getPrimitiveTypeIndex() == AnyAtomicType::YEAR_MONTH_DURATION)) { return ((const ATDurationOrDerived*)atom1.get())->multiply((const Numeric*)atom2.get(), context); } // numeric * numeric if(atom1->isNumericValue()) { if(atom2->isNumericValue()) { return ((const Numeric*)atom1.get())->multiply((const Numeric*)atom2.get(), context); } else { XQThrow(XPath2ErrorException,X("Multiply::createSequence"), X("An attempt to multiply a non numeric type to a numeric type has occurred [err:XPTY0004]")); } } XQThrow(XPath2ErrorException,X("Multiply::createSequence"), X("The operator * has been called on invalid operand types [err:XPTY0004]")); }
Item::Ptr DistinctValueResult::next(DynamicContext *context) { if(toDo_) { toDo_ = false; parent_ = fdv_->getParamNumber(1, context); Collation *collation; if(fdv_->getNumArgs() > 1) { const XMLCh* collName = fdv_->getParamNumber(2, context)->next(context)->asString(context); try { context->getItemFactory()->createAnyURI(collName, context); } catch(XPath2ErrorException &e) { XQThrow(FunctionException, X("FunctionDistinctValues::DistinctValueResult::next"), X("Invalid collationURI")); } collation = context->getCollation(collName, this); } else collation = context->getDefaultCollation(this); alreadySeen_ = new DistinctSet(dvCompare(collation, context)); } AnyAtomicType::Ptr item; while(true) { item = (const AnyAtomicType *)parent_->next(context).get(); if(item.isNull()) break; if(alreadySeen_->insert(item).second) return item; } parent_ = 0; return 0; }
static inline bool isEmptyOrNaN(const AnyAtomicType::Ptr &si) { return si.isNull() || (si->isNumericValue() && ((Numeric*)si.get())->isNaN()); }