#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #include #include #include #include /*static*/ const XMLCh And::name[]={ XERCES_CPP_NAMESPACE_QUALIFIER chLatin_a, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_n, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_d, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; And::And(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : DataItemOperator(name, args, memMgr) { } Sequence And::collapseTreeInternal(DynamicContext* context, int flags) const { for(unsigned int i=0;i<_args.size();i++) if(!getBooleanParam(i,context)) return Sequence(DatatypeFactory::POD2AT::createBoolean(context->getMemoryManager(), false, context), context->getMemoryManager()); return Sequence(DatatypeFactory::POD2AT::createBoolean(context->getMemoryManager(), true, context), context->getMemoryManager()); } DataItem* And::staticResolution(StaticContext *context, StaticResolutionContext *src) { StaticResolutionContext newSrc(context->getMemoryManager()); StaticResolutionContext valueSrc(context->getMemoryManager()); VectorOfDataItems newArgs(PathanAllocator(context->getMemoryManager())); for(VectorOfDataItems::iterator i = _args.begin(); i != _args.end(); ++i) { valueSrc.clear(); *i = (*i)->staticResolution(context, &valueSrc); if(valueSrc.isUsed()) { newSrc.add(&valueSrc); newArgs.push_back(*i); } else { DynamicContext *dContext = context->createDynamicContext(); if(!(*i)->collapseTree(dContext, DataItem::UNORDERED | DataItem::RETURN_TWO).getEffectiveBooleanValue(dContext)) { // It's constantly false, so this expression is false Sequence result(DatatypeFactory::POD2AT::createBoolean(getMemoryManager(), false, dContext), getMemoryManager()); DataItem* newBlock = new (getMemoryManager()) DataItemSequence(result, getMemoryManager()); newBlock->addPredicates(_predList); return newBlock->staticResolution(context, src); } } } src->add(&newSrc); _args = newArgs; return resolvePredicates(context, src); }