ClickHouse

Форк
0
/
TTLDeleteAlgorithm.cpp 
65 строк · 2.2 Кб
1
#include <Processors/TTL/TTLDeleteAlgorithm.h>
2

3
namespace DB
4
{
5

6
TTLDeleteAlgorithm::TTLDeleteAlgorithm(
7
    const TTLExpressions & ttl_expressions_, const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_)
8
    : ITTLAlgorithm(ttl_expressions_, description_, old_ttl_info_, current_time_, force_)
9
{
10
    if (!isMinTTLExpired())
11
        new_ttl_info = old_ttl_info;
12

13
    if (isMaxTTLExpired())
14
        new_ttl_info.ttl_finished = true;
15
}
16

17
void TTLDeleteAlgorithm::execute(Block & block)
18
{
19
    if (!block || !isMinTTLExpired())
20
        return;
21

22
    auto ttl_column = executeExpressionAndGetColumn(ttl_expressions.expression, block, description.result_column);
23
    auto where_column = executeExpressionAndGetColumn(ttl_expressions.where_expression, block, description.where_result_column);
24

25
    MutableColumns result_columns;
26
    const auto & column_names = block.getNames();
27

28
    result_columns.reserve(column_names.size());
29
    for (auto it = column_names.begin(); it != column_names.end(); ++it)
30
    {
31
        const IColumn * values_column = block.getByName(*it).column.get();
32
        MutableColumnPtr result_column = values_column->cloneEmpty();
33
        result_column->reserve(block.rows());
34

35
        for (size_t i = 0; i < block.rows(); ++i)
36
        {
37
            UInt32 cur_ttl = getTimestampByIndex(ttl_column.get(), i);
38
            bool where_filter_passed = !where_column || where_column->getBool(i);
39

40
            if (!isTTLExpired(cur_ttl) || !where_filter_passed)
41
            {
42
                new_ttl_info.update(cur_ttl);
43
                result_column->insertFrom(*values_column, i);
44
            }
45
            else if (it == column_names.begin())
46
                ++rows_removed;
47
        }
48

49
        result_columns.emplace_back(std::move(result_column));
50
    }
51

52
    block = block.cloneWithColumns(std::move(result_columns));
53
}
54

55
void TTLDeleteAlgorithm::finalize(const MutableDataPartPtr & data_part) const
56
{
57
    if (ttl_expressions.where_expression)
58
        data_part->ttl_infos.rows_where_ttl[description.result_column] = new_ttl_info;
59
    else
60
        data_part->ttl_infos.table_ttl = new_ttl_info;
61

62
    data_part->ttl_infos.updatePartMinMaxTTL(new_ttl_info.min, new_ttl_info.max);
63
}
64

65
}
66

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

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

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

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