ClickHouse

Форк
0
65 строк · 2.1 Кб
1
#include <Processors/QueryPlan/Optimizations/Optimizations.h>
2
#include <Processors/QueryPlan/UnionStep.h>
3
#include <Processors/QueryPlan/ExpressionStep.h>
4
#include <Interpreters/ActionsDAG.h>
5

6
namespace DB::QueryPlanOptimizations
7
{
8

9
size_t tryLiftUpUnion(QueryPlan::Node * parent_node, QueryPlan::Nodes & nodes)
10
{
11
    if (parent_node->children.empty())
12
        return 0;
13

14
    QueryPlan::Node * child_node = parent_node->children.front();
15
    auto & parent = parent_node->step;
16
    auto & child = child_node->step;
17

18
    auto * union_step = typeid_cast<UnionStep *>(child.get());
19
    if (!union_step)
20
        return 0;
21

22
    if (auto * expression = typeid_cast<ExpressionStep *>(parent.get()))
23
    {
24
        /// Union does not change header.
25
        /// We can push down expression and update header.
26
        auto union_input_streams = child->getInputStreams();
27
        for (auto & input_stream : union_input_streams)
28
            input_stream.header = expression->getOutputStream().header;
29

30
        ///                    - Something
31
        /// Expression - Union - Something
32
        ///                    - Something
33

34
        child = std::make_unique<UnionStep>(union_input_streams, union_step->getMaxThreads());
35

36
        std::swap(parent, child);
37
        std::swap(parent_node->children, child_node->children);
38
        std::swap(parent_node->children.front(), child_node->children.front());
39

40
        ///       - Expression - Something
41
        /// Union - Something
42
        ///       - Something
43

44
        for (size_t i = 1; i < parent_node->children.size(); ++i)
45
        {
46
            auto & expr_node = nodes.emplace_back();
47
            expr_node.children.push_back(parent_node->children[i]);
48
            parent_node->children[i] = &expr_node;
49

50
            expr_node.step = std::make_unique<ExpressionStep>(
51
                expr_node.children.front()->step->getOutputStream(),
52
                expression->getExpression()->clone());
53
        }
54

55
        ///       - Expression - Something
56
        /// Union - Expression - Something
57
        ///       - Expression - Something
58

59
        return 3;
60
    }
61

62
    return 0;
63
}
64

65
}
66

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.