hqlttcpp.ipp 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178
  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 __HQLTTCPP_IPP_
  15. #define __HQLTTCPP_IPP_
  16. #include "hqlcpp.hpp"
  17. #include "hqlcpp.ipp"
  18. #include "hqlhtcpp.ipp"
  19. #include "hqltrans.ipp"
  20. //---------------------------------------------------------------------------
  21. class NewThorStoredReplacer : public QuickHqlTransformer
  22. {
  23. public:
  24. NewThorStoredReplacer(HqlCppTranslator & _translator, IWorkUnit * _wu, ICodegenContextCallback * _logger);
  25. virtual void doAnalyseBody(IHqlExpression * expr);
  26. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  27. bool needToTransform();
  28. protected:
  29. HqlCppTranslator & translator;
  30. IWorkUnit * wu;
  31. ICodegenContextCallback * ctxCallback;
  32. HqlExprArray commands;
  33. HqlExprArray storedNames;
  34. HqlExprArray storedValues;
  35. HqlExprCopyArray activeReplacements;
  36. BoolArray storedIsConstant;
  37. bool foldStored;
  38. bool seenMeta;
  39. };
  40. //---------------------------------------------------------------------------
  41. enum YesNoOption { OptionUnknown, OptionNo, OptionMaybe, OptionSome, OptionYes }; //NB: last 3 IN ascending order of definiteness.
  42. class HqlThorBoundaryInfo : public NewTransformInfo
  43. {
  44. public:
  45. HqlThorBoundaryInfo(IHqlExpression * _original) : NewTransformInfo(_original) { normalize = OptionUnknown; }
  46. public:
  47. YesNoOption normalize;
  48. };
  49. class HqlThorBoundaryTransformer : public NewHqlTransformer
  50. {
  51. public:
  52. HqlThorBoundaryTransformer(IConstWorkUnit * wu, bool _isRoxie, unsigned _maxRootMaybes, bool _resourceConditionalActions, bool _resourceSequential);
  53. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  54. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(HqlThorBoundaryInfo, expr); }
  55. inline HqlThorBoundaryInfo * queryBodyExtra(IHqlExpression * expr) { return static_cast<HqlThorBoundaryInfo *>(queryTransformExtra(expr->queryBody())); }
  56. void transformRoot(const HqlExprArray & in, HqlExprArray & out);
  57. protected:
  58. void transformCompound(HqlExprArray & result, node_operator compoundOp, const HqlExprArray & args, unsigned MaxMaybes);
  59. protected:
  60. YesNoOption calcNormalizeThor(IHqlExpression * expr);
  61. YesNoOption normalizeThor(IHqlExpression * expr);
  62. protected:
  63. IConstWorkUnit * wu;
  64. unsigned maxRootMaybes;
  65. bool isRoxie;
  66. bool resourceConditionalActions;
  67. bool resourceSequential;
  68. };
  69. //---------------------------------------------------------------------------
  70. class ThorScalarInfo : public HoistingTransformInfo
  71. {
  72. public:
  73. ThorScalarInfo(IHqlExpression * _original) : HoistingTransformInfo(_original) { }
  74. public:
  75. HqlExprAttr transformed[2];
  76. HqlExprAttr transformedSelector[2];
  77. };
  78. class ThorScalarTransformer : public HoistingHqlTransformer
  79. {
  80. public:
  81. ThorScalarTransformer(const HqlCppOptions & _options);
  82. virtual void doAnalyseExpr(IHqlExpression * expr);
  83. IHqlExpression * createTransformed(IHqlExpression * expr);
  84. inline bool needToTransform() { return seenCandidate || containsUnknownIndependentContents; }
  85. protected:
  86. void createHoisted(IHqlExpression * expr, SharedHqlExpr & setResultStmt, SharedHqlExpr & getResult, bool addWrapper);
  87. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(ThorScalarInfo, expr); }
  88. virtual IHqlExpression * queryAlreadyTransformed(IHqlExpression * expr);
  89. virtual IHqlExpression * queryAlreadyTransformedSelector(IHqlExpression * expr);
  90. virtual void setTransformed(IHqlExpression * expr, IHqlExpression * transformed);
  91. virtual void setTransformedSelector(IHqlExpression * expr, IHqlExpression * transformed);
  92. virtual IHqlExpression * doTransformIndependent(IHqlExpression * expr)
  93. {
  94. ThorScalarTransformer nested(options);
  95. nested.setParent(this);
  96. nested.analyse(expr, 0);
  97. if (nested.needToTransform())
  98. return nested.transformRoot(expr);
  99. return LINK(expr);
  100. }
  101. //This is unusual that it is queryExtra() instead of queryBodyExtra() - since it is used to store the transformed
  102. //values, not any extra information.
  103. inline ThorScalarInfo * queryExtra(IHqlExpression * expr) { return static_cast<ThorScalarInfo *>(queryTransformExtra(expr)); }
  104. inline bool isConditional() { return isConditionalDepth != 0; }
  105. protected:
  106. const HqlCppOptions & options;
  107. unsigned isConditionalDepth;
  108. bool seenCandidate;
  109. };
  110. //---------------------------------------------------------------------------
  111. class SequenceNumberInfo : public NewTransformInfo
  112. {
  113. public:
  114. SequenceNumberInfo(IHqlExpression * expr) : NewTransformInfo(expr), getsSequence(false) {}
  115. void setGetsSequence() { getsSequence = true; }
  116. virtual IHqlExpression * queryTransformed() { if(getsSequence) return NULL; else return NewTransformInfo::queryTransformed(); } //must transform again if expression takes sequence number, as require different sequence number each time
  117. private:
  118. bool getsSequence;
  119. };
  120. class SequenceNumberAllocator : public NewHqlTransformer
  121. {
  122. public:
  123. SequenceNumberAllocator();
  124. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  125. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(SequenceNumberInfo, expr); }
  126. //queryExtra() instead of queryBodyExtra() because it is used to modify how queryTransform() acts.
  127. //NOTE: I'm not sure this really works e.g., if the transformed expression is a sequence list.
  128. SequenceNumberInfo * queryExtra(IHqlExpression * expr) { return dynamic_cast<SequenceNumberInfo *>(queryTransformExtra(expr)); }
  129. unsigned getMaxSequence() { return sequence; }
  130. protected:
  131. void nextSequence(HqlExprArray & args, IHqlExpression * name, _ATOM overwriteAction, IHqlExpression * value, bool needAttr, bool * duplicate);
  132. virtual IHqlExpression * doTransformRootExpr(IHqlExpression * expr);
  133. IHqlExpression * attachSequenceNumber(IHqlExpression * expr);
  134. protected:
  135. unsigned sequence;
  136. MapOwnedHqlToOwnedHql namedMap;
  137. };
  138. //---------------------------------------------------------------------------
  139. class ThorHqlTransformer : public NewHqlTransformer
  140. {
  141. public:
  142. ThorHqlTransformer(HqlCppTranslator & _translator, ClusterType _targetClusterType, IConstWorkUnit * _wu);
  143. protected:
  144. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  145. protected:
  146. IHqlExpression * getMergeTransform(IHqlExpression * dataset, IHqlExpression * transform);
  147. IHqlExpression * normalizeChooseN(IHqlExpression * expr);
  148. IHqlExpression * normalizeCoGroup(IHqlExpression * expr);
  149. IHqlExpression * normalizeDedup(IHqlExpression * expr);
  150. // IHqlExpression * normalizeIndexBuild(IHqlExpression * expr);
  151. IHqlExpression * normalizeGroup(IHqlExpression * expr);
  152. IHqlExpression * normalizeJoinOrDenormalize(IHqlExpression * expr);
  153. IHqlExpression * normalizeTableToAggregate(IHqlExpression * expr, bool canOptimizeCasts);
  154. IHqlExpression * normalizeTableGrouping(IHqlExpression * expr);
  155. IHqlExpression * normalizeMergeAggregate(IHqlExpression * expr);
  156. IHqlExpression * normalizePrefetchAggregate(IHqlExpression * expr);
  157. IHqlExpression * normalizeRollup(IHqlExpression * expr);
  158. IHqlExpression * normalizeScalarAggregate(IHqlExpression * expr);
  159. IHqlExpression * normalizeSelect(IHqlExpression * expr);
  160. IHqlExpression * normalizeShuffle(IHqlExpression * expr);
  161. IHqlExpression * normalizeSort(IHqlExpression * expr);
  162. IHqlExpression * normalizeSortSteppedIndex(IHqlExpression * expr, _ATOM attrName);
  163. IHqlExpression * normalizeTempTable(IHqlExpression * expr);
  164. IHqlExpression * skipGroupsWithinGroup(IHqlExpression * expr, bool isLocal);
  165. IHqlExpression * skipOverGroups(IHqlExpression * dataset, bool isLocal);
  166. protected:
  167. typedef NewHqlTransformer PARENT;
  168. HqlCppTranslator & translator;
  169. const HqlCppOptions & options;
  170. ClusterType targetClusterType;
  171. unsigned topNlimit;
  172. bool groupAllDistribute;
  173. };
  174. //---------------------------------------------------------------------------
  175. class CompoundSourceInfo : public NewTransformInfo
  176. {
  177. public:
  178. CompoundSourceInfo(IHqlExpression * _original);
  179. bool canMergeLimit(IHqlExpression * expr, ClusterType targetClusterType) const;
  180. void ensureCompound();
  181. bool isAggregate() const;
  182. inline bool isShared() { return splitCount > 1; }
  183. bool inherit(const CompoundSourceInfo & other, node_operator newSourceOp = no_none);
  184. inline bool isNoteUsageFirst()
  185. {
  186. noteUsage();
  187. return (splitCount == 1);
  188. }
  189. inline void noteUsage() { if (splitCount < 10) splitCount++; }
  190. inline bool isBinary() const { return mode != no_csv && mode != no_xml; }
  191. inline bool hasAnyLimit() const { return isLimited || hasChoosen; }
  192. void reset();
  193. public:
  194. HqlExprAttr uid;
  195. node_operator sourceOp;
  196. node_operator mode;
  197. byte splitCount;
  198. bool forceCompound:1;
  199. bool isBoundary:1;
  200. bool isCloned:1;
  201. bool isLimited:1;
  202. bool hasChoosen:1;
  203. bool hasSkipLimit:1;
  204. bool isPreloaded:1;
  205. bool isFiltered:1;
  206. bool isPostFiltered:1;
  207. bool isCreateRowLimited:1;
  208. };
  209. enum
  210. {
  211. CSFpreload = 0x0001,
  212. CSFindex = 0x0002,
  213. CSFignoreShared = 0x0010,
  214. CSFnewdisk = 0x0020,
  215. CSFnewindex = 0x0040,
  216. CSFnewchild = 0x0080,
  217. CSFnewinline = 0x0100,
  218. CSFcompoundSpill= 0x0200,
  219. };
  220. //MORE: Could remove dependency on insideCompound if it was ok to have compound operators scattered through the
  221. // contents of a compound item. Probably would cause few problems, and would make life simpler
  222. class CompoundSourceTransformer : public NewHqlTransformer
  223. {
  224. public:
  225. CompoundSourceTransformer(HqlCppTranslator & _translator, unsigned _flags);
  226. IHqlExpression * process(IHqlExpression * expr);
  227. virtual void analyseExpr(IHqlExpression * expr);
  228. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  229. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  230. protected:
  231. bool childrenAreShared(IHqlExpression * expr);
  232. bool createCompoundSource(IHqlExpression * expr);
  233. CompoundSourceInfo * queryBodyExtra(IHqlExpression * expr) { return (CompoundSourceInfo *)queryTransformExtra(expr->queryBody()); }
  234. void analyseGatherInfo(IHqlExpression * expr);
  235. void analyseMarkBoundaries(IHqlExpression * expr);
  236. bool needToCloneLimit(IHqlExpression * expr, node_operator sourceOp);
  237. protected:
  238. HqlCppTranslator & translator;
  239. ClusterType targetClusterType;
  240. unsigned flags;
  241. bool insideCompound;
  242. bool candidate;
  243. };
  244. //---------------------------------------------------------------------------
  245. class CompoundActivityTransformer : public NewHqlTransformer
  246. {
  247. public:
  248. CompoundActivityTransformer(ClusterType _targetClusterType);
  249. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  250. protected:
  251. ClusterType targetClusterType;
  252. };
  253. //---------------------------------------------------------------------------
  254. class OptimizeActivityInfo : public NewTransformInfo
  255. {
  256. public:
  257. OptimizeActivityInfo(IHqlExpression * _original) : NewTransformInfo(_original) { setNumUses(0); }
  258. inline bool isShared() { return getNumUses() > 1; }
  259. inline void noteUsed() { setNumUses(getNumUses()+1); }
  260. inline void inherit(const OptimizeActivityInfo * other)
  261. {
  262. setNumUses(getNumUses() + other->getNumUses());
  263. }
  264. private:
  265. inline byte getNumUses() const { return spareByte1; }
  266. inline void setNumUses(unsigned value) { spareByte1 = value < 100 ? value : 100; }
  267. using NewTransformInfo::spareByte1; // used to hold a numUses()
  268. };
  269. //Various activity optimizations which can be done if nodes aren't shared
  270. //sort(ds,x)[n] -> topn(ds,x,n)[n]
  271. //count(x) > n -> count(choosen(x,n+1)) > n
  272. class OptimizeActivityTransformer : public NewHqlTransformer
  273. {
  274. public:
  275. OptimizeActivityTransformer(bool _optimizeCountCompare, bool _optimizeNonEmpty);
  276. virtual void analyseExpr(IHqlExpression * expr);
  277. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  278. protected:
  279. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(OptimizeActivityInfo, expr); }
  280. IHqlExpression * doCreateTransformed(IHqlExpression * expr);
  281. IHqlExpression * insertChoosen(IHqlExpression * lhs, IHqlExpression * limit, __int64 limitDelta);
  282. IHqlExpression * optimizeCompare(IHqlExpression * lhs, IHqlExpression * rhs, node_operator op);
  283. OptimizeActivityInfo * queryBodyExtra(IHqlExpression * expr) { return (OptimizeActivityInfo *)queryTransformExtra(expr->queryBody()); }
  284. inline bool isShared(IHqlExpression * expr) { return queryBodyExtra(expr)->isShared(); }
  285. protected:
  286. bool optimizeCountCompare;
  287. bool optimizeNonEmpty;
  288. };
  289. //---------------------------------------------------------------------------
  290. class WorkflowTransformInfo : public NewTransformInfo
  291. {
  292. public:
  293. WorkflowTransformInfo(IHqlExpression * expr) : NewTransformInfo(expr) { wfid = 0; lastWfid = 0; manyWorkflow = false; firstUseIsConditional = false; }
  294. UnsignedArray const & queryDependencies() const { return dependencies; }
  295. void addDependency(unsigned dep)
  296. {
  297. if (dependencies.find(dep) == NotFound)
  298. dependencies.append(dep);
  299. }
  300. inline bool isCommonUpCandidate() { return manyWorkflow && !firstUseIsConditional; }
  301. inline bool noteWorkflow(unsigned wfid, bool isConditional)
  302. {
  303. if (lastWfid)
  304. {
  305. if (wfid != lastWfid)
  306. {
  307. manyWorkflow = true;
  308. lastWfid = wfid;
  309. }
  310. return true;
  311. }
  312. lastWfid = wfid;
  313. firstUseIsConditional = isConditional;
  314. return false;
  315. }
  316. private:
  317. UnsignedArray dependencies;
  318. unsigned short wfid;
  319. unsigned short lastWfid; // used during analysis
  320. bool firstUseIsConditional;
  321. bool manyWorkflow;
  322. };
  323. class ContingencyData
  324. {
  325. public:
  326. ContingencyData() : success(0), failure(0), recovery(0), retries(0), contingencyFor(0) {}
  327. unsigned success;
  328. unsigned failure;
  329. unsigned recovery;
  330. unsigned retries;
  331. unsigned contingencyFor;
  332. };
  333. class ScheduleData
  334. {
  335. public:
  336. ScheduleData() : independent(false), now(true), priority(50), counting(false), count(0) {}
  337. bool independent;
  338. bool now;
  339. StringBuffer eventName;
  340. StringBuffer eventText;
  341. int priority;
  342. bool counting;
  343. unsigned count;
  344. };
  345. class WorkflowTransformer : public NewHqlTransformer
  346. {
  347. public:
  348. WorkflowTransformer(IWorkUnit * _wu, HqlCppTranslator & _translator);
  349. void analyseAll(const HqlExprArray & in);
  350. void transformRoot(const HqlExprArray & in, WorkflowArray & out);
  351. protected:
  352. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(WorkflowTransformInfo, expr); }
  353. IWorkflowItem * addWorkflowToWorkunit(unsigned wfid, WFType type, WFMode mode, IHqlExpression * cluster)
  354. {
  355. UnsignedArray dependencies;
  356. ContingencyData conts;
  357. return addWorkflowToWorkunit(wfid, type, mode, dependencies, conts, cluster);
  358. }
  359. IWorkflowItem * addWorkflowToWorkunit(unsigned wfid, WFType type, WFMode mode, UnsignedArray const & dependencies, IHqlExpression * cluster)
  360. {
  361. ContingencyData conts;
  362. return addWorkflowToWorkunit(wfid, type, mode, dependencies, conts, cluster);
  363. }
  364. IWorkflowItem * addWorkflowToWorkunit(unsigned wfid, WFType type, WFMode mode, UnsignedArray const & dependencies, ContingencyData const & conts, IHqlExpression * cluster);
  365. IWorkflowItem * addWorkflowContingencyToWorkunit(unsigned wfid, WFType type, WFMode mode, UnsignedArray const & dependencies, IHqlExpression * cluster, unsigned wfidFor) { ContingencyData conts; conts.contingencyFor = wfidFor; return addWorkflowToWorkunit(wfid, type, mode, dependencies, conts, cluster); }
  366. void setWorkflowPersist(IWorkflowItem * wf, char const * persistName, unsigned persistWfid);
  367. void setWorkflowSchedule(IWorkflowItem * wf, ScheduleData const & sched);
  368. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  369. void inheritDependencies(IHqlExpression * expr);
  370. void copyDependencies(WorkflowTransformInfo * source, WorkflowTransformInfo * dest);
  371. void copySetValueDependencies(WorkflowTransformInfo * source, IHqlExpression * expr);
  372. unsigned splitValue(IHqlExpression * value);
  373. IHqlExpression * extractWorkflow(IHqlExpression * untransformed, IHqlExpression * transformed);
  374. IHqlExpression * extractClusterWorkflow(IHqlExpression * expr);
  375. IHqlExpression * extractCommonWorkflow(IHqlExpression * expr, IHqlExpression * transformed);
  376. IHqlExpression * transformInternalCall(IHqlExpression * transformed);
  377. IHqlExpression * transformInternalFunction(IHqlExpression * transformed);
  378. IHqlExpression * createCompoundWorkflow(IHqlExpression * expr);
  379. IHqlExpression * createIfWorkflow(IHqlExpression * expr);
  380. IHqlExpression * createParallelWorkflow(IHqlExpression * expr);
  381. IHqlExpression * createSequentialWorkflow(IHqlExpression * expr);
  382. IHqlExpression * createWaitWorkflow(IHqlExpression * expr);
  383. IHqlExpression * transformRootAction(IHqlExpression * expr);
  384. IHqlExpression * transformSequentialEtc(IHqlExpression * expr);
  385. IWorkflowItem * lookupWorkflowItem(unsigned wfid);
  386. IHqlExpression * createWorkflowAction(unsigned wfid);
  387. unsigned ensureWorkflowAction(IHqlExpression * expr);
  388. void ensureWorkflowAction(UnsignedArray & dependencies, IHqlExpression * expr);
  389. WorkflowItem * createWorkflowItem(IHqlExpression * expr, unsigned wfid, unsigned persistWfid = 0);
  390. void percolateScheduledIds(WorkflowArray & workflow);
  391. void cacheWorkflowDependencies(unsigned wfid, UnsignedArray & extra);
  392. inline bool hasDependencies(IHqlExpression * expr) { return queryDirectDependencies(expr).ordinality() != 0; }
  393. bool hasStoredDependencies(IHqlExpression * expr);
  394. UnsignedArray const & queryDependencies(unsigned wfid);
  395. UnsignedArray const & queryDirectDependencies(IHqlExpression * expr); // don't include children.
  396. void gatherIndirectDependencies(UnsignedArray & match, IHqlExpression * expr);
  397. inline WorkflowTransformInfo * queryBodyExtra(IHqlExpression * expr) { return static_cast<WorkflowTransformInfo *>(queryTransformExtra(expr->queryBody())); }
  398. inline unsigned markDependencies() { return cumulativeDependencies.ordinality(); }
  399. inline bool restoreDependencies(unsigned mark)
  400. {
  401. bool anyAdded = (mark == cumulativeDependencies.ordinality());
  402. cumulativeDependencies.trunc(mark);
  403. return anyAdded;
  404. }
  405. bool haveSameDependencies(IHqlExpression * expr1, IHqlExpression * expr2);
  406. bool includesNewDependencies(IHqlExpression * prev, IHqlExpression * next);
  407. bool hasNonTrivialDependencies(IHqlExpression * expr);
  408. void transformSequential(HqlExprArray & transformed);
  409. void analyseExpr(IHqlExpression * expr);
  410. protected:
  411. IWorkUnit * wu;
  412. HqlCppTranslator & translator;
  413. WorkflowArray * workflowOut;
  414. unsigned wfidCount;
  415. HqlExprArray alreadyProcessed;
  416. HqlExprArray alreadyProcessedExpr;
  417. HqlExprArray alreadyProcessedUntransformed;
  418. HqlExprCopyArray activeLocations;
  419. unsigned trivialStoredWfid;
  420. unsigned onceWfid;
  421. unsigned nextInternalFunctionId;
  422. HqlExprArray trivialStoredExprs;
  423. HqlExprArray onceExprs;
  424. bool combineAllStored;
  425. bool combineTrivialStored;
  426. bool isRootAction;
  427. bool isRoxie;
  428. UnsignedArray cumulativeDependencies;
  429. UnsignedArray emptyDependencies;
  430. UnsignedArray storedWfids;
  431. OwnedHqlExpr rootCluster; // currently unset, but if need to
  432. //used while analysing..
  433. unsigned activeWfid;
  434. bool isConditional;
  435. bool insideStored;
  436. };
  437. //------------------------------------------------------------------------
  438. class ExplicitGlobalTransformer : public HoistingHqlTransformer
  439. {
  440. public:
  441. ExplicitGlobalTransformer(IWorkUnit * _wu, HqlCppTranslator & _translator);
  442. inline bool needToTransform() const { return seenGlobalScope || containsUnknownIndependentContents; }
  443. protected:
  444. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  445. virtual void doAnalyseExpr(IHqlExpression * expr);
  446. virtual IHqlExpression * doTransformIndependent(IHqlExpression * expr)
  447. {
  448. if (containsUnknownIndependentContents || seenLocalGlobalScope)
  449. {
  450. ExplicitGlobalTransformer nested(wu, translator);
  451. nested.setParent(this);
  452. nested.analyse(expr, 0);
  453. if (nested.needToTransform())
  454. return nested.transformRoot(expr);
  455. }
  456. return LINK(expr);
  457. }
  458. private:
  459. IWorkUnit * wu;
  460. HqlCppTranslator & translator;
  461. bool seenGlobalScope;
  462. bool seenLocalGlobalScope;
  463. bool isRoxie;
  464. };
  465. class ScalarGlobalExtra : public HoistingTransformInfo
  466. {
  467. public:
  468. ScalarGlobalExtra(IHqlExpression * _original) : HoistingTransformInfo(_original) { numUses = 0; alreadyGlobal = false; createGlobal = false; couldHoist = false; candidate = false; neverHoist = false; }
  469. public:
  470. unsigned numUses;
  471. bool alreadyGlobal;
  472. bool createGlobal;
  473. bool couldHoist;
  474. bool candidate;
  475. bool neverHoist;
  476. };
  477. //Only does anything to scalar expressions => don't need a mergingTransformer
  478. class ScalarGlobalTransformer : public HoistingHqlTransformer
  479. {
  480. public:
  481. ScalarGlobalTransformer(HqlCppTranslator & _translator);
  482. protected:
  483. virtual void analyseExpr(IHqlExpression * expr);
  484. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  485. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(ScalarGlobalExtra, expr); }
  486. virtual void doAnalyseExpr(IHqlExpression * expr);
  487. bool isComplex(IHqlExpression * expr, bool checkGlobal);
  488. virtual IHqlExpression * doTransformIndependent(IHqlExpression * expr)
  489. {
  490. ScalarGlobalTransformer nested(translator);
  491. nested.setParent(this);
  492. nested.analyse(expr, 0);
  493. return nested.transformRoot(expr);
  494. }
  495. inline ScalarGlobalExtra * queryBodyExtra(IHqlExpression * expr) { return static_cast<ScalarGlobalExtra*>(queryTransformExtra(expr->queryBody())); }
  496. protected:
  497. HqlCppTranslator & translator;
  498. bool okToHoist;
  499. bool neverHoist;
  500. };
  501. class ScopeMigrateInfo : public HoistingTransformInfo
  502. {
  503. public:
  504. ScopeMigrateInfo(IHqlExpression * _original) : HoistingTransformInfo(_original) { maxActivityDepth = 0; }//useCount = 0; condUseCount = 0; }
  505. public:
  506. unsigned maxActivityDepth;
  507. // unsigned useCount;
  508. // unsigned condUseCount;
  509. };
  510. class NewScopeMigrateTransformer : public HoistingHqlTransformer
  511. {
  512. public:
  513. NewScopeMigrateTransformer(IWorkUnit * _wu, HqlCppTranslator & _translator);
  514. protected:
  515. virtual void analyseExpr(IHqlExpression * expr);
  516. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  517. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(ScopeMigrateInfo, expr); }
  518. virtual IHqlExpression * doTransformIndependent(IHqlExpression * expr)
  519. {
  520. NewScopeMigrateTransformer nested(wu, translator);
  521. nested.setParent(this);
  522. nested.analyse(expr, 0);
  523. return nested.transformRoot(expr);
  524. }
  525. IHqlExpression * hoist(IHqlExpression * expr, IHqlExpression * hoisted);
  526. IHqlExpression * transformCond(IHqlExpression * expr);
  527. inline unsigned extraIndex() { return activityDepth != 0 ? 0 : 1; }
  528. inline ScopeMigrateInfo * queryBodyExtra(IHqlExpression * expr) { return static_cast<ScopeMigrateInfo *>(queryTransformExtra(expr->queryBody())); }
  529. private:
  530. IWorkUnit * wu;
  531. HqlCppTranslator & translator;
  532. bool isRoxie;
  533. bool minimizeWorkunitTemporaries;
  534. unsigned activityDepth;
  535. };
  536. class AutoScopeMigrateInfo : public NewTransformInfo
  537. {
  538. public:
  539. AutoScopeMigrateInfo(IHqlExpression * _original) : NewTransformInfo(_original) { useCount = 0; condUseCount = 0; manyGraphs = false; firstUseIsConditional = false; firstUseIsSequential = false; globalInsideChild = false; lastGraph = 0; }
  540. bool addGraph(unsigned graph);
  541. bool doAutoHoist(IHqlExpression * transformed, bool minimizeWorkunitTemporaries);
  542. public:
  543. unsigned useCount;
  544. unsigned condUseCount;
  545. unsigned lastGraph;
  546. bool manyGraphs;
  547. bool firstUseIsConditional;
  548. bool firstUseIsSequential;
  549. bool globalInsideChild;
  550. };
  551. class AutoScopeMigrateTransformer : public NewHqlTransformer
  552. {
  553. public:
  554. AutoScopeMigrateTransformer(IWorkUnit * _wu, HqlCppTranslator & _translator);
  555. void transformRoot(const HqlExprArray & in, HqlExprArray & out);
  556. bool worthTransforming() const { return hasCandidate; }
  557. protected:
  558. virtual void analyseExpr(IHqlExpression * expr);
  559. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  560. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(AutoScopeMigrateInfo, expr); }
  561. IHqlExpression * hoist(IHqlExpression * expr, IHqlExpression * hoisted);
  562. IHqlExpression * transformCond(IHqlExpression * expr);
  563. void doAnalyseExpr(IHqlExpression * expr);
  564. inline AutoScopeMigrateInfo * queryBodyExtra(IHqlExpression * expr) { return static_cast<AutoScopeMigrateInfo *>(queryTransformExtra(expr->queryBody())); }
  565. private:
  566. IWorkUnit * wu;
  567. HqlCppTranslator & translator;
  568. bool isRoxie;
  569. bool isConditional;
  570. bool hasCandidate;
  571. bool isSequential;
  572. unsigned curGraph;
  573. unsigned nextGraph;
  574. HqlExprArray graphActions;
  575. unsigned activityDepth;
  576. HqlExprArray * globalTarget;
  577. };
  578. //---------------------------------------------------------------------------
  579. class TrivialGraphRemover : public NewHqlTransformer
  580. {
  581. public:
  582. TrivialGraphRemover();
  583. bool worthTransforming() const { return hasCandidate; }
  584. protected:
  585. virtual void analyseExpr(IHqlExpression * expr);
  586. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  587. bool isTrivialGraph(IHqlExpression * expr);
  588. private:
  589. bool hasCandidate;
  590. };
  591. //---------------------------------------------------------------------------
  592. class ThorCountTransformer : public NewHqlTransformer
  593. {
  594. public:
  595. ThorCountTransformer(HqlCppTranslator & _translator, bool _countDiskFuncOk);
  596. IHqlExpression * createTransformed(IHqlExpression * expr);
  597. protected:
  598. HqlCppTranslator & translator;
  599. bool countDiskFuncOk;
  600. };
  601. //---------------------------------------------------------------------------
  602. class FilteredIndexOptimizer : public NewHqlTransformer
  603. {
  604. public:
  605. FilteredIndexOptimizer(bool _processJoins, bool _processReads);
  606. protected:
  607. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  608. protected:
  609. bool processJoins;
  610. bool processReads;
  611. };
  612. //---------------------------------------------------------------------------
  613. class LocalUploadTransformer : public NewHqlTransformer
  614. {
  615. public:
  616. LocalUploadTransformer(IWorkUnit * _wu);
  617. protected:
  618. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  619. protected:
  620. IWorkUnit * wu;
  621. };
  622. //---------------------------------------------------------------------------
  623. class NestedSelectorInfo : public NewTransformInfo
  624. {
  625. public:
  626. NestedSelectorInfo(IHqlExpression * _original) : NewTransformInfo(_original) { isDenormalized = false; insertDenormalize = false; }
  627. public:
  628. bool isDenormalized;
  629. bool insertDenormalize;
  630. };
  631. class NestedSelectorNormalizer : public NewHqlTransformer
  632. {
  633. public:
  634. NestedSelectorNormalizer();
  635. virtual void analyseExpr(IHqlExpression * expr);
  636. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  637. inline bool requiresTransforming() { return spottedCandidate; }
  638. protected:
  639. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr) { return CREATE_NEWTRANSFORMINFO(NestedSelectorInfo, expr); }
  640. IHqlExpression * createNormalized(IHqlExpression * expr);
  641. NestedSelectorInfo * queryBodyExtra(IHqlExpression * expr) { return (NestedSelectorInfo *)queryTransformExtra(expr->queryBody()); }
  642. protected:
  643. bool spottedCandidate;
  644. };
  645. //---------------------------------------------------------------------------
  646. class LeftRightSelectorNormalizer : public NewHqlTransformer
  647. {
  648. public:
  649. LeftRightSelectorNormalizer(bool _allowAmbiguity);
  650. virtual void analyseExpr(IHqlExpression * expr);
  651. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  652. virtual IHqlExpression * createTransformedSelector(IHqlExpression * expr);
  653. inline bool containsAmbiguity() { return isAmbiguous; }
  654. protected:
  655. void checkAmbiguity(const HqlExprCopyArray & inScope, IHqlExpression * selector);
  656. protected:
  657. bool allowAmbiguity;
  658. bool isAmbiguous;
  659. };
  660. //---------------------------------------------------------------------------
  661. class SharedTableInfo : public CInterface
  662. {
  663. public:
  664. SharedTableInfo(IHqlExpression * _dataset, unsigned _depth) : dataset(_dataset), depth(_depth) {}
  665. IHqlExpression * dataset;
  666. unsigned depth;
  667. OwnedHqlExpr uid; // if (depth > 0)
  668. };
  669. class ImplicitAliasTransformInfo : public NewTransformInfo
  670. {
  671. public:
  672. ImplicitAliasTransformInfo(IHqlExpression * _expr) : NewTransformInfo(_expr) { containsAmbiguity = false; }
  673. void add(SharedTableInfo * table);
  674. void addAmbiguity(SharedTableInfo * table);
  675. void inherit(const ImplicitAliasTransformInfo * other);
  676. void merge(SharedTableInfo * table);
  677. SharedTableInfo * uses(IHqlExpression * tableBody) const;
  678. public:
  679. CIArrayOf<SharedTableInfo> sharedTables;
  680. Owned<SharedTableInfo> shared;
  681. bool containsAmbiguity;
  682. };
  683. class ImplicitAliasTransformer : public NewHqlTransformer
  684. {
  685. public:
  686. ImplicitAliasTransformer();
  687. void process(HqlExprArray & exprs);
  688. inline bool hasAmbiguity() const { return seenAmbiguity; }
  689. protected:
  690. virtual void analyseExpr(IHqlExpression * expr);
  691. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  692. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  693. inline ImplicitAliasTransformInfo * queryExtra(IHqlExpression * expr) { return (ImplicitAliasTransformInfo *)queryTransformExtra(expr); }
  694. SharedTableInfo * createAmbiguityInfo(IHqlExpression * dataset, unsigned depth);
  695. protected:
  696. CIArrayOf<SharedTableInfo> ambiguousTables;
  697. bool seenAmbiguity;
  698. bool seenShared;
  699. };
  700. //---------------------------------------------------------------------------
  701. class ForceLocalTransformInfo : public NewTransformInfo
  702. {
  703. friend class ForceLocalTransformer;
  704. public:
  705. ForceLocalTransformInfo(IHqlExpression * _expr) : NewTransformInfo(_expr) { }
  706. public:
  707. //Theoretically this should be [insideForceLocal][allNodesDepth], but using insideAllNodes instead will just some obscure selfnodes in wrong place.
  708. HqlExprAttr localTransformed[2][2];
  709. HqlExprAttr localTransformedSelector[2][2];
  710. };
  711. //MORE: I think this might need to be a scoped transformer to cope with the general case
  712. class ForceLocalTransformer : public NewHqlTransformer
  713. {
  714. public:
  715. ForceLocalTransformer(ClusterType _targetClusterType);
  716. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  717. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  718. virtual IHqlExpression * queryAlreadyTransformed(IHqlExpression * expr);
  719. virtual void setTransformed(IHqlExpression * expr, IHqlExpression * transformed);
  720. virtual IHqlExpression * queryAlreadyTransformedSelector(IHqlExpression * expr);
  721. virtual void setTransformedSelector(IHqlExpression * expr, IHqlExpression * transformed);
  722. protected:
  723. bool queryAddLocal(IHqlExpression * expr);
  724. inline bool insideAllNodes() { return allNodesDepth > 0; }
  725. //Another exception
  726. inline ForceLocalTransformInfo * queryExtra(IHqlExpression * expr) { return (ForceLocalTransformInfo *)queryTransformExtra(expr); }
  727. protected:
  728. ClusterType targetClusterType;
  729. bool insideForceLocal;
  730. unsigned allNodesDepth;
  731. };
  732. class HqlLinkedChildRowTransformer : public QuickHqlTransformer
  733. {
  734. public:
  735. HqlLinkedChildRowTransformer(bool _implicitLinkedChildRows);
  736. virtual IHqlExpression * createTransformedBody(IHqlExpression * expr);
  737. protected:
  738. IHqlExpression * ensureInputSerialized(IHqlExpression * expr);
  739. IHqlExpression * transformBuildIndex(IHqlExpression * expr);
  740. IHqlExpression * transformPipeThrough(IHqlExpression * expr);
  741. protected:
  742. bool implicitLinkedChildRows;
  743. };
  744. //---------------------------------------------------------------------------
  745. class HqlScopeTaggerInfo : public MergingTransformInfo
  746. {
  747. public:
  748. HqlScopeTaggerInfo(IHqlExpression * _expr);
  749. };
  750. class HqlScopeTagger : public ScopedDependentTransformer
  751. {
  752. typedef ScopedDependentTransformer Parent;
  753. public:
  754. HqlScopeTagger(IErrorReceiver * _errors);
  755. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  756. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  757. void reportWarnings();
  758. protected:
  759. void beginTableScope();
  760. void endTableScope(HqlExprArray & attrs, IHqlExpression * ds, IHqlExpression * newExpr);
  761. void checkActiveRow(IHqlExpression * expr);
  762. IHqlExpression * transformSelect(IHqlExpression * expr);
  763. IHqlExpression * transformAmbiguous(IHqlExpression * expr, bool isActiveOk);
  764. IHqlExpression * transformAmbiguousChildren(IHqlExpression * expr);
  765. IHqlExpression * transformNewDataset(IHqlExpression * expr, bool isActiveOk);
  766. IHqlExpression * transformRelated(IHqlExpression * expr);
  767. IHqlExpression * transformSelectorsAttr(IHqlExpression * expr);
  768. IHqlExpression * transformSizeof(IHqlExpression * expr);
  769. IHqlExpression * transformWithin(IHqlExpression * dataset, IHqlExpression * scope);
  770. bool isValidNormalizeSelector(IHqlExpression * expr);
  771. void reportError(const char * msg, bool warning = false);
  772. void reportSelectorError(IHqlExpression * selector, IHqlExpression * expr);
  773. protected:
  774. IErrorReceiver * errors;
  775. WarningProcessor collector;
  776. };
  777. //---------------------------------------------------------------------------
  778. class ContainsCompoundTransformer : public QuickHqlTransformer
  779. {
  780. public:
  781. ContainsCompoundTransformer();
  782. protected:
  783. virtual void doAnalyseBody(IHqlExpression * expr);
  784. public:
  785. bool containsCompound;
  786. };
  787. bool containsCompound(const HqlExprArray & exprs);
  788. bool containsCompound(IHqlExpression * expr);
  789. //---------------------------------------------------------------------------
  790. class AnnotationTransformInfo : public NewTransformInfo
  791. {
  792. public:
  793. AnnotationTransformInfo(IHqlExpression * _expr) : NewTransformInfo(_expr) { }
  794. IHqlExpression * cloneAnnotations(IHqlExpression * body);
  795. void noteAnnotation(IHqlExpression * _annotation);
  796. public:
  797. HqlExprCopyArray annotations;
  798. };
  799. class AnnotationNormalizerTransformer : public NewHqlTransformer
  800. {
  801. public:
  802. AnnotationNormalizerTransformer();
  803. virtual void analyseExpr(IHqlExpression * expr);
  804. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  805. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  806. // virtual void analyseSelector(IHqlExpression * expr);
  807. // virtual IHqlExpression * transformSelector(IHqlExpression * expr);
  808. protected:
  809. AnnotationTransformInfo * queryCommonExtra(IHqlExpression * expr);
  810. };
  811. void normalizeAnnotations(HqlCppTranslator & translator, HqlExprArray & exprs);
  812. void normalizeAnnotations(HqlCppTranslator & translator, WorkflowArray & workflow);
  813. //---------------------------------------------------------------------------
  814. class NestedCompoundTransformer : public HoistingHqlTransformer
  815. {
  816. public:
  817. NestedCompoundTransformer(HqlCppTranslator & _translator);
  818. protected:
  819. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  820. virtual IHqlExpression * doTransformIndependent(IHqlExpression * expr)
  821. {
  822. if (!containsCompound(expr))
  823. return LINK(expr);
  824. NestedCompoundTransformer nested(translator);
  825. nested.setParent(this);
  826. nested.analyse(expr, 0); // analyse called so set up whether expressions are unconditional etc.
  827. return nested.transformRoot(expr);
  828. }
  829. public:
  830. HqlCppTranslator & translator;
  831. const HqlCppOptions & translatorOptions;
  832. };
  833. class HqlTreeNormalizerInfo : public NewTransformInfo
  834. {
  835. public:
  836. HqlTreeNormalizerInfo(IHqlExpression * _expr) : NewTransformInfo(_expr) { symbol = NULL; }
  837. void noteSymbol(IHqlExpression * _symbol);
  838. public:
  839. IHqlExpression * symbol;
  840. };
  841. class HqlTreeNormalizer : public NewHqlTransformer
  842. {
  843. typedef NewHqlTransformer Parent;
  844. public:
  845. HqlTreeNormalizer(HqlCppTranslator & _translator);
  846. virtual void analyseExpr(IHqlExpression * expr);
  847. virtual IHqlExpression * createTransformed(IHqlExpression * expr);
  848. virtual ANewTransformInfo * createTransformInfo(IHqlExpression * expr);
  849. bool querySeenForceLocal() const { return seenForceLocal; }
  850. bool querySeenLocalUpload() const { return seenLocalUpload; }
  851. protected:
  852. virtual IHqlExpression * createTransformedSelector(IHqlExpression * expr);
  853. virtual ITypeInfo * transformType(ITypeInfo * type);
  854. inline IHqlExpression * createTransformedBody(IHqlExpression * expr);
  855. IHqlExpression * convertSelectToProject(IHqlExpression * newRecord, IHqlExpression * expr);
  856. void convertRecordToAssigns(HqlExprArray & assigns, IHqlExpression * oldRecord, IHqlExpression * targetSelector, bool canOmit, bool onlyConstant);
  857. IHqlExpression * convertRecordToAssigns(IHqlExpression * oldRecord, bool canOmit, bool onlyConstant);
  858. IHqlExpression * removeDefaultsFromExpr(IHqlExpression * expr, unsigned recordChildIndex, node_operator newOp);
  859. IHqlExpression * optimizeAssignSkip(HqlExprArray & children, IHqlExpression * expr, IHqlExpression * cond, unsigned depth);
  860. IHqlExpression * queryTransformPatternDefine(IHqlExpression * expr);
  861. IHqlExpression * transformActionList(IHqlExpression * expr);
  862. IHqlExpression * transformCase(IHqlExpression * expr);
  863. IHqlExpression * transformExecuteWhen(IHqlExpression * expr);
  864. IHqlExpression * transformEvaluate(IHqlExpression * expr);
  865. IHqlExpression * transformIfAssert(node_operator newOp, IHqlExpression * expr);
  866. IHqlExpression * transformKeyIndex(IHqlExpression * expr);
  867. IHqlExpression * transformMerge(IHqlExpression * expr);
  868. IHqlExpression * transformNewKeyIndex(IHqlExpression * expr);
  869. IHqlExpression * transformPatNamedUse(IHqlExpression * expr);
  870. IHqlExpression * transformPatCheckIn(IHqlExpression * expr);
  871. IHqlExpression * transformMap(IHqlExpression * expr);
  872. IHqlExpression * transformTempRow(IHqlExpression * expr);
  873. IHqlExpression * transformTempTable(IHqlExpression * expr);
  874. IHqlExpression * transformTable(IHqlExpression * untransformed);
  875. IHqlExpression * transformWithinFilter(IHqlExpression * expr);
  876. bool transformTransform(HqlExprArray & children, IHqlExpression * expr);
  877. IHqlExpression * transformTransform(IHqlExpression * expr);
  878. IHqlExpression * validateKeyedJoin(IHqlExpression * expr);
  879. protected:
  880. IHqlExpression * makeRecursiveName(_ATOM searchModule, _ATOM searchName);
  881. HqlTreeNormalizerInfo * queryCommonExtra(IHqlExpression * expr);
  882. IHqlExpression * transformSimpleConst(IHqlExpression * expr)
  883. {
  884. if (expr->isConstant())
  885. return transform(expr);
  886. return LINK(expr);
  887. }
  888. protected:
  889. HqlCppTranslator & translator;
  890. IErrorReceiver * errors;
  891. HqlExprArray forwardReferences;
  892. HqlExprArray defines;
  893. struct
  894. {
  895. bool removeAsserts;
  896. bool commonUniqueNameAttributes;
  897. bool simplifySelectorSequence;
  898. bool sortIndexPayload;
  899. bool allowSections;
  900. bool normalizeExplicitCasts;
  901. bool ensureRecordsHaveSymbols;
  902. bool outputRowsAsDatasets;
  903. bool constantFoldNormalize;
  904. bool allowActivityForKeyedJoin;
  905. bool implicitShuffle;
  906. } options;
  907. unsigned nextSequenceValue;
  908. bool seenForceLocal;
  909. bool seenLocalUpload;
  910. };
  911. void normalizeHqlTree(HqlCppTranslator & translator, HqlExprArray & exprs);
  912. IHqlExpression * normalizeHqlTree(HqlCppTranslator & translator, IHqlExpression * expr);
  913. // more: This really shouldn't need a translator argument - but it is a bit of a god class, and error reporting needs splitting from it.
  914. IHqlExpression * normalizeRecord(HqlCppTranslator & translator, IHqlExpression * expr);
  915. IHqlExpression * removeNamedSymbols(IHqlExpression * expr);
  916. void hoistNestedCompound(HqlCppTranslator & _translator, HqlExprArray & exprs);
  917. void hoistNestedCompound(HqlCppTranslator & _translator, WorkflowArray & workflow);
  918. //---------------------------------------------------------------------------
  919. void expandGlobalDatasets(WorkflowArray & array, IWorkUnit * wu, HqlCppTranslator & translator);
  920. void mergeThorGraphs(WorkflowArray & array, bool resourceConditionalActions, bool resourceSequential);
  921. void migrateExprToNaturalLevel(WorkflowArray & array, IWorkUnit * wu, HqlCppTranslator & translator);
  922. void removeTrivialGraphs(WorkflowArray & workflow);
  923. void extractWorkflow(HqlCppTranslator & translator, HqlExprArray & exprs, WorkflowArray & out);
  924. void optimizeActivities(HqlExprArray & exprs, bool optimizeCountCompare, bool optimizeNonEmpty);
  925. void optimizeActivities(WorkflowArray & array, bool optimizeCountCompare, bool optimizeNonEmpty);
  926. IHqlExpression * optimizeActivities(IHqlExpression * expr, bool optimizeCountCompare, bool optimizeNonEmpty);
  927. IHqlExpression * insertImplicitProjects(HqlCppTranslator & translator, IHqlExpression * expr, bool optimizeSpills);
  928. void insertImplicitProjects(HqlCppTranslator & translator, HqlExprArray & exprs);
  929. //------------------------------------------------------------------------
  930. #endif