diff options
| author | vitalyisaev <[email protected]> | 2023-11-14 09:58:56 +0300 |
|---|---|---|
| committer | vitalyisaev <[email protected]> | 2023-11-14 10:20:20 +0300 |
| commit | c2b2dfd9827a400a8495e172a56343462e3ceb82 (patch) | |
| tree | cd4e4f597d01bede4c82dffeb2d780d0a9046bd0 /contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp | |
| parent | d4ae8f119e67808cb0cf776ba6e0cf95296f2df7 (diff) | |
YQ Connector: move tests from yql to ydb (OSS)
Перенос папки с тестами на Коннектор из папки yql в папку ydb (синхронизируется с github).
Diffstat (limited to 'contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp')
| -rw-r--r-- | contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp b/contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp new file mode 100644 index 00000000000..5062ff5479e --- /dev/null +++ b/contrib/clickhouse/src/Processors/QueryPlan/ExpressionStep.cpp @@ -0,0 +1,94 @@ +#include <Processors/QueryPlan/ExpressionStep.h> +#include <Processors/Transforms/ExpressionTransform.h> +#include <QueryPipeline/QueryPipelineBuilder.h> +#include <Processors/Transforms/JoiningTransform.h> +#include <Interpreters/ExpressionActions.h> +#include <IO/Operators.h> +#include <Interpreters/JoinSwitcher.h> +#include <Common/JSONBuilder.h> + +namespace DB +{ + +static ITransformingStep::Traits getTraits(const ActionsDAGPtr & actions, const Block & header, const SortDescription & sort_description) +{ + return ITransformingStep::Traits + { + { + .returns_single_stream = false, + .preserves_number_of_streams = true, + .preserves_sorting = actions->isSortingPreserved(header, sort_description), + }, + { + .preserves_number_of_rows = !actions->hasArrayJoin(), + } + }; +} + +ExpressionStep::ExpressionStep(const DataStream & input_stream_, const ActionsDAGPtr & actions_dag_) + : ITransformingStep( + input_stream_, + ExpressionTransform::transformHeader(input_stream_.header, *actions_dag_), + getTraits(actions_dag_, input_stream_.header, input_stream_.sort_description)) + , actions_dag(actions_dag_) +{ +} + +void ExpressionStep::transformPipeline(QueryPipelineBuilder & pipeline, const BuildQueryPipelineSettings & settings) +{ + auto expression = std::make_shared<ExpressionActions>(actions_dag, settings.getActionsSettings()); + + pipeline.addSimpleTransform([&](const Block & header) + { + return std::make_shared<ExpressionTransform>(header, expression); + }); + + if (!blocksHaveEqualStructure(pipeline.getHeader(), output_stream->header)) + { + auto convert_actions_dag = ActionsDAG::makeConvertingActions( + pipeline.getHeader().getColumnsWithTypeAndName(), + output_stream->header.getColumnsWithTypeAndName(), + ActionsDAG::MatchColumnsMode::Name); + auto convert_actions = std::make_shared<ExpressionActions>(convert_actions_dag, settings.getActionsSettings()); + + pipeline.addSimpleTransform([&](const Block & header) + { + return std::make_shared<ExpressionTransform>(header, convert_actions); + }); + } +} + +void ExpressionStep::describeActions(FormatSettings & settings) const +{ + String prefix(settings.offset, settings.indent_char); + auto expression = std::make_shared<ExpressionActions>(actions_dag); + expression->describeActions(settings.out, prefix); +} + +void ExpressionStep::describeActions(JSONBuilder::JSONMap & map) const +{ + auto expression = std::make_shared<ExpressionActions>(actions_dag); + map.add("Expression", expression->toTree()); +} + +void ExpressionStep::updateOutputStream() +{ + output_stream = createOutputStream( + input_streams.front(), ExpressionTransform::transformHeader(input_streams.front().header, *actions_dag), getDataStreamTraits()); + + if (!getDataStreamTraits().preserves_sorting) + return; + + FindAliasForInputName alias_finder(actions_dag); + const auto & input_sort_description = getInputStreams().front().sort_description; + for (size_t i = 0, s = input_sort_description.size(); i < s; ++i) + { + String alias; + const auto & original_column = input_sort_description[i].column_name; + const auto * alias_node = alias_finder.find(original_column); + if (alias_node) + output_stream->sort_description[i].column_name = alias_node->result_name; + } +} + +} |
