#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace NYql { class TOptimizeTransformerBase: public TSyncTransformerBase { public: using TGetParents = std::function; using THandler = std::function(NNodes::TExprBase, TExprContext&, IOptimizationContext&, const TGetParents&)>; using TFilter = std::function; TOptimizeTransformerBase(TTypeAnnotationContext* types, NLog::EComponent logComponent, const TSet& disabledOpts); TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) override; void Rewind() override; protected: class TIgnoreOptimizationContext; class TRemapOptimizationContext; static TFilter Any(); static TFilter Names(std::initializer_list names); static TFilter Or(std::initializer_list filters); void AddHandler(size_t step, TFilter filter, TStringBuf optName, THandler handler); void SetGlobal(size_t step); template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, const TGetParents&)) { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& /*optCtx*/, const TGetParents& parents) { return (static_cast(this)->*handler)(node, ctx, parents); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, const TGetParents&) const) const { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& /*optCtx*/, const TGetParents& parents) { return (static_cast(this)->*handler)(node, ctx, parents); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, IOptimizationContext&, const TGetParents&)) { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& parents) { return (static_cast(this)->*handler)(node, ctx, optCtx, parents); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, IOptimizationContext&, const TGetParents&) const) const { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& parents) { return (static_cast(this)->*handler)(node, ctx, optCtx, parents); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, IOptimizationContext&)) { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& /*parents*/) { return (static_cast(this)->*handler)(node, ctx, optCtx); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&, IOptimizationContext&) const) const { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& /*parents*/) { return (static_cast(this)->*handler)(node, ctx, optCtx); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&)) { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& /*optCtx*/, const TGetParents& /*parents*/) { return (static_cast(this)->*handler)(node, ctx); }; } template THandler Hndl(NNodes::TMaybeNode(TDerived::* handler)(NNodes::TExprBase, TExprContext&) const) const { return [this, handler] (NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& /*optCtx*/, const TGetParents& /*parents*/) { return (static_cast(this)->*handler)(node, ctx); }; } protected: struct TOptInfo { TString OptName; TFilter Filter; THandler Handler; }; struct TStep { TProcessedNodesSet ProcessedNodes; TVector Optimizers; bool Global = false; }; TTypeAnnotationContext* Types; const NLog::EComponent LogComponent; TSet DisabledOpts; TVector Steps; }; } // NYql