#pragma once #include struct Var; struct RelOptInfo; struct List; struct EquivalenceClass; struct Path; struct RestrictInfo; namespace NYql { class TPgOptimizer: public IOptimizer { public: TPgOptimizer(const TInput& input, const std::function& log = {}); ~TPgOptimizer(); TOutput JoinSearch() override; private: TInput Input; std::function Log; std::map Vars; std::vector> RestrictInfos; std::vector LeftRestriction; std::vector RightRestriction; void MakeLeftOrRightRestrictions(std::vector& dst, const std::vector& src); void LogNode(const TString& prefix, void* node); RelOptInfo* JoinSearchInternal(); List* MakeEqClasses(); EquivalenceClass* MakeEqClass(int eqId); Var* MakeVar(TVarId); TOutput MakeOutput(Path*); int MakeOutputJoin(TOutput& output, Path*); void LogOutput(const TString& prefix, const TOutput& output, int id); TString PrettyPrintVar(TVarId varId); }; // export for tests Var* MakeVar(int relno, int varno); RelOptInfo* MakeRelOptInfo(const IOptimizer::TRel& r, int relno); List* MakeRelOptInfoList(const IOptimizer::TInput& input); } // namespace NYql