00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00015
00017
00018 #if !defined(AFXQ_XQUERY_H__FAA9933A_2F10_49A4_93A2_857E2A8C48E3__INCLUDED_)
00019 #define AFXQ_XQUERY_H__FAA9933A_2F10_49A4_93A2_857E2A8C48E3__INCLUDED_
00020
00021 #include <xqilla/framework/XQillaExport.hpp>
00022 #include <vector>
00023 #include <string>
00024 #include <xercesc/util/XMemory.hpp>
00025 #include <xercesc/sax/InputSource.hpp>
00026 #include <xqilla/runtime/ResultImpl.hpp>
00027 #include <xqilla/runtime/LazySequenceResult.hpp>
00028 #include <xqilla/context/StaticContext.hpp>
00029
00030 class DynamicContext;
00031 class XQUserFunction;
00032 class XQGlobalVariable;
00033 class XQQuery;
00034
00035 typedef std::vector<XQUserFunction*, XQillaAllocator<XQUserFunction*> > UserFunctions;
00036 typedef std::vector<XQGlobalVariable*, XQillaAllocator<XQGlobalVariable*> > GlobalVariables;
00037 typedef std::vector<XQQuery*, XQillaAllocator<XQQuery*> > ImportedModules;
00038
00053 class XQILLA_API XQQuery : public XERCES_CPP_NAMESPACE_QUALIFIER XMemory
00054 {
00055 public:
00057 ~XQQuery();
00058
00060
00061
00070 DynamicContext *createDynamicContext(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *memMgr =
00071 XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::fgMemoryManager) const;
00072
00085 Result execute(DynamicContext* context) const;
00086
00106 void staticResolution(StaticContext *context = 0);
00107
00120 void staticTyping(StaticContext *context = 0);
00121
00123
00125
00126
00128 const XMLCh* getQueryText() const;
00129
00131 std::string getQueryPlan() const;
00132
00134
00136
00137
00139 ASTNode* getQueryBody() const;
00141 void setQueryBody(ASTNode* query);
00142
00144 void addFunction(XQUserFunction* fnDef);
00146 const UserFunctions &getFunctions() const { return m_userDefFns; }
00147
00149 void addVariable(XQGlobalVariable* varDef);
00151 const GlobalVariables &getVariables() const { return m_userDefVars; }
00152
00154 const ImportedModules &getImportedModules() const { return m_importedModules; }
00155
00157 const XMLCh* getFile() const;
00159 void setFile(const XMLCh* file);
00160
00161 const DynamicContext *getStaticContext() const { return m_context; }
00162
00164
00166
00167
00169 void setIsLibraryModule(bool bIsModule=true);
00171 bool getIsLibraryModule() const;
00173 void setModuleTargetNamespace(const XMLCh* uri);
00175 const XMLCh* getModuleTargetNamespace() const;
00177 void importModule(const XMLCh* szUri, VectorOfStrings* locations, StaticContext* context);
00178
00180
00181 private:
00182 void importModuleImpl(const XMLCh* szUri, XERCES_CPP_NAMESPACE_QUALIFIER InputSource* location, StaticContext* context);
00183
00185 class QueryResult : public ResultImpl
00186 {
00187 public:
00188 QueryResult(const XQQuery *query);
00189
00190 Item::Ptr next(DynamicContext *context);
00191 std::string asString(DynamicContext *context, int indent) const;
00192
00193 private:
00194 const XQQuery *_query;
00195 Result _parent;
00196 bool _toDo;
00197 };
00198
00200 class DebugResult : public LazySequenceResult
00201 {
00202 public:
00203 DebugResult(const XQQuery *query, DynamicContext *context);
00204
00205 void getResult(Sequence &toFill, DynamicContext *context) const;
00206 std::string asString(DynamicContext *context, int indent) const;
00207
00208 private:
00209 const XQQuery *_query;
00210 };
00211
00212 private:
00214 XQQuery(const XMLCh* queryText, DynamicContext *context, bool contextOwned = false,
00215 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *memMgr =
00216 XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::fgMemoryManager);
00217
00218 XQQuery(const XQQuery &);
00219 XQQuery &operator=(const XQQuery &);
00220
00221 private:
00223 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* m_memMgr;
00224
00226 DynamicContext *m_context;
00227 bool m_contextOwned;
00228
00229 ASTNode* m_query;
00230
00231 bool m_bIsLibraryModule;
00232 const XMLCh* m_szTargetNamespace;
00233 const XMLCh* m_szQueryText;
00234 const XMLCh* m_szCurrentFile;
00235
00236 UserFunctions m_userDefFns;
00237 GlobalVariables m_userDefVars;
00238 ImportedModules m_importedModules;
00239
00240 friend class QueryResult;
00241 friend class DebugResult;
00242 friend class XQilla;
00243 };
00244
00245 #endif // !defined(AFXQ_XQUERY_H__FAA9933A_2F10_49A4_93A2_857E2A8C48E3__INCLUDED_)