1 | #pragma once |
2 | |
3 | #include <Core/Block.h> |
4 | |
5 | |
6 | namespace DB |
7 | { |
8 | |
9 | |
10 | /** Merging consecutive passed blocks to specified minimum size. |
11 | * |
12 | * (But if one of input blocks has already at least specified size, |
13 | * then don't merge it with neighbours, even if neighbours are small.) |
14 | * |
15 | * Used to prepare blocks to adequate size for INSERT queries, |
16 | * because such storages as Memory, StripeLog, Log, TinyLog... |
17 | * store or compress data in blocks exactly as passed to it, |
18 | * and blocks of small size are not efficient. |
19 | * |
20 | * Order of data is kept. |
21 | */ |
22 | class SquashingTransform |
23 | { |
24 | public: |
25 | /// Conditions on rows and bytes are OR-ed. If one of them is zero, then corresponding condition is ignored. |
26 | SquashingTransform(size_t min_block_size_rows_, size_t min_block_size_bytes_, bool reserve_memory_ = false); |
27 | |
28 | /// When not ready, you need to pass more blocks to add function. |
29 | struct Result |
30 | { |
31 | bool ready = false; |
32 | MutableColumns columns; |
33 | |
34 | Result(bool ready_) : ready(ready_) {} |
35 | Result(MutableColumns && columns_) : ready(true), columns(std::move(columns_)) {} |
36 | }; |
37 | |
38 | /** Add next block and possibly returns squashed block. |
39 | * At end, you need to pass empty block. As the result for last (empty) block, you will get last Result with ready = true. |
40 | */ |
41 | Result add(MutableColumns && columns); |
42 | |
43 | private: |
44 | size_t min_block_size_rows; |
45 | size_t min_block_size_bytes; |
46 | bool reserve_memory; |
47 | |
48 | MutableColumns accumulated_columns; |
49 | |
50 | void append(MutableColumns && columns); |
51 | |
52 | bool isEnoughSize(const MutableColumns & columns); |
53 | bool isEnoughSize(size_t rows, size_t bytes) const; |
54 | }; |
55 | |
56 | } |
57 | |