#pragma once #include namespace re2 { class RE2; } namespace DB { class IASTColumnsTransformer : public IAST { public: virtual void transform(ASTs & nodes) const = 0; static void transform(const ASTPtr & transformer, ASTs & nodes); }; class ASTColumnsApplyTransformer : public IASTColumnsTransformer { public: String getID(char) const override { return "ColumnsApplyTransformer"; } ASTPtr clone() const override { auto res = std::make_shared(*this); if (parameters) res->parameters = parameters->clone(); if (lambda) res->lambda = lambda->clone(); return res; } void transform(ASTs & nodes) const override; // Case 1 APPLY (quantile(0.9)) String func_name; ASTPtr parameters; // Case 2 APPLY (x -> quantile(0.9)(x)) ASTPtr lambda; String lambda_arg; String column_name_prefix; protected: void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; }; class ASTColumnsExceptTransformer : public IASTColumnsTransformer { public: bool is_strict = false; String getID(char) const override { return "ColumnsExceptTransformer"; } ASTPtr clone() const override { auto clone = std::make_shared(*this); clone->cloneChildren(); return clone; } void transform(ASTs & nodes) const override; void setPattern(String pattern); bool isColumnMatching(const String & column_name) const; protected: void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; std::shared_ptr column_matcher; String original_pattern; }; class ASTColumnsReplaceTransformer : public IASTColumnsTransformer { public: class Replacement : public IAST { public: String getID(char) const override { return "ColumnsReplaceTransformer::Replacement"; } ASTPtr clone() const override { auto replacement = std::make_shared(*this); replacement->children.clear(); replacement->expr = expr->clone(); replacement->children.push_back(replacement->expr); return replacement; } String name; ASTPtr expr; protected: void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; }; bool is_strict = false; String getID(char) const override { return "ColumnsReplaceTransformer"; } ASTPtr clone() const override { auto clone = std::make_shared(*this); clone->cloneChildren(); return clone; } void transform(ASTs & nodes) const override; protected: void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; private: static void replaceChildren(ASTPtr & node, const ASTPtr & replacement, const String & name); }; }