MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / buildColumnTransformers

Method buildColumnTransformers

src/Analyzer/QueryTreeBuilder.cpp:1219–1282  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1217
1218
1219ColumnTransformersNodes 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 {

Callers

nothing calls this directly

Calls 7

ExceptionClass · 0.50
emplace_backMethod · 0.45
getMatcherMethod · 0.45
reserveMethod · 0.45
sizeMethod · 0.45
push_backMethod · 0.45
formatForErrorMessageMethod · 0.45

Tested by

no test coverage detected