| 1217 | |
| 1218 | |
| 1219 | ColumnTransformersNodes QueryTreeBuilder::buildColumnTransformers(const ASTPtr & matcher_expression, const ContextPtr & context) const |
| 1220 | { |
| 1221 | ColumnTransformersNodes column_transformers; |
| 1222 | |
| 1223 | if (!matcher_expression) |
| 1224 | return column_transformers; |
| 1225 | |
| 1226 | for (const auto & child : matcher_expression->children) |
| 1227 | { |
| 1228 | if (auto * apply_transformer = child->as<ASTColumnsApplyTransformer>()) |
| 1229 | { |
| 1230 | if (apply_transformer->lambda) |
| 1231 | { |
| 1232 | auto lambda_query_tree_node = buildExpression(apply_transformer->lambda, context); |
| 1233 | column_transformers.emplace_back(std::make_shared<ApplyColumnTransformerNode>(std::move(lambda_query_tree_node))); |
| 1234 | } |
| 1235 | else |
| 1236 | { |
| 1237 | auto function_node = std::make_shared<FunctionNode>(apply_transformer->func_name); |
| 1238 | if (apply_transformer->parameters) |
| 1239 | function_node->getParametersNode() = buildExpressionList(apply_transformer->parameters, context); |
| 1240 | |
| 1241 | column_transformers.emplace_back(std::make_shared<ApplyColumnTransformerNode>(std::move(function_node))); |
| 1242 | } |
| 1243 | } |
| 1244 | else if (auto * except_transformer = child->as<ASTColumnsExceptTransformer>()) |
| 1245 | { |
| 1246 | auto matcher = except_transformer->getMatcher(); |
| 1247 | if (matcher) |
| 1248 | { |
| 1249 | column_transformers.emplace_back(std::make_shared<ExceptColumnTransformerNode>(std::move(matcher))); |
| 1250 | } |
| 1251 | else |
| 1252 | { |
| 1253 | Names except_column_names; |
| 1254 | except_column_names.reserve(except_transformer->children.size()); |
| 1255 | |
| 1256 | for (auto & except_transformer_child : except_transformer->children) |
| 1257 | except_column_names.push_back(except_transformer_child->as<ASTIdentifier &>().full_name); |
| 1258 | |
| 1259 | column_transformers.emplace_back(std::make_shared<ExceptColumnTransformerNode>(std::move(except_column_names), except_transformer->is_strict)); |
| 1260 | } |
| 1261 | } |
| 1262 | else if (auto * replace_transformer = child->as<ASTColumnsReplaceTransformer>()) |
| 1263 | { |
| 1264 | std::vector<ReplaceColumnTransformerNode::Replacement> replacements; |
| 1265 | replacements.reserve(replace_transformer->children.size()); |
| 1266 | |
| 1267 | for (const auto & replace_transformer_child : replace_transformer->children) |
| 1268 | { |
| 1269 | auto & replacement = replace_transformer_child->as<ASTColumnsReplaceTransformer::Replacement &>(); |
| 1270 | replacements.emplace_back(ReplaceColumnTransformerNode::Replacement{replacement.name, buildExpression(replacement.children[0], context)}); |
| 1271 | } |
| 1272 | |
| 1273 | column_transformers.emplace_back(std::make_shared<ReplaceColumnTransformerNode>(replacements, replace_transformer->is_strict)); |
| 1274 | } |
| 1275 | else |
| 1276 | { |
nothing calls this directly
no test coverage detected