hqltcppc.ipp 40 KB

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