1#pragma once
2
3#include <Storages/MergeTree/MergeTreeIndices.h>
4#include <Storages/MergeTree/MergeTreeData.h>
5
6#include <Interpreters/SetVariants.h>
7
8#include <memory>
9#include <set>
10
11
12namespace DB
13{
14
15class MergeTreeIndexSet;
16
17struct MergeTreeIndexGranuleSet : public IMergeTreeIndexGranule
18{
19 explicit MergeTreeIndexGranuleSet(const MergeTreeIndexSet & index_);
20 MergeTreeIndexGranuleSet(const MergeTreeIndexSet & index_, MutableColumns && columns_);
21
22 void serializeBinary(WriteBuffer & ostr) const override;
23 void deserializeBinary(ReadBuffer & istr) override;
24
25 size_t size() const { return block.rows(); }
26 bool empty() const override { return !size(); }
27
28 ~MergeTreeIndexGranuleSet() override = default;
29
30 const MergeTreeIndexSet & index;
31 Block block;
32};
33
34
35struct MergeTreeIndexAggregatorSet : IMergeTreeIndexAggregator
36{
37 explicit MergeTreeIndexAggregatorSet(const MergeTreeIndexSet & index);
38 ~MergeTreeIndexAggregatorSet() override = default;
39
40 size_t size() const { return data.getTotalRowCount(); }
41 bool empty() const override { return !size(); }
42
43 MergeTreeIndexGranulePtr getGranuleAndReset() override;
44
45 void update(const Block & block, size_t * pos, size_t limit) override;
46
47private:
48 /// return true if has new data
49 template <typename Method>
50 bool buildFilter(
51 Method & method,
52 const ColumnRawPtrs & column_ptrs,
53 IColumn::Filter & filter,
54 size_t pos,
55 size_t limit,
56 ClearableSetVariants & variants) const;
57
58 const MergeTreeIndexSet & index;
59 ClearableSetVariants data;
60 Sizes key_sizes;
61 MutableColumns columns;
62};
63
64
65class MergeTreeIndexConditionSet : public IMergeTreeIndexCondition
66{
67public:
68 MergeTreeIndexConditionSet(
69 const SelectQueryInfo & query,
70 const Context & context,
71 const MergeTreeIndexSet & index);
72
73 bool alwaysUnknownOrTrue() const override;
74
75 bool mayBeTrueOnGranule(MergeTreeIndexGranulePtr idx_granule) const override;
76
77 ~MergeTreeIndexConditionSet() override = default;
78private:
79 void traverseAST(ASTPtr & node) const;
80 bool atomFromAST(ASTPtr & node) const;
81 bool operatorFromAST(ASTPtr & node) const;
82
83 bool checkASTUseless(const ASTPtr &node, bool atomic = false) const;
84
85 const MergeTreeIndexSet & index;
86
87 bool useless;
88 std::set<String> key_columns;
89 ASTPtr expression_ast;
90 ExpressionActionsPtr actions;
91};
92
93
94class MergeTreeIndexSet : public IMergeTreeIndex
95{
96public:
97 MergeTreeIndexSet(
98 String name_,
99 ExpressionActionsPtr expr_,
100 const Names & columns_,
101 const DataTypes & data_types_,
102 const Block & header_,
103 size_t granularity_,
104 size_t max_rows_)
105 : IMergeTreeIndex(std::move(name_), std::move(expr_), columns_, data_types_, header_, granularity_), max_rows(max_rows_) {}
106
107 ~MergeTreeIndexSet() override = default;
108
109 MergeTreeIndexGranulePtr createIndexGranule() const override;
110 MergeTreeIndexAggregatorPtr createIndexAggregator() const override;
111
112 MergeTreeIndexConditionPtr createIndexCondition(
113 const SelectQueryInfo & query, const Context & context) const override;
114
115 bool mayBenefitFromIndexForIn(const ASTPtr & node) const override;
116
117 size_t max_rows = 0;
118};
119
120}
121