hqltcppc.ipp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  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 __HQLCPPC_IPP_
  14. #define __HQLCPPC_IPP_
  15. #include "hqlutil.hpp"
  16. #include "hqlhtcpp.ipp"
  17. #include "hqltcppc.hpp"
  18. #include "hqlcppc.hpp"
  19. class HqlCppTranslator;
  20. class SizeStruct
  21. {
  22. public:
  23. SizeStruct() { fixedSize = 0; varMinSize = 0; }
  24. SizeStruct(IHqlExpression * _self) { self.set(_self); fixedSize = 0; varMinSize = 0; }
  25. SizeStruct(const SizeStruct & other) { fixedSize = other.fixedSize; varMinSize = other.varMinSize; varSize.set(other.varSize); self.set(other.self); }
  26. void add(const SizeStruct & other);
  27. inline void addFixed(unsigned delta)
  28. {
  29. fixedSize += delta;
  30. }
  31. void addVariableExpr(unsigned _varMinSize, IHqlExpression * expr);
  32. void addVariable(unsigned _varMinSize, IHqlExpression * expr);
  33. void buildSizeExpr(HqlCppTranslator & translator, BuildCtx & ctx, BoundRow * row, CHqlBoundExpr & bound);
  34. void clear(IHqlExpression * _self) { fixedSize = 0; varSize.clear(); self.set(_self); }
  35. void forceToTemp(node_operator op, IHqlExpression * selector);
  36. unsigned getFixedSize() const { return fixedSize; }
  37. unsigned getMinimumSize() const { return fixedSize+varMinSize; }
  38. IHqlExpression * getSizeExpr(BoundRow * cursor) const;
  39. bool isEmpty() const { return fixedSize == 0 && varSize == NULL; }
  40. bool isFixedSize() const { return varSize == NULL; }
  41. bool isWorthCommoning() const;
  42. IHqlExpression * queryVarSize() const { return varSize; }
  43. IHqlExpression * querySelf() const { return self; }
  44. void set(const SizeStruct & other) { fixedSize = other.fixedSize; varSize.set(other.varSize); self.set(other.self); }
  45. void set(unsigned _fixedSize, IHqlExpression * _varSize) { fixedSize = _fixedSize; varSize.set(_varSize); }
  46. protected:
  47. unsigned fixedSize;
  48. unsigned varMinSize;
  49. HqlExprAttr varSize;
  50. HqlExprAttr self;
  51. };
  52. //---------------------------------------------------------------------------
  53. typedef MapOf<IHqlExpression *, AColumnInfo> ColumnToInfoMap;
  54. class CContainerInfo;
  55. class HQLCPP_API CMemberInfo : public AColumnInfo
  56. {
  57. public:
  58. CMemberInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  59. //IMappingBase
  60. virtual const void * getKey() const { return &column; }
  61. //AColumnInfo
  62. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  63. virtual void buildOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  64. virtual bool hasFixedOffset();
  65. virtual bool isPayloadField() const override;
  66. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  67. virtual bool requiresTemp();
  68. //null implementation
  69. virtual bool isConditional();
  70. // implementation virtuals
  71. virtual void calcAllCachedOffsets();
  72. void calcCachedOffsets(const SizeStruct & offset, SizeStruct & sizeSelf);
  73. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  74. virtual IHqlExpression * createSelectorExpr();
  75. virtual void gatherSize(SizeStruct & target);
  76. void gatherOffset(SizeStruct & target, IHqlExpression * selector);
  77. void getSizeExpr(SizeStruct & target);
  78. virtual IReferenceSelector * getSelector(BuildCtx & ctx, IReferenceSelector * parentSelector);
  79. virtual void noteLastBitfield() {}
  80. virtual IHqlExpression * queryParentSelector(IHqlExpression * selector);
  81. virtual IHqlExpression * queryRootSelf();
  82. virtual ITypeInfo * queryType() const;
  83. virtual unsigned getTotalFixedSize();
  84. virtual unsigned getTotalMinimumSize();
  85. virtual unsigned getContainerTrailingFixed();
  86. virtual bool modifyColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value, node_operator op) { return false; }
  87. virtual bool checkCompatibleIfBlock(HqlExprCopyArray & conditions);
  88. virtual bool bindOffsetsFromClass(SizeStruct & accessorOffset, bool prevVariableSize);
  89. virtual void bindSizesFromOffsets(SizeStruct & thisOffset, const SizeStruct & nextOffset);
  90. void addVariableSize(size32_t varMinSize, SizeStruct & size);
  91. void getXPath(StringBuffer & out);
  92. StringBuffer & expandSelectPathText(StringBuffer & out, bool isLast) const;
  93. IHqlExpression * queryColumn() const { return column; }
  94. void getOffsets(SizeStruct & offset, SizeStruct & accessorOffset) const;
  95. public:
  96. IHqlExpression * getCondition(BuildCtx & ctx);
  97. IHqlExpression * getConditionSelect(HqlCppTranslator & translator, BuildCtx & ctx, BoundRow * row);
  98. IHqlExpression * makeConditional(HqlCppTranslator & translator, BuildCtx & ctx, BoundRow * row, IHqlExpression * value);
  99. void setOffset(bool _hasVarOffset); // to avoid loads of arguments to constructor
  100. void setPayload(bool _isPayload); // to avoid loads of arguments to constructor
  101. protected:
  102. virtual ITypeInfo * queryPhysicalType();
  103. void associateSizeOf(BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * rawSize, size32_t extraSize);
  104. void buildConditionFilter(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  105. void doBuildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IHqlExpression * boundSize);
  106. void doBuildSkipInput(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, size32_t size);
  107. void checkAssignOk(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * newLength, unsigned fixedExtra);
  108. void defaultSetColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  109. void ensureTargetAvailable(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, size32_t thisSize);
  110. IHqlExpression * createSelfPeekDeserializer(HqlCppTranslator & translator, IHqlExpression * helper);
  111. IHqlExpression * getColumnAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, ITypeInfo * columnType, size32_t delta = 0);
  112. void getColumnOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & tgt);
  113. IHqlExpression * getColumnRef(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  114. void gatherMaxRowSize(SizeStruct & totalSize, IHqlExpression * newSize, size32_t fixedExtra, IReferenceSelector * selector);
  115. IHqlExpression * addDatasetLimits(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * _value);
  116. bool hasDatasetLimits() const;
  117. protected:
  118. CContainerInfo * container;
  119. CMemberInfo * prior;
  120. HqlExprAttr column;
  121. SizeStruct cachedOffset; // Either fixed or sizeof(x)/offsetof(x) - rebound before building
  122. SizeStruct cachedSize; // Either fixed or sizeof(x) expressions - rebound before building
  123. SizeStruct cachedAccessorOffset;// A translated expression containing the (fixed, field with the offset)
  124. unsigned seq; // For fields the sequence number, for root container the maximum seq so far
  125. bool hasVarOffset;
  126. bool isOffsetCached;
  127. bool isPayload = false;
  128. };
  129. typedef IArrayOf<CMemberInfo> CMemberInfoArray;
  130. struct ReadAheadState
  131. {
  132. public:
  133. ReadAheadState(IHqlExpression * _helper) : helper(_helper) {};
  134. void addDummyMappings()
  135. {
  136. ForEachItemIn(i, requiredValues)
  137. mappedValues.append(OLINK(requiredValues.item(i)));
  138. }
  139. void setMapping(unsigned setIdx, IHqlExpression * expr)
  140. {
  141. mappedValues.replace(*LINK(expr), setIdx);
  142. }
  143. LinkedHqlExpr helper;
  144. HqlExprArray requiredValues;
  145. HqlExprArray mappedValues;
  146. };
  147. class HQLCPP_API CContainerInfo : public CMemberInfo
  148. {
  149. public:
  150. CContainerInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  151. // AColumnInfo
  152. virtual void buildSizeOf(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  153. virtual void buildClear(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, int direction);
  154. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  155. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  156. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  157. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  158. virtual IHqlExpression * createSelectorExpr();
  159. virtual void setRow(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IReferenceSelector * value);
  160. // kind of interface....
  161. virtual void calcAllCachedOffsets();
  162. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  163. virtual IHqlExpression * getCondition(BuildCtx & ctx);
  164. virtual IHqlExpression * getRelativeSelf() = 0;
  165. virtual unsigned getTotalFixedSize();
  166. virtual unsigned getTotalMinimumSize();
  167. virtual bool isConditional();
  168. virtual bool isFixedSize() { return fixedSize && !isDynamic; }
  169. virtual bool bindOffsetsFromClass(SizeStruct & accessorOffset, bool prevVariableSize);
  170. virtual void bindSizesFromOffsets(SizeStruct & thisOffset, const SizeStruct & nextOffset);
  171. virtual bool usesAccessClass() const { return container->usesAccessClass(); }
  172. void addTrailingFixed(SizeStruct & size, CMemberInfo * cur);
  173. void subLeadingFixed(SizeStruct & size, CMemberInfo * cur);
  174. void getContainerXPath(StringBuffer & out);
  175. unsigned nextSeq();
  176. inline unsigned numChildren() const { return children.ordinality(); }
  177. public:
  178. void addChild(CMemberInfo * child);
  179. void setFixedSize(bool _fixed) { fixedSize = _fixed; }
  180. void setDynamic() { isDynamic = true; }
  181. protected:
  182. virtual void registerChild(CMemberInfo * child);
  183. void calcCachedChildrenOffsets(const SizeStruct & startOffset, SizeStruct & sizeSelf);
  184. protected:
  185. CMemberInfoArray children;
  186. SizeStruct accessorSize;// A translated expression containing the (fixed, field with the offset)
  187. bool fixedSize;
  188. bool isDynamic;
  189. };
  190. class HQLCPP_API CRecordInfo : public CContainerInfo
  191. {
  192. public:
  193. CRecordInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  194. //AColumnInfo
  195. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  196. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  197. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  198. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  199. virtual IHqlExpression * getRelativeSelf();
  200. virtual IHqlExpression * queryRootSelf();
  201. virtual bool usesAccessClass() const { return container ? container->usesAccessClass() : useAccessClass; }
  202. void setUseAccessClass() { useAccessClass = true; }
  203. protected:
  204. virtual void registerChild(CMemberInfo * child);
  205. protected:
  206. ColumnToInfoMap map;
  207. OwnedHqlExpr cachedSelf;
  208. bool useAccessClass;
  209. };
  210. class HQLCPP_API CIfBlockInfo : public CContainerInfo
  211. {
  212. public:
  213. CIfBlockInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  214. //AColumnInfo
  215. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  216. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  217. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  218. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  219. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  220. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  221. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  222. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  223. virtual bool checkCompatibleIfBlock(HqlExprCopyArray & conditions);
  224. virtual IHqlExpression * getCondition(BuildCtx & ctx);
  225. virtual bool isConditional();
  226. virtual bool isFixedSize() { return false; }
  227. virtual IReferenceSelector * getSelector(BuildCtx & ctx, IReferenceSelector * parentSelector);
  228. virtual IHqlExpression * queryParentSelector(IHqlExpression * selector);
  229. virtual IHqlExpression * getRelativeSelf();
  230. virtual unsigned getTotalFixedSize();
  231. virtual unsigned getTotalMinimumSize();
  232. private:
  233. OwnedHqlExpr condition;
  234. bool alwaysPresent;
  235. };
  236. class HQLCPP_API CColumnInfo : public CMemberInfo
  237. {
  238. public:
  239. CColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  240. //AColumnInfo
  241. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  242. virtual void buildSizeOf(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  243. virtual void buildClear(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, int direction);
  244. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  245. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  246. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  247. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  248. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  249. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  250. virtual void setRow(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IReferenceSelector * value) { throwUnexpected(); }
  251. //Virtuals for column implementation
  252. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  253. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  254. virtual bool isFixedSize();
  255. virtual void gatherSize(SizeStruct & target);
  256. protected:
  257. virtual ITypeInfo * queryLogicalType() { return queryType(); }
  258. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  259. virtual void calcCurrentOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  260. void buildDeserializeToBuilder(HqlCppTranslator & translator, BuildCtx & ctx, IHqlCppDatasetBuilder * builder, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  261. virtual void buildDeserializeChildLoop(HqlCppTranslator & translator, BuildCtx & loopctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  262. };
  263. class HQLCPP_API CSpecialIntColumnInfo : public CColumnInfo
  264. {
  265. public:
  266. CSpecialIntColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  267. //AColumnInfo
  268. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  269. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  270. };
  271. class HQLCPP_API CPackedIntColumnInfo : public CColumnInfo
  272. {
  273. public:
  274. CPackedIntColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  275. //AColumnInfo
  276. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  277. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  278. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  279. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  280. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  281. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  282. virtual void gatherSize(SizeStruct & target);
  283. virtual bool isFixedSize() { return false; }
  284. };
  285. class HQLCPP_API CSpecialStringColumnInfo : public CColumnInfo
  286. {
  287. public:
  288. CSpecialStringColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  289. //AColumnInfo
  290. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  291. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  292. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  293. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  294. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  295. virtual void gatherSize(SizeStruct & target);
  296. };
  297. class HQLCPP_API CSpecialVStringColumnInfo : public CColumnInfo
  298. {
  299. public:
  300. CSpecialVStringColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  301. //AColumnInfo
  302. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  303. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  304. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  305. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  306. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  307. virtual void gatherSize(SizeStruct & target);
  308. };
  309. class HQLCPP_API CAlienColumnInfo : public CColumnInfo
  310. {
  311. public:
  312. CAlienColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  313. //AColumnInfo
  314. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  315. //Virtuals for column implementation
  316. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  317. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  318. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  319. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  320. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  321. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  322. virtual bool isFixedSize();
  323. virtual void gatherSize(SizeStruct & target);
  324. protected:
  325. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  326. virtual ITypeInfo * queryPhysicalType();
  327. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  328. protected:
  329. IHqlExpression * doBuildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper);
  330. IHqlExpression * getAlienGetFunction(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  331. ITypeInfo * getPhysicalSourceType();
  332. unsigned getPhysicalSize();
  333. protected:
  334. OwnedHqlExpr self; // expression that represents self - different if nested.
  335. };
  336. class HQLCPP_API CBitfieldContainerInfo : public CContainerInfo
  337. {
  338. public:
  339. CBitfieldContainerInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  340. //AColumnInfo
  341. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  342. virtual void buildClear(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, int direction);
  343. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  344. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  345. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  346. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  347. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  348. virtual IHqlExpression * getRelativeSelf();
  349. virtual IReferenceSelector * getSelector(BuildCtx & ctx, IReferenceSelector * parentSelector);
  350. virtual void noteLastBitfield();
  351. virtual IHqlExpression * queryParentSelector(IHqlExpression * selector);
  352. public:
  353. CMemberInfo * lastBitfield();
  354. ITypeInfo * queryStorageType() const { return column->queryType(); }
  355. protected:
  356. virtual void gatherSize(SizeStruct & target);
  357. virtual bool isFixedSize();
  358. };
  359. class HQLCPP_API CBitfieldInfo : public CColumnInfo
  360. {
  361. public:
  362. CBitfieldInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  363. //AColumnInfo
  364. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  365. //column implementation
  366. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  367. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  368. virtual void gatherSize(SizeStruct & target);
  369. virtual bool isFixedSize();
  370. //public helper functions
  371. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  372. ITypeInfo * queryStorageType() { return ((CBitfieldContainerInfo *)container)->queryStorageType(); }
  373. void noteLastBitfield() { isLastBitfield = true; }
  374. void setBitOffset(unsigned _bitOffset);
  375. inline bool queryIsLastBitfield() const { return isLastBitfield; }
  376. inline unsigned queryBitfieldOffset() const { return bitOffset; }
  377. unsigned queryBitfieldPackSize() const;
  378. private:
  379. unsigned bitOffset;
  380. bool isLastBitfield;
  381. };
  382. class HQLCPP_API CRowReferenceColumnInfo : public CColumnInfo
  383. {
  384. public:
  385. CRowReferenceColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column)
  386. : CColumnInfo(_container, _prior, _column)
  387. {
  388. }
  389. //AColumnInfo
  390. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  391. virtual void gatherSize(SizeStruct & target);
  392. virtual bool isFixedSize() { return true; }
  393. };
  394. class HQLCPP_API CVirtualColumnInfo : public CColumnInfo
  395. {
  396. public:
  397. CVirtualColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  398. //AColumnInfo
  399. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  400. //Virtuals for column implementation
  401. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  402. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  403. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  404. virtual bool isFixedSize();
  405. virtual void gatherSize(SizeStruct & target);
  406. protected:
  407. virtual void calcCurrentOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector) {}
  408. };
  409. class HQLCPP_API CCsvColumnInfo : public CColumnInfo
  410. {
  411. public:
  412. CCsvColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, IAtom * _encoding);
  413. //AColumnInfo
  414. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  415. //Virtuals for column implementation
  416. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  417. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  418. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  419. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  420. virtual bool isFixedSize();
  421. virtual void gatherSize(SizeStruct & target);
  422. protected:
  423. void getName(HqlCppTranslator & translator, BuildCtx & ctx, StringBuffer & out, const char * prefix, IReferenceSelector * selector);
  424. IHqlExpression * getColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  425. protected:
  426. IAtom * encoding;
  427. };
  428. class HQLCPP_API CXmlColumnInfo : public CColumnInfo
  429. {
  430. public:
  431. CXmlColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  432. //AColumnInfo
  433. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  434. //Virtuals for column implementation
  435. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  436. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  437. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  438. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  439. virtual bool isFixedSize();
  440. virtual void gatherSize(SizeStruct & target);
  441. protected:
  442. virtual void calcCurrentOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector) {}
  443. void buildFixedStringAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target, IHqlExpression * defaultValue, IIdAtom * func);
  444. IHqlExpression * getCallExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  445. IHqlExpression * getXmlDatasetExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  446. IHqlExpression * getXmlSetExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  447. };
  448. //---------------------------------------------------------------------------
  449. enum MapFormat { MapFormatBinary, MapFormatCsv, MapFormatXml };
  450. class HQLCPP_API ColumnToOffsetMap : public MappingBase
  451. {
  452. public:
  453. ColumnToOffsetMap(IHqlExpression * _key, IHqlExpression * record, unsigned _id, unsigned _packing, unsigned _maxRecordSize, bool _translateVirtuals, bool _useAccessClass);
  454. virtual const void * getKey() const { return &key; }
  455. void init(RecordOffsetMap & map);
  456. unsigned getFixedRecordSize();
  457. bool isFixedWidth() const { return fixedSizeRecord; }
  458. unsigned getMaxSize();
  459. bool isMaxSizeSpecified();
  460. unsigned numRootFields() const { return root.numChildren(); }
  461. size32_t getTotalFixedSize() { return root.getTotalFixedSize(); }
  462. size32_t getTotalMinimumSize() { return root.getTotalMinimumSize(); }
  463. virtual MapFormat getFormat() { return MapFormatBinary; }
  464. bool queryContainsIfBlock() { return containsIfBlock; }
  465. IHqlExpression * queryRecord() const { return record; }
  466. unsigned queryId() const { return id; }
  467. bool usesAccessor() const { return root.usesAccessClass(); }
  468. AColumnInfo * queryRootColumn();
  469. bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper);
  470. void buildAccessor(StringBuffer & accessorName, HqlCppTranslator & translator, BuildCtx & declarectx, IHqlExpression * selector);
  471. protected:
  472. virtual CMemberInfo * addColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map, bool isPayload);
  473. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map, bool isPayload);
  474. CMemberInfo * expandRecord(IHqlExpression * record, CContainerInfo * container, RecordOffsetMap & map, unsigned payloadFields);
  475. void completeActiveBitfields();
  476. void ensureMaxSizeCached();
  477. protected:
  478. unsigned id;
  479. LinkedHqlExpr key;
  480. IHqlExpression * record;
  481. CMemberInfo * prior;
  482. BitfieldPacker packer;
  483. unsigned maxAlign;
  484. unsigned packing;
  485. unsigned defaultMaxRecordSize;
  486. unsigned cachedMaxSize;
  487. unsigned payloadCount = 0;
  488. bool cachedDefaultMaxSizeUsed;
  489. bool fixedSizeRecord;
  490. bool translateVirtuals;
  491. bool containsIfBlock;
  492. CRecordInfo root;
  493. };
  494. class HQLCPP_API DynamicColumnToOffsetMap : public ColumnToOffsetMap
  495. {
  496. public:
  497. DynamicColumnToOffsetMap(unsigned _maxRecordSize);
  498. void addColumn(IHqlExpression * column, RecordOffsetMap & map);
  499. };
  500. class DelayedSizeGenerator : public IHqlDelayedCodeGenerator, public CInterface
  501. {
  502. public:
  503. DelayedSizeGenerator(ColumnToOffsetMap * _map)
  504. {
  505. map.set(_map);
  506. }
  507. IMPLEMENT_IINTERFACE
  508. //IHqlDelayedCodeGenerator
  509. virtual void generateCpp(StringBuffer & out) { out.append(map->getTotalFixedSize()); }
  510. public:
  511. Owned<ColumnToOffsetMap> map;
  512. };
  513. class DelayedUnsignedGenerator : public IHqlDelayedCodeGenerator, public CInterface
  514. {
  515. public:
  516. DelayedUnsignedGenerator(unsigned & _value)
  517. {
  518. value = &_value;
  519. }
  520. IMPLEMENT_IINTERFACE
  521. //IHqlDelayedCodeGenerator
  522. virtual void generateCpp(StringBuffer & out) { out.append(*value); }
  523. public:
  524. unsigned * value;
  525. };
  526. class HQLCPP_API CsvColumnToOffsetMap : public ColumnToOffsetMap
  527. {
  528. public:
  529. CsvColumnToOffsetMap(IHqlExpression * record, unsigned _maxRecordSize, bool _translateVirtuals, IAtom * _encoding);
  530. virtual MapFormat getFormat() override { return MapFormatCsv; }
  531. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map, bool isPayload) override;
  532. protected:
  533. IAtom * encoding;
  534. };
  535. class HQLCPP_API XmlColumnToOffsetMap : public ColumnToOffsetMap
  536. {
  537. public:
  538. XmlColumnToOffsetMap(IHqlExpression * record, unsigned _maxRecordSize, bool _translateVirtuals);
  539. virtual MapFormat getFormat() { return MapFormatXml; }
  540. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map, bool isPayload) override;
  541. };
  542. //---------------------------------------------------------------------------
  543. class HQLCPP_API CChildSetColumnInfo : public CColumnInfo
  544. {
  545. public:
  546. CChildSetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  547. //AColumnInfo
  548. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  549. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  550. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  551. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  552. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  553. virtual void gatherSize(SizeStruct & target);
  554. };
  555. class HQLCPP_API CChildDatasetColumnInfo : public CColumnInfo
  556. {
  557. public:
  558. CChildDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  559. //AColumnInfo
  560. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  561. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  562. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  563. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  564. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  565. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  566. virtual void gatherSize(SizeStruct & target);
  567. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  568. protected:
  569. unsigned maxChildSize;
  570. };
  571. class HQLCPP_API CChildLimitedDatasetColumnInfo : public CColumnInfo
  572. {
  573. public:
  574. CChildLimitedDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  575. //AColumnInfo
  576. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  577. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  578. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  579. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  580. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  581. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  582. virtual void gatherSize(SizeStruct & target);
  583. virtual bool isFixedSize();
  584. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  585. protected:
  586. void setColumnFromBuilder(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlCppDatasetBuilder * builder);
  587. virtual void buildDeserializeChildLoop(HqlCppTranslator & translator, BuildCtx & loopctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  588. protected:
  589. OwnedHqlExpr countField;
  590. OwnedHqlExpr sizeField;
  591. unsigned fixedChildSize;
  592. unsigned maxChildSize;
  593. };
  594. class HQLCPP_API CChildLinkedDatasetColumnInfo : public CColumnInfo
  595. {
  596. public:
  597. CChildLinkedDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  598. //AColumnInfo
  599. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  600. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  601. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  602. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  603. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  604. virtual bool modifyColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value, node_operator op);
  605. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  606. virtual void gatherSize(SizeStruct & target);
  607. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  608. virtual bool isFixedSize() { return true; }
  609. protected:
  610. unsigned maxChildSize;
  611. };
  612. void ensureSimpleLength(HqlCppTranslator & translator, BuildCtx & ctx, CHqlBoundExpr & bound);
  613. void callDeserializeGetN(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * boundSize, IHqlExpression * address);
  614. IHqlExpression * callDeserializerGetSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper);
  615. void callDeserializerSkipInputSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * size);
  616. void callDeserializerSkipInputTranslatedSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * size);
  617. struct HQLCPP_API HqlStmtExprAssociation : public HqlExprAssociation
  618. {
  619. public:
  620. HqlStmtExprAssociation(IHqlExpression * _represents, IHqlStmt * _stmt) :
  621. HqlExprAssociation(_represents), stmt(_stmt) {}
  622. virtual AssocKind getKind() { return AssocStmt; }
  623. public:
  624. IHqlStmt * stmt;
  625. };
  626. #endif