hqltcppc.ipp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  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);
  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 AColumnInfo * lookupColumn(IHqlExpression * search);
  66. virtual bool requiresTemp();
  67. //null implementation
  68. virtual bool isConditional();
  69. // implementation virtuals
  70. virtual void calcAllCachedOffsets();
  71. void calcCachedOffsets(const SizeStruct & offset, SizeStruct & sizeSelf);
  72. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  73. virtual IHqlExpression * createSelectorExpr();
  74. virtual void gatherSize(SizeStruct & target);
  75. void gatherOffset(SizeStruct & target, IHqlExpression * selector);
  76. void getSizeExpr(SizeStruct & target);
  77. virtual IReferenceSelector * getSelector(BuildCtx & ctx, IReferenceSelector * parentSelector);
  78. virtual void noteLastBitfield() {}
  79. virtual IHqlExpression * queryParentSelector(IHqlExpression * selector);
  80. virtual IHqlExpression * queryRootSelf();
  81. virtual ITypeInfo * queryType() const;
  82. virtual unsigned getTotalFixedSize();
  83. virtual unsigned getTotalMinimumSize();
  84. virtual unsigned getContainerTrailingFixed();
  85. virtual bool modifyColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value, node_operator op) { return false; }
  86. virtual bool checkCompatibleIfBlock(HqlExprCopyArray & conditions);
  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 IArrayOf<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, IAtom * serializeForm);
  148. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  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(const SizeStruct & startOffset, SizeStruct & sizeSelf);
  173. protected:
  174. CMemberInfoArray children;
  175. bool fixedSize;
  176. bool isDynamic;
  177. };
  178. class HQLCPP_API CRecordInfo : public CContainerInfo
  179. {
  180. public:
  181. CRecordInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  182. //AColumnInfo
  183. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  184. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  185. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  186. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  187. virtual IHqlExpression * getRelativeSelf();
  188. virtual IHqlExpression * queryRootSelf();
  189. protected:
  190. virtual void registerChild(CMemberInfo * child);
  191. protected:
  192. ColumnToInfoMap map;
  193. OwnedHqlExpr cachedSelf;
  194. };
  195. class HQLCPP_API CIfBlockInfo : public CContainerInfo
  196. {
  197. public:
  198. CIfBlockInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  199. //AColumnInfo
  200. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  201. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  202. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  203. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  204. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  205. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  206. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  207. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  208. virtual bool checkCompatibleIfBlock(HqlExprCopyArray & conditions);
  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, IAtom * serializeForm);
  231. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  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, IAtom * serializeForm);
  246. virtual void buildDeserializeChildLoop(HqlCppTranslator & translator, BuildCtx & loopctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  247. };
  248. class HQLCPP_API CSpecialIntColumnInfo : public CColumnInfo
  249. {
  250. public:
  251. CSpecialIntColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  252. //AColumnInfo
  253. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  254. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  255. };
  256. class HQLCPP_API CPackedIntColumnInfo : public CColumnInfo
  257. {
  258. public:
  259. CPackedIntColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  260. //AColumnInfo
  261. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  262. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  263. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  264. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  265. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  266. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  267. virtual void gatherSize(SizeStruct & target);
  268. virtual bool isFixedSize() { return false; }
  269. };
  270. class HQLCPP_API CSpecialStringColumnInfo : public CColumnInfo
  271. {
  272. public:
  273. CSpecialStringColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  274. //AColumnInfo
  275. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  276. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  277. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  278. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  279. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  280. virtual void gatherSize(SizeStruct & target);
  281. };
  282. class HQLCPP_API CSpecialVStringColumnInfo : public CColumnInfo
  283. {
  284. public:
  285. CSpecialVStringColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  286. //AColumnInfo
  287. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  288. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  289. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  290. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  291. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  292. virtual void gatherSize(SizeStruct & target);
  293. };
  294. class HQLCPP_API CAlienColumnInfo : public CColumnInfo
  295. {
  296. public:
  297. CAlienColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  298. //AColumnInfo
  299. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  300. //Virtuals for column implementation
  301. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  302. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  303. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  304. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  305. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  306. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  307. virtual bool isFixedSize();
  308. virtual void gatherSize(SizeStruct & target);
  309. protected:
  310. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  311. virtual ITypeInfo * queryPhysicalType();
  312. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  313. protected:
  314. IHqlExpression * doBuildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper);
  315. IHqlExpression * getAlienGetFunction(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  316. ITypeInfo * getPhysicalSourceType();
  317. unsigned getPhysicalSize();
  318. protected:
  319. OwnedHqlExpr self; // expression that represents self - different if nested.
  320. };
  321. class HQLCPP_API CBitfieldContainerInfo : public CContainerInfo
  322. {
  323. public:
  324. CBitfieldContainerInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  325. //AColumnInfo
  326. virtual void buildAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  327. virtual void buildClear(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, int direction);
  328. virtual void buildExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  329. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  330. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  331. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  332. virtual void calcCachedSize(const SizeStruct & offset, SizeStruct & sizeSelf);
  333. virtual IHqlExpression * getRelativeSelf();
  334. virtual IReferenceSelector * getSelector(BuildCtx & ctx, IReferenceSelector * parentSelector);
  335. virtual void noteLastBitfield();
  336. virtual IHqlExpression * queryParentSelector(IHqlExpression * selector);
  337. public:
  338. CMemberInfo * lastBitfield();
  339. ITypeInfo * queryStorageType() const { return column->queryType(); }
  340. protected:
  341. virtual void gatherSize(SizeStruct & target);
  342. virtual bool isFixedSize();
  343. };
  344. class HQLCPP_API CBitfieldInfo : public CColumnInfo
  345. {
  346. public:
  347. CBitfieldInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  348. //AColumnInfo
  349. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  350. //column implementation
  351. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  352. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  353. virtual void gatherSize(SizeStruct & target);
  354. virtual bool isFixedSize();
  355. //public helper functions
  356. virtual ITypeInfo * queryLogicalType() { return queryType()->queryPromotedType(); }
  357. ITypeInfo * queryStorageType() { return ((CBitfieldContainerInfo *)container)->queryStorageType(); }
  358. void noteLastBitfield() { isLastBitfield = true; }
  359. void setBitOffset(unsigned _bitOffset);
  360. inline bool queryIsLastBitfield() const { return isLastBitfield; }
  361. inline unsigned queryBitfieldOffset() const { return bitOffset; }
  362. unsigned queryBitfieldPackSize() const;
  363. private:
  364. unsigned bitOffset;
  365. bool isLastBitfield;
  366. };
  367. class HQLCPP_API CRowReferenceColumnInfo : public CColumnInfo
  368. {
  369. public:
  370. CRowReferenceColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column)
  371. : CColumnInfo(_container, _prior, _column)
  372. {
  373. }
  374. //AColumnInfo
  375. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  376. virtual void gatherSize(SizeStruct & target);
  377. virtual bool isFixedSize() { return true; }
  378. };
  379. class HQLCPP_API CVirtualColumnInfo : public CColumnInfo
  380. {
  381. public:
  382. CVirtualColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  383. //AColumnInfo
  384. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  385. //Virtuals for column implementation
  386. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  387. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  388. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  389. virtual bool isFixedSize();
  390. virtual void gatherSize(SizeStruct & target);
  391. protected:
  392. virtual void calcCurrentOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector) {}
  393. };
  394. class HQLCPP_API CCsvColumnInfo : public CColumnInfo
  395. {
  396. public:
  397. CCsvColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, IAtom * _encoding);
  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 buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  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. void getName(HqlCppTranslator & translator, BuildCtx & ctx, StringBuffer & out, const char * prefix, IReferenceSelector * selector);
  409. IHqlExpression * getColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  410. protected:
  411. IAtom * encoding;
  412. };
  413. class HQLCPP_API CXmlColumnInfo : public CColumnInfo
  414. {
  415. public:
  416. CXmlColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  417. //AColumnInfo
  418. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  419. //Virtuals for column implementation
  420. virtual void buildAddress(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound);
  421. virtual void buildColumnAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target);
  422. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  423. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  424. virtual bool isFixedSize();
  425. virtual void gatherSize(SizeStruct & target);
  426. protected:
  427. virtual void calcCurrentOffset(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector) {}
  428. void buildFixedStringAssign(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, const CHqlBoundTarget & target, IHqlExpression * defaultValue, IIdAtom * func);
  429. IHqlExpression * getCallExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  430. IHqlExpression * getXmlDatasetExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  431. IHqlExpression * getXmlSetExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  432. };
  433. //---------------------------------------------------------------------------
  434. enum MapFormat { MapFormatBinary, MapFormatCsv, MapFormatXml };
  435. class HQLCPP_API ColumnToOffsetMap : public MappingBase
  436. {
  437. public:
  438. ColumnToOffsetMap(IHqlExpression * record, unsigned _packing, unsigned _maxRecordSize, bool _translateVirtuals);
  439. virtual const void * getKey() const { return &record; }
  440. void init(RecordOffsetMap & map);
  441. unsigned getFixedRecordSize();
  442. bool isFixedWidth() const { return fixedSizeRecord; }
  443. unsigned getMaxSize();
  444. bool isMaxSizeSpecified();
  445. unsigned numRootFields() const { return root.numChildren(); }
  446. size32_t getTotalFixedSize() { return root.getTotalFixedSize(); }
  447. size32_t getTotalMinimumSize() { return root.getTotalMinimumSize(); }
  448. virtual MapFormat getFormat() { return MapFormatBinary; }
  449. bool queryContainsIfBlock() { return containsIfBlock; }
  450. AColumnInfo * queryRootColumn();
  451. bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper);
  452. protected:
  453. virtual CMemberInfo * addColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map);
  454. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map);
  455. CMemberInfo * expandRecord(IHqlExpression * record, CContainerInfo * container, RecordOffsetMap & map);
  456. void completeActiveBitfields();
  457. void ensureMaxSizeCached();
  458. protected:
  459. IHqlExpression * record;
  460. CMemberInfo * prior;
  461. BitfieldPacker packer;
  462. unsigned maxAlign;
  463. unsigned packing;
  464. unsigned defaultMaxRecordSize;
  465. unsigned cachedMaxSize;
  466. bool cachedDefaultMaxSizeUsed;
  467. bool fixedSizeRecord;
  468. bool translateVirtuals;
  469. bool containsIfBlock;
  470. CRecordInfo root;
  471. };
  472. class HQLCPP_API DynamicColumnToOffsetMap : public ColumnToOffsetMap
  473. {
  474. public:
  475. DynamicColumnToOffsetMap(unsigned _maxRecordSize);
  476. void addColumn(IHqlExpression * column, RecordOffsetMap & map);
  477. };
  478. class DelayedSizeGenerator : public IHqlDelayedCodeGenerator, public CInterface
  479. {
  480. public:
  481. DelayedSizeGenerator(ColumnToOffsetMap * _map)
  482. {
  483. map.set(_map);
  484. }
  485. IMPLEMENT_IINTERFACE
  486. //IHqlDelayedCodeGenerator
  487. virtual void generateCpp(StringBuffer & out) { out.append(map->getTotalFixedSize()); }
  488. public:
  489. Owned<ColumnToOffsetMap> map;
  490. };
  491. class DelayedUnsignedGenerator : public IHqlDelayedCodeGenerator, public CInterface
  492. {
  493. public:
  494. DelayedUnsignedGenerator(unsigned & _value)
  495. {
  496. value = &_value;
  497. }
  498. IMPLEMENT_IINTERFACE
  499. //IHqlDelayedCodeGenerator
  500. virtual void generateCpp(StringBuffer & out) { out.append(*value); }
  501. public:
  502. unsigned * value;
  503. };
  504. class HQLCPP_API CsvColumnToOffsetMap : public ColumnToOffsetMap
  505. {
  506. public:
  507. CsvColumnToOffsetMap(IHqlExpression * record, unsigned _maxRecordSize, bool _translateVirtuals, IAtom * _encoding);
  508. virtual MapFormat getFormat() { return MapFormatCsv; }
  509. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map);
  510. protected:
  511. IAtom * encoding;
  512. };
  513. class HQLCPP_API XmlColumnToOffsetMap : public ColumnToOffsetMap
  514. {
  515. public:
  516. XmlColumnToOffsetMap(IHqlExpression * record, unsigned _maxRecordSize, bool _translateVirtuals);
  517. virtual MapFormat getFormat() { return MapFormatXml; }
  518. virtual CMemberInfo * createColumn(CContainerInfo * container, IHqlExpression * column, RecordOffsetMap & map);
  519. };
  520. //---------------------------------------------------------------------------
  521. class HQLCPP_API CChildSetColumnInfo : public CColumnInfo
  522. {
  523. public:
  524. CChildSetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column);
  525. //AColumnInfo
  526. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  527. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  528. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  529. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  530. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  531. virtual void gatherSize(SizeStruct & target);
  532. };
  533. class HQLCPP_API CChildDatasetColumnInfo : public CColumnInfo
  534. {
  535. public:
  536. CChildDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  537. //AColumnInfo
  538. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  539. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  540. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  541. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  542. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  543. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  544. virtual void gatherSize(SizeStruct & target);
  545. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  546. protected:
  547. unsigned maxChildSize;
  548. };
  549. class HQLCPP_API CChildLimitedDatasetColumnInfo : public CColumnInfo
  550. {
  551. public:
  552. CChildLimitedDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  553. //AColumnInfo
  554. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  555. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  556. virtual bool prepareReadAhead(HqlCppTranslator & translator, ReadAheadState & state);
  557. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  558. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  559. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  560. virtual void gatherSize(SizeStruct & target);
  561. virtual bool isFixedSize();
  562. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  563. protected:
  564. void setColumnFromBuilder(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlCppDatasetBuilder * builder);
  565. virtual void buildDeserializeChildLoop(HqlCppTranslator & translator, BuildCtx & loopctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  566. protected:
  567. OwnedHqlExpr countField;
  568. OwnedHqlExpr sizeField;
  569. unsigned fixedChildSize;
  570. unsigned maxChildSize;
  571. };
  572. class HQLCPP_API CChildLinkedDatasetColumnInfo : public CColumnInfo
  573. {
  574. public:
  575. CChildLinkedDatasetColumnInfo(CContainerInfo * _container, CMemberInfo * _prior, IHqlExpression * _column, RecordOffsetMap & map, unsigned defaultMaxRecordSize);
  576. //AColumnInfo
  577. virtual void buildColumnExpr(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, CHqlBoundExpr & bound); // get() after conditions.
  578. virtual void buildDeserialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  579. virtual void buildSerialize(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * helper, IAtom * serializeForm);
  580. virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state);
  581. virtual IHqlExpression * buildSizeOfUnbound(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector);
  582. virtual bool modifyColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value, node_operator op);
  583. virtual void setColumn(HqlCppTranslator & translator, BuildCtx & ctx, IReferenceSelector * selector, IHqlExpression * value);
  584. virtual void gatherSize(SizeStruct & target);
  585. virtual AColumnInfo * lookupColumn(IHqlExpression * search);
  586. virtual bool isFixedSize() { return true; }
  587. protected:
  588. unsigned maxChildSize;
  589. };
  590. void ensureSimpleLength(HqlCppTranslator & translator, BuildCtx & ctx, CHqlBoundExpr & bound);
  591. void callDeserializeGetN(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * boundSize, IHqlExpression * address);
  592. IHqlExpression * callDeserializerGetSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper);
  593. void callDeserializerSkipInputSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * size);
  594. void callDeserializerSkipInputTranslatedSize(HqlCppTranslator & translator, BuildCtx & ctx, IHqlExpression * helper, IHqlExpression * size);
  595. struct HQLCPP_API HqlStmtExprAssociation : public HqlExprAssociation
  596. {
  597. public:
  598. HqlStmtExprAssociation(IHqlExpression * _represents, IHqlStmt * _stmt) :
  599. HqlExprAssociation(_represents), stmt(_stmt) {}
  600. virtual AssocKind getKind() { return AssocStmt; }
  601. public:
  602. IHqlStmt * stmt;
  603. };
  604. #endif