#pragma once
#include <string>
#include <unordered_map>
#include <unordered_set>
#include "logical_operator_visitor.h"
#include "planner/operator/logical_plan.h"
namespace lbug {
namespace optimizer {
class AggKeyDependencyOptimizer : public LogicalOperatorVisitor {
public:
void rewrite(planner::LogicalPlan* plan);
private:
void visitOperator(planner::LogicalOperator* op);
void visitAggregate(planner::LogicalOperator* op) override;
void visitDistinct(planner::LogicalOperator* op) override;
std::pair<binder::expression_vector, binder::expression_vector> resolveKeysAndDependentKeys(
const binder::expression_vector& keys);
std::unordered_map<std::string, std::unordered_set<std::string>> collectVarDeps;
};
} }