ClickHouse
86 строк · 2.2 Кб
1#include <Processors/QueryPlan/LimitByStep.h>
2#include <Processors/Transforms/LimitByTransform.h>
3#include <QueryPipeline/QueryPipelineBuilder.h>
4#include <IO/Operators.h>
5#include <Common/JSONBuilder.h>
6
7namespace DB
8{
9
10static ITransformingStep::Traits getTraits()
11{
12return ITransformingStep::Traits
13{
14{
15.returns_single_stream = true,
16.preserves_number_of_streams = false,
17.preserves_sorting = true,
18},
19{
20.preserves_number_of_rows = false,
21}
22};
23}
24
25LimitByStep::LimitByStep(
26const DataStream & input_stream_,
27size_t group_length_, size_t group_offset_, const Names & columns_)
28: ITransformingStep(input_stream_, input_stream_.header, getTraits())
29, group_length(group_length_)
30, group_offset(group_offset_)
31, columns(columns_)
32{
33}
34
35
36void LimitByStep::transformPipeline(QueryPipelineBuilder & pipeline, const BuildQueryPipelineSettings &)
37{
38pipeline.resize(1);
39
40pipeline.addSimpleTransform([&](const Block & header, QueryPipelineBuilder::StreamType stream_type) -> ProcessorPtr
41{
42if (stream_type != QueryPipelineBuilder::StreamType::Main)
43return nullptr;
44
45return std::make_shared<LimitByTransform>(header, group_length, group_offset, columns);
46});
47}
48
49void LimitByStep::describeActions(FormatSettings & settings) const
50{
51String prefix(settings.offset, ' ');
52
53settings.out << prefix << "Columns: ";
54
55if (columns.empty())
56settings.out << "none\n";
57else
58{
59bool first = true;
60for (const auto & column : columns)
61{
62if (!first)
63settings.out << ", ";
64first = false;
65
66settings.out << column;
67}
68settings.out << '\n';
69}
70
71settings.out << prefix << "Length " << group_length << '\n';
72settings.out << prefix << "Offset " << group_offset << '\n';
73}
74
75void LimitByStep::describeActions(JSONBuilder::JSONMap & map) const
76{
77auto columns_array = std::make_unique<JSONBuilder::JSONArray>();
78for (const auto & column : columns)
79columns_array->add(column);
80
81map.add("Columns", std::move(columns_array));
82map.add("Length", group_length);
83map.add("Offset", group_offset);
84}
85
86}
87