#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 #include #include DataItemQuantifiedExpr::DataItemQuantifiedExpr(DataItemQuantifiedExpr::QuantifierType qType, VectorOfBindings* bindings, DataItem* returnExpr, XPath2MemoryManager* memMgr) : DataItemFor(bindings, returnExpr, memMgr) { _qType=qType; setType(DataItem::QUANTIFIED); } DataItem* DataItemQuantifiedExpr::staticResolution(StaticContext *context, StaticResolutionContext *src) { StaticResolutionContext newSrc(context->getMemoryManager()); DataItemFor::staticResolutionImpl(context, &newSrc); if(newSrc.isUsed()) { if(_returnExpr->isConstant()) { DynamicContext *dContext = context->createDynamicContext(); bool value = _returnExpr->collapseTree(dContext).getEffectiveBooleanValue(dContext); Sequence s(DatatypeFactory::POD2AT::createBoolean(getMemoryManager(), value, dContext), context->getMemoryManager()); DataItem* newBlock = new (getMemoryManager()) DataItemSequence(s, getMemoryManager()); newBlock->addPredicates(getPredicates()); return newBlock->staticResolution(context, src); } else { src->add(&newSrc); return resolvePredicates(context, src); } } else { return constantFold(context, src); } } Sequence DataItemQuantifiedExpr::collapseTreeInternal(Bindings::const_iterator it, Bindings::const_iterator end, DynamicContext* context, int flags) const { VariableStore* varStore = context->getVariableStore(); bool defaultResult = (_qType == some) ? false : true; // Make the execution bindings ExecutionBindings ebs; for(; it != end; ++it) { ebs.push_back(VBExecution(*it, context)); } // Initialise and run the execution bindings varStore->addLogicalBlockScope(); if(next(ebs, context, true)) { do { bool result = _returnExpr->collapseTree(context, DataItem::UNORDERED|DataItem::RETURN_TWO).getEffectiveBooleanValue(context); if(defaultResult != result) { defaultResult = result; break; } } while(next(ebs, context, false)); } varStore->removeScope(); return Sequence(DatatypeFactory::POD2AT::createBoolean(context->getMemoryManager(), defaultResult, context), context->getMemoryManager()); } DataItemQuantifiedExpr::QuantifierType DataItemQuantifiedExpr::getQuantifierType() const { return _qType; }