yql_expr_optimize.h 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <yql/essentials/ast/yql_expr.h>
  3. #include "yql_graph_transformer.h"
  4. #include "yql_type_annotation.h"
  5. #include <util/generic/hash_set.h>
  6. #include <functional>
  7. namespace NYql {
  8. typedef std::function<TExprNode::TPtr (const TExprNode::TPtr&, TExprContext&)> TCallableOptimizer;
  9. typedef std::function<TExprNode::TPtr (const TExprNode::TPtr&, bool&, TExprContext&)> TCallableOptimizerFast;
  10. typedef std::unordered_set<ui64> TProcessedNodesSet;
  11. struct TOptimizeExprSettings {
  12. explicit TOptimizeExprSettings(TTypeAnnotationContext* types)
  13. : Types(types)
  14. {}
  15. bool VisitChanges = false;
  16. TProcessedNodesSet* ProcessedNodes = nullptr;
  17. bool VisitStarted = false;
  18. IGraphTransformer* CustomInstantTypeTransformer = nullptr;
  19. bool VisitLambdas = true;
  20. TTypeAnnotationContext* Types;
  21. bool VisitTuples = false;
  22. std::function<bool(const TExprNode&)> VisitChecker;
  23. };
  24. IGraphTransformer::TStatus OptimizeExpr(const TExprNode::TPtr& input, TExprNode::TPtr& output, TCallableOptimizer optimizer,
  25. TExprContext& ctx, const TOptimizeExprSettings& settings);
  26. IGraphTransformer::TStatus OptimizeExpr(const TExprNode::TPtr& input, TExprNode::TPtr& output, const TCallableOptimizerFast& optimizer,
  27. TExprContext& ctx, const TOptimizeExprSettings& settings);
  28. IGraphTransformer::TStatus RemapExpr(const TExprNode::TPtr& input, TExprNode::TPtr& output, const TNodeOnNodeOwnedMap& remaps,
  29. TExprContext& ctx, const TOptimizeExprSettings& settings);
  30. class IOptimizationContext {
  31. public:
  32. virtual ~IOptimizationContext() = default;
  33. virtual void RemapNode(const TExprNode& fromNode, const TExprNode::TPtr& toNode) = 0;
  34. };
  35. typedef std::function<TExprNode::TPtr (const TExprNode::TPtr&, TExprContext&, IOptimizationContext&)> TCallableOptimizerEx;
  36. IGraphTransformer::TStatus OptimizeExprEx(const TExprNode::TPtr& input, TExprNode::TPtr& output, TCallableOptimizerEx optimizer,
  37. TExprContext& ctx, const TOptimizeExprSettings& settings);
  38. IGraphTransformer::TStatus ExpandApply(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx);
  39. IGraphTransformer::TStatus ExpandApplyNoRepeat(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx);
  40. TExprNode::TPtr ApplySyncListToWorld(const TExprNode::TPtr& main, const TSyncMap& syncList, TExprContext& ctx);
  41. typedef std::function<bool (const TExprNode::TPtr&)> TExprVisitPtrFunc;
  42. typedef std::function<bool (const TExprNode&)> TExprVisitRefFunc;
  43. void VisitExpr(const TExprNode::TPtr& root, const TExprVisitPtrFunc& func);
  44. void VisitExpr(const TExprNode::TPtr& root, const TExprVisitPtrFunc& preFunc, const TExprVisitPtrFunc& postFunc);
  45. void VisitExpr(const TExprNode::TPtr& root, const TExprVisitPtrFunc& func, TNodeSet& visitedNodes);
  46. void VisitExpr(const TExprNode& root, const TExprVisitRefFunc& func);
  47. void VisitExpr(const TExprNode& root, const TExprVisitRefFunc& preFunc, const TExprVisitRefFunc& postFunc);
  48. void VisitExprLambdasLast(const TExprNode::TPtr& root, const TExprVisitPtrFunc& preLambdaFunc, const TExprVisitPtrFunc& postLambdaFunc);
  49. void VisitExprByFirst(const TExprNode::TPtr& root, const TExprVisitPtrFunc& func);
  50. void VisitExprByFirst(const TExprNode::TPtr& root, const TExprVisitPtrFunc& preFunc, const TExprVisitPtrFunc& postFunc);
  51. void VisitExprByFirst(const TExprNode::TPtr& root, const TExprVisitPtrFunc& func, TNodeSet& visitedNodes);
  52. void VisitExprByFirst(const TExprNode& root, const TExprVisitRefFunc& func);
  53. TExprNode::TPtr FindNode(const TExprNode::TPtr& root, const TExprVisitPtrFunc& predicate);
  54. TExprNode::TPtr FindNode(const TExprNode::TPtr& root, const TExprVisitPtrFunc& filter, const TExprVisitPtrFunc& predicate);
  55. TExprNode::TListType FindNodes(const TExprNode::TPtr& root, const TExprVisitPtrFunc& predicate);
  56. TExprNode::TListType FindNodes(const TExprNode::TPtr& root, const TExprVisitPtrFunc& filter, const TExprVisitPtrFunc& predicate);
  57. std::pair<TExprNode::TPtr, bool> FindSharedNode(const TExprNode::TPtr& firstRoot, const TExprNode::TPtr& secondRoot, const TExprVisitPtrFunc& predicate);
  58. bool HaveSharedNodes(const TExprNode::TPtr& firstRoot, const TExprNode::TPtr& secondRoot, const TExprVisitPtrFunc& predicate);
  59. TExprNode::TPtr CloneCompleteFlow(TExprNode::TPtr&& node, TExprContext& ctx);
  60. }