ASTNode *FunctionDocAvailable::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); _src.availableDocumentsUsed(true); calculateSRCForArguments(context); return this; }
ASTNode *FunctionDayFromDate::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType(StaticType::DECIMAL_TYPE, 0, 1); return calculateSRCForArguments(context, /*checkTimezone*/true); }
ASTNode *FunctionCurrentTime::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType::TIME_TYPE; _src.currentTimeUsed(true); return calculateSRCForArguments(context); }
ASTNode *FunctionDocAvailable::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType::BOOLEAN_TYPE; _src.availableDocumentsUsed(true); return calculateSRCForArguments(context); }
ASTNode *FunctionLocalname::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType::STRING_TYPE; if(_args.empty()) { _src.contextItemUsed(true); } return calculateSRCForArguments(context); }
ASTNode *FunctionAdjustTimeToTimezone::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType(StaticType::TIME_TYPE, 0, 1); if(getNumArgs() == 1) { _src.implicitTimezoneUsed(true); } return calculateSRCForArguments(context); }
ASTNode *NumericFunction::staticTypingImpl(StaticContext *context) { ASTNode *result = calculateSRCForArguments(context, /*checkTimezone*/false, /*numericfunction*/true); if(result == this) { if(!_args[0]->getStaticAnalysis().getStaticType().containsType(StaticType::NUMERIC_TYPE) && _args[0]->getStaticAnalysis().getStaticType().getMin() > 0) XQThrow(FunctionException,X("NumericFunction::staticTyping"), X("Non-numeric argument in numeric function [err:XPTY0004]")); } return result; }
ASTNode *FunctionDistinctValues::staticTypingImpl(StaticContext *context) { _src.clear(); ASTNode *result = calculateSRCForArguments(context); if(result == this) { _src.getStaticType() = _args.front()->getStaticAnalysis().getStaticType(); _src.getStaticType().setCardinality(_src.getStaticType().getMin() == 0 ? 0 : 1, _src.getStaticType().getMax()); } return result; }
ASTNode *FunctionParseXML::staticTypingImpl(StaticContext *context) { _src.clear(); _src.setProperties(StaticAnalysis::DOCORDER | StaticAnalysis::GROUPED | StaticAnalysis::PEER | StaticAnalysis::SUBTREE | StaticAnalysis::ONENODE); _src.getStaticType() = StaticType(StaticType::DOCUMENT_TYPE, 0, 1); _src.creative(true); return calculateSRCForArguments(context); }
ASTNode *FunctionInsertBefore::staticTypingImpl(StaticContext *context) { _src.clear(); ASTNode *result = calculateSRCForArguments(context); if(result == this) { _src.getStaticType() = _args[0]->getStaticAnalysis().getStaticType(); _src.getStaticType().typeConcat(_args[2]->getStaticAnalysis().getStaticType()); } return result; }
ASTNode *FunctionTrace::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); calculateSRCForArguments(context); _src.getStaticType() = _args.front()->getStaticAnalysis().getStaticType(); _src.setProperties(_args.front()->getStaticAnalysis().getProperties()); _src.forceNoFolding(true); return this; }
ASTNode *FunctionLast::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); if(context && !context->getContextItemType().containsType(StaticType::ITEM_TYPE)) { XQThrow(DynamicErrorException,X("XQContextItem::staticTyping"), X("It is an error for the context item to be undefined when using it [err:XPDY0002]")); } _src.contextSizeUsed(true); calculateSRCForArguments(context); return this; }
ASTNode *FunctionDocument::staticTypingImpl(StaticContext *context) { _src.clear(); _src.setProperties(StaticAnalysis::DOCORDER | StaticAnalysis::GROUPED | StaticAnalysis::PEER | StaticAnalysis::SUBTREE | StaticAnalysis::ONENODE); // TBD Change if we support fragment identifiers - jpcs _src.getStaticType() = StaticType(StaticType::DOCUMENT_TYPE, 0, StaticType::UNLIMITED); _src.availableDocumentsUsed(true); return calculateSRCForArguments(context); }
ASTNode *FunctionDoc::staticTypingImpl(StaticContext *context) { _src.clear(); if(_args[0]->getStaticAnalysis().getStaticType().getMin() == 0) _src.getStaticType() = StaticType(StaticType::DOCUMENT_TYPE, 0, 1); else _src.getStaticType() = StaticType(StaticType::DOCUMENT_TYPE, 1, 1); _src.setProperties(StaticAnalysis::DOCORDER | StaticAnalysis::GROUPED | StaticAnalysis::PEER | StaticAnalysis::SUBTREE | StaticAnalysis::ONENODE); _src.availableDocumentsUsed(true); return calculateSRCForArguments(context); }
ASTNode *FunctionEmpty::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); calculateSRCForArguments(context); if(context) { const StaticAnalysis &sa = _args[0]->getStaticAnalysis(); const StaticType &sType = sa.getStaticType(); if((sType.getMin() > 0 || sType.getMax() == 0) && !sa.areDocsOrCollectionsUsed() && !sa.isNoFoldingForced()) { XPath2MemoryManager* mm = context->getMemoryManager(); return XQLiteral::create(sType.getMax() == 0, mm, this); } } return this; }
ASTNode *FunctionCount::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); calculateSRCForArguments(context); if(context) { const StaticAnalysis &sa = _args[0]->getStaticAnalysis(); const StaticType &sType = sa.getStaticType(); if(sType.getMin() == sType.getMax() && !sa.areDocsOrCollectionsUsed() && !sa.isNoFoldingForced()) { XPath2MemoryManager* mm = context->getMemoryManager(); try { AutoDelete<DynamicContext> dContext(context->createDynamicContext()); dContext->setMemoryManager(mm); return XQLiteral::create(mm->createInteger(sType.getMin()), dContext, mm, this); } catch(XQException &ex) { // Constant folding failed } } } return this; }
ASTNode *FunctionMinutesFromDateTime::staticTypingImpl(StaticContext *context) { _src.clearExceptType(); calculateSRCForArguments(context, /*checkTimezone*/true); return this; }
ASTNode *FunctionName::staticTypingImpl(StaticContext *context) { _src.clear(); _src.getStaticType() = StaticType::STRING_TYPE; return calculateSRCForArguments(context); }