hqlhtcpp.ipp 11 KB

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