1 | #include <Storages/MergeTree/MergeTreeDataPartTTLInfo.h> |
2 | #include <IO/ReadHelpers.h> |
3 | #include <IO/WriteHelpers.h> |
4 | #include <Common/quoteString.h> |
5 | |
6 | #include <common/JSON.h> |
7 | |
8 | namespace DB |
9 | { |
10 | |
11 | void MergeTreeDataPartTTLInfos::update(const MergeTreeDataPartTTLInfos & other_infos) |
12 | { |
13 | for (const auto & [name, ttl_info] : other_infos.columns_ttl) |
14 | { |
15 | columns_ttl[name].update(ttl_info); |
16 | updatePartMinMaxTTL(ttl_info.min, ttl_info.max); |
17 | } |
18 | |
19 | for (const auto & [expression, ttl_info] : other_infos.moves_ttl) |
20 | { |
21 | moves_ttl[expression].update(ttl_info); |
22 | } |
23 | |
24 | table_ttl.update(other_infos.table_ttl); |
25 | updatePartMinMaxTTL(table_ttl.min, table_ttl.max); |
26 | } |
27 | |
28 | |
29 | void MergeTreeDataPartTTLInfos::read(ReadBuffer & in) |
30 | { |
31 | String json_str; |
32 | readString(json_str, in); |
33 | assertEOF(in); |
34 | |
35 | JSON json(json_str); |
36 | if (json.has("columns" )) |
37 | { |
38 | const JSON & columns = json["columns" ]; |
39 | for (auto col : columns) |
40 | { |
41 | MergeTreeDataPartTTLInfo ttl_info; |
42 | ttl_info.min = col["min" ].getUInt(); |
43 | ttl_info.max = col["max" ].getUInt(); |
44 | String name = col["name" ].getString(); |
45 | columns_ttl.emplace(name, ttl_info); |
46 | |
47 | updatePartMinMaxTTL(ttl_info.min, ttl_info.max); |
48 | } |
49 | } |
50 | if (json.has("table" )) |
51 | { |
52 | const JSON & table = json["table" ]; |
53 | table_ttl.min = table["min" ].getUInt(); |
54 | table_ttl.max = table["max" ].getUInt(); |
55 | |
56 | updatePartMinMaxTTL(table_ttl.min, table_ttl.max); |
57 | } |
58 | if (json.has("moves" )) |
59 | { |
60 | const JSON & moves = json["moves" ]; |
61 | for (auto move : moves) |
62 | { |
63 | MergeTreeDataPartTTLInfo ttl_info; |
64 | ttl_info.min = move["min" ].getUInt(); |
65 | ttl_info.max = move["max" ].getUInt(); |
66 | String expression = move["expression" ].getString(); |
67 | moves_ttl.emplace(expression, ttl_info); |
68 | } |
69 | } |
70 | } |
71 | |
72 | |
73 | void MergeTreeDataPartTTLInfos::write(WriteBuffer & out) const |
74 | { |
75 | writeString("ttl format version: 1\n" , out); |
76 | writeString("{" , out); |
77 | if (!columns_ttl.empty()) |
78 | { |
79 | writeString("\"columns\":[" , out); |
80 | for (auto it = columns_ttl.begin(); it != columns_ttl.end(); ++it) |
81 | { |
82 | if (it != columns_ttl.begin()) |
83 | writeString("," , out); |
84 | |
85 | writeString("{\"name\":" , out); |
86 | writeString(doubleQuoteString(it->first), out); |
87 | writeString(",\"min\":" , out); |
88 | writeIntText(it->second.min, out); |
89 | writeString(",\"max\":" , out); |
90 | writeIntText(it->second.max, out); |
91 | writeString("}" , out); |
92 | } |
93 | writeString("]" , out); |
94 | } |
95 | if (table_ttl.min) |
96 | { |
97 | if (!columns_ttl.empty()) |
98 | writeString("," , out); |
99 | writeString("\"table\":{\"min\":" , out); |
100 | writeIntText(table_ttl.min, out); |
101 | writeString(",\"max\":" , out); |
102 | writeIntText(table_ttl.max, out); |
103 | writeString("}" , out); |
104 | } |
105 | if (!moves_ttl.empty()) |
106 | { |
107 | if (!columns_ttl.empty() || table_ttl.min) |
108 | writeString("," , out); |
109 | writeString("\"moves\":[" , out); |
110 | for (auto it = moves_ttl.begin(); it != moves_ttl.end(); ++it) |
111 | { |
112 | if (it != moves_ttl.begin()) |
113 | writeString("," , out); |
114 | |
115 | writeString("{\"expression\":" , out); |
116 | writeString(doubleQuoteString(it->first), out); |
117 | writeString(",\"min\":" , out); |
118 | writeIntText(it->second.min, out); |
119 | writeString(",\"max\":" , out); |
120 | writeIntText(it->second.max, out); |
121 | writeString("}" , out); |
122 | } |
123 | writeString("]" , out); |
124 | } |
125 | writeString("}" , out); |
126 | } |
127 | |
128 | } |
129 | |