hqltcppc.ipp 37 KB

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