hqlhtcpp.ipp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef __HQLHTCPP_IPP_
  14. #define __HQLHTCPP_IPP_
  15. #include "eclhelper.hpp"
  16. #include "hqlcpp.hpp"
  17. #include "hqlcpp.ipp"
  18. #include "hqlcpp.hpp"
  19. #include "hqltrans.ipp"
  20. //===========================================================================
  21. class HQLCPP_API ThorBoundActivity : public ABoundActivity
  22. {
  23. public:
  24. ThorBoundActivity(IHqlExpression * _dataset, IHqlExpression * _bound, unsigned _activityid, unsigned _containerid, unsigned _graphId, ThorActivityKind _kind)
  25. : ABoundActivity(_dataset->queryBody(), _bound, _activityid, _containerid, _graphId, _kind) {}
  26. };
  27. //===========================================================================
  28. class MetaInstance
  29. {
  30. public:
  31. //Shouldn't really need to pass translator, but it provides a place to have a per-query unique id. Anything else seems even messier.
  32. MetaInstance() { record = NULL; grouped = false; }
  33. MetaInstance(HqlCppTranslator & translator, IHqlExpression * _record, bool _isGrouped);
  34. bool isGrouped() const { return grouped; }
  35. IHqlExpression * queryRecord() const { return record; }
  36. void setMeta(HqlCppTranslator & translator, IHqlExpression * _record, bool _isGrouped);
  37. IHqlExpression * getMetaUniqueKey() { return searchKey.getLink(); }
  38. const char * queryInstanceObject() { return instanceObject ? instanceObject : instanceName; }
  39. public:
  40. StringAttr metaName;
  41. StringAttr instanceName;
  42. StringAttr metaFactoryName;
  43. StringAttr instanceObject;
  44. private:
  45. HqlExprAttr searchKey;
  46. IHqlExpression * record;
  47. bool grouped;
  48. };
  49. //===========================================================================
  50. class SteppingFieldSelection
  51. {
  52. public:
  53. void clear() { ds.clear(); fields.clear(); }
  54. bool exists() { return ds != NULL; }
  55. void expandTransform(IHqlExpression * expr);
  56. void extractFields(SteppingFieldSelection & steppingFields);
  57. void generateSteppingMetaMember(HqlCppTranslator & translator, BuildCtx & ctx, const char * name);
  58. IHqlExpression * invertTransform(IHqlExpression * expr, IHqlExpression * select);
  59. void set(IHqlExpression * _ds, IHqlExpression * _fields);
  60. void setStepping(IHqlExpression * expr);
  61. private:
  62. IHqlExpression * extractSelect(IHqlExpression * expr);
  63. void gatherFieldOffsetSizes(HqlCppTranslator & translator, UnsignedArray & result);
  64. IHqlExpression * generateSteppingMeta(HqlCppTranslator & translator);
  65. public:
  66. LinkedHqlExpr ds;
  67. LinkedHqlExpr fields;
  68. };
  69. //===========================================================================
  70. //MORE: I should derive the following and ActivityInstance from a common base class
  71. class GlobalClassEvalContext;
  72. class GlobalClassBuilder
  73. {
  74. public:
  75. GlobalClassBuilder(HqlCppTranslator & _translator, BuildCtx & ctx, const char * className, const char * baseName, const char * _accessorInterface);
  76. void buildClass(unsigned priority=0);
  77. void completeClass(unsigned priority=0);
  78. inline void setIncomplete(bool value) { classStmt->setIncomplete(value); }
  79. inline void setIncluded(bool value) { classStmt->setIncluded(value); }
  80. public:
  81. HqlCppTranslator & translator;
  82. BuildCtx classctx;
  83. BuildCtx nestedctx;
  84. BuildCtx createctx;
  85. BuildCtx startctx;
  86. IHqlStmt * classStmt;
  87. Owned<ParentExtract> parentExtract;
  88. Owned<EvalContext> parentEvalContext;
  89. Owned<GlobalClassEvalContext> evalContext;
  90. IHqlStmt * onCreateStmt;
  91. StringAttr className;
  92. StringAttr baseName;
  93. StringAttr accessorInterface;
  94. StringAttr accessorName;
  95. };
  96. class JoinKeyInfo;
  97. class ActivityInstance;
  98. class NlpParseContext;
  99. extern StringBuffer &expandLiteral(StringBuffer &s, const char *f);
  100. class ActivityEvalContext;
  101. class ActivityInstance : public HqlExprAssociation
  102. {
  103. public:
  104. ActivityInstance(HqlCppTranslator & _translator, BuildCtx & ctx, ThorActivityKind _kind, IHqlExpression * _dataset, const char * activityArgName);
  105. ~ActivityInstance();
  106. // HqlExprAssociation
  107. virtual AssocKind getKind() { return AssocActivityInstance; }
  108. ABoundActivity * queryBoundActivity() { return table; }
  109. ABoundActivity * getBoundActivity();
  110. bool isChildActivity() { return (containerActivity != NULL); }
  111. bool isExternal();
  112. inline bool isAction() { return activityExpr->isAction(); }
  113. void noteChildQuery() { numChildQueries++; }
  114. void setLocal(bool value=true) { isLocal = value; }
  115. void setGrouped(bool value=true) { isGrouped = value; }
  116. IHqlDelayedCodeGenerator * createOutputCountCallback() { return table->createOutputCountCallback(); }
  117. void buildPrefix();
  118. void buildSuffix();
  119. void buildMetaMember();
  120. void getScope(StringBuffer & scope) const; // return the full scope name of this activity
  121. void addAttribute(const char * name, const char * value);
  122. void addAttribute(const char * name, IHqlExpression * expr);
  123. void addAttributeInt(const char * name, __int64 value);
  124. void addAttributeBool(const char * name, bool value, bool alwaysAdd=false);
  125. void addSignedAttribute(IHqlExpression * signedAttr);
  126. void addLocationAttribute(IHqlExpression * location);
  127. void addNameAttribute(IHqlExpression * location);
  128. void removeAttribute(const char * name);
  129. void createGraphNode(IPropertyTree * subGraph, bool isRoot);
  130. ParentExtract * createNestedExtract();
  131. void addBaseClass(const char * name, bool needLinkOverride);
  132. void addConstructorParameter(IHqlExpression * expr) { constructorArgs.append(*LINK(expr)); }
  133. void addConstructorMetaParameter();
  134. void processAnnotation(IHqlExpression * annotation);
  135. void processAnnotations(IHqlExpression * expr);
  136. void processHints(IHqlExpression * hintAttr);
  137. void processSection(IHqlExpression * hintAttr);
  138. BuildCtx & onlyEvalOnceContext();
  139. inline IPropertyTree * querySubgraphNode() { return subgraph ? subgraph->tree.get() : NULL; }
  140. inline void setImplementationClass(IIdAtom * name) { implementationClassName = name; }
  141. inline bool requiresRemoteSerialize() const { return executedRemotely; }
  142. void setInternalSink(bool value);
  143. void changeActivityKind(ThorActivityKind newKind);
  144. protected:
  145. void noteChildActivityLocation(IHqlExpression * pass);
  146. void moveDefinitionToHeader();
  147. void processHint(IHqlExpression * attr);
  148. public:
  149. HqlCppTranslator & translator;
  150. unsigned activityId;
  151. unsigned numChildQueries;
  152. ThorActivityKind kind;
  153. HqlExprAttr activityExpr;
  154. LinkedHqlExpr sourceFileSequence;
  155. StringAttr activityArgName;
  156. StringAttr className;
  157. StringAttr factoryName;
  158. StringAttr instanceName;
  159. StringAttr argsName;
  160. StringBuffer graphEclText;
  161. StringAttr graphLabel;
  162. StringBuffer baseClassExtra;
  163. MetaInstance meta;
  164. IIdAtom * implementationClassName;
  165. ABoundActivity* table;
  166. bool isMember;
  167. bool instanceIsLocal;
  168. bool isCoLocal;
  169. bool isNoAccess;
  170. bool executedRemotely;
  171. bool includedInHeader;
  172. bool isLocal;
  173. bool isGrouped;
  174. bool hasChildActivity;
  175. bool generateMetaFromInput = false;
  176. GraphLocalisation activityLocalisation;
  177. ActivityInstance * containerActivity;
  178. Owned<ParentExtract> parentExtract;
  179. Owned<EvalContext> parentEvalContext;
  180. IHqlStmt * onCreateStmt;
  181. IHqlStmt * classGroup;
  182. unsigned initialGroupMarker;
  183. HqlExprArray constructorArgs;
  184. HqlExprCopyArray names;
  185. LocationArray locations;
  186. Linked<IPropertyTree> graphNode;
  187. IHqlStmt * classStmt;
  188. IHqlStmt * classGroupStmt;
  189. BuildCtx classctx;
  190. BuildCtx createctx;
  191. BuildCtx startctx;
  192. BuildCtx nestedctx;
  193. BuildCtx onstartctx;
  194. Owned<ActivityEvalContext> evalContext;
  195. OwnedHqlExpr colocalMember;
  196. Owned<ParentExtract> nestedExtract;
  197. SubGraphInfo * subgraph;
  198. cycle_t startTime = 0;
  199. cycle_t nestedTime = 0;
  200. unsigned __int64 startDistance = 0;
  201. };
  202. unsigned getVirtualFieldSize(IHqlExpression * record);
  203. ITypeInfo * getHozedKeyType(IHqlExpression * expr);
  204. IHqlExpression * getHozedKeyValue(IHqlExpression * _value);
  205. IHqlExpression * getHozedBias(ITypeInfo * type);
  206. IHqlExpression * convertIndexPhysical2LogicalValue(IHqlExpression * cur, IHqlExpression * physicalSelect, bool allowTranslate);
  207. bool requiresHozedTransform(ITypeInfo * type);
  208. bool isKeyableType(ITypeInfo * type);
  209. IHqlExpression * getFilepos(IHqlExpression * dataset, bool isLocal);
  210. class ReferenceSelector : public CInterfaceOf<IReferenceSelector>
  211. {
  212. public:
  213. ReferenceSelector(HqlCppTranslator & _translator);
  214. protected:
  215. HqlCppTranslator & translator;
  216. };
  217. enum CDtype { CDTnone, CDTcount, CDTmarker, CDTterminator, CDThole, CDTrow, CDTlocal };
  218. class DatasetSelector : public ReferenceSelector
  219. {
  220. public:
  221. DatasetSelector(HqlCppTranslator & _translator, BoundRow * _cursor, IHqlExpression * _path = NULL);
  222. ~DatasetSelector();
  223. virtual void assignTo(BuildCtx & ctx, const CHqlBoundTarget & target);
  224. virtual void buildAddress(BuildCtx & ctx, CHqlBoundExpr & bound);
  225. virtual void buildClear(BuildCtx & ctx, int direction);
  226. virtual void get(BuildCtx & ctx, CHqlBoundExpr & bound);
  227. virtual void getOffset(BuildCtx & ctx, CHqlBoundExpr & bound);
  228. virtual void getSize(BuildCtx & ctx, CHqlBoundExpr & bound);
  229. virtual size32_t getContainerTrailingFixed();
  230. virtual bool isBinary();
  231. virtual bool isConditional();
  232. virtual bool isRoot();
  233. virtual AColumnInfo * queryColumn();
  234. virtual IHqlExpression * queryExpr();
  235. virtual BoundRow * queryRootRow();
  236. virtual BoundRow * getRow(BuildCtx & ctx);
  237. virtual ITypeInfo * queryType();
  238. virtual void modifyOp(BuildCtx & ctx, IHqlExpression * expr, node_operator op);
  239. virtual void set(BuildCtx & ctx, IHqlExpression * expr);
  240. virtual void setRow(BuildCtx & ctx, IReferenceSelector * rhs);
  241. virtual IReferenceSelector * select(BuildCtx & ctx, IHqlExpression * selectExpr);
  242. virtual void buildDeserialize(BuildCtx & ctx, IHqlExpression * helper, IAtom * serializeForm);
  243. virtual void buildSerialize(BuildCtx & ctx, IHqlExpression * helper, IAtom * serializeForm);
  244. private:
  245. DatasetSelector(DatasetSelector * _parent, BoundRow * _cursor, AColumnInfo * _column, IHqlExpression * _path);
  246. DatasetSelector * createChild(BoundRow * _cursor, AColumnInfo * newColumn, IHqlExpression * newPath);
  247. bool isDataset();
  248. IHqlExpression * resolveChildDataset(IHqlExpression * searchDataset) const;
  249. AColumnInfo * resolveField(IHqlExpression * search) const;
  250. protected:
  251. IReferenceSelector * parent;
  252. BoundRow * row;
  253. AColumnInfo * column;
  254. HqlExprAttr path;
  255. bool matchedDataset;
  256. };
  257. IHqlExpression * extractFilterConditions(HqlExprAttr & invariant, IHqlExpression * expr, IHqlExpression * dataset, bool spotCSE, bool spotCseInIfDatasetConditions);
  258. extern void buildCompareFuncHelper(HqlCppTranslator & translator, ActivityInstance & instance, const char * compareFuncName, IHqlExpression * sortList, const DatasetReference & dsRef);
  259. bool isLibraryScope(IHqlExpression * expr);
  260. extern IHqlExpression * constantMemberMarkerExpr;
  261. #endif