vkdb
A time series database engine in C++.
Loading...
Searching...
No Matches
printer.cpp
1#include <vkdb/printer.h>
2
3namespace vkdb {
4std::string Printer::print(const Expr& expr) noexcept {
5 for (const auto& query : expr) {
6 visit(query);
7 }
8 return output_.str();
9}
10
11void Printer::visit(const Query& query) noexcept {
12 std::visit([this](auto&& query) {
13 using Q = std::decay_t<decltype(query)>;
14 if constexpr (std::is_same_v<Q, SelectQuery>) {
15 visit(query);
16 } else if constexpr (std::is_same_v<Q, PutQuery>) {
17 visit(query);
18 } else if constexpr (std::is_same_v<Q, DeleteQuery>) {
19 visit(query);
20 } else if constexpr (std::is_same_v<Q, CreateQuery>) {
21 visit(query);
22 } else if constexpr (std::is_same_v<Q, DropQuery>) {
23 visit(query);
24 } else if constexpr (std::is_same_v<Q, AddQuery>) {
25 visit(query);
26 } else if constexpr (std::is_same_v<Q, RemoveQuery>) {
27 visit(query);
28 } else if constexpr (std::is_same_v<Q, TablesQuery>) {
29 visit(query);
30 }
31 }, query);
32 output_ << ";";
33}
34
35void Printer::visit(const SelectQuery& query) noexcept {
36 output_ << "SELECT ";
37 visit(query.type);
38 output_ << " ";
39 visit(query.metric);
40 output_ << " FROM ";
41 visit(query.table_name);
42 output_ << " ";
43 std::visit([this](auto&& select_clause) {
44 using C = std::decay_t<decltype(select_clause)>;
45 if constexpr (std::is_same_v<C, AllClause>) {
46 visit(select_clause);
47 } else if constexpr (std::is_same_v<C, BetweenClause>) {
48 visit(select_clause);
49 } else if constexpr (std::is_same_v<C, AtClause>) {
50 visit(select_clause);
51 }
52 }, query.clause);
53}
54
55void Printer::visit(const PutQuery& query) noexcept {
56 output_ << "PUT ";
57 visit(query.metric);
58 output_ << " ";
59 visit(query.timestamp);
60 output_ << " ";
61 visit(query.value);
62 output_ << " INTO ";
63 visit(query.table_name);
64 if (query.tag_list.has_value()) {
65 output_ << " TAGS ";
66 visit(query.tag_list.value());
67 }
68}
69
70void Printer::visit(const DeleteQuery& query) noexcept {
71 output_ << "DELETE ";
72 visit(query.metric);
73 output_ << " ";
74 visit(query.timestamp);
75 output_ << " FROM ";
76 visit(query.table_name);
77 if (query.tag_list.has_value()) {
78 output_ << " TAGS ";
79 visit(query.tag_list.value());
80 }
81}
82
83void Printer::visit(const CreateQuery& query) noexcept {
84 output_ << "CREATE TABLE ";
85 visit(query.table_name);
86 if (query.tag_columns.has_value()) {
87 output_ << " TAGS ";
88 visit(query.tag_columns.value());
89 }
90}
91
92void Printer::visit(const DropQuery& query) noexcept {
93 output_ << "DROP TABLE ";
94 visit(query.table_name);
95}
96
97void Printer::visit(const AddQuery& query) noexcept {
98 output_ << "ADD TAGS ";
99 visit(query.tag_columns);
100 output_ << " TO ";
101 visit(query.table_name);
102}
103
104void Printer::visit(const RemoveQuery& query) noexcept {
105 output_ << "REMOVE TAGS ";
106 visit(query.tag_columns);
107 output_ << " FROM ";
108 visit(query.table_name);
109}
110
111void Printer::visit(const TablesQuery& query) noexcept {
112 output_ << "TABLES";
113}
114
115void Printer::visit(const AllClause& clause) noexcept {
116 output_ << "ALL";
117 if (clause.where_clause) {
118 output_ << " ";
119 visit(clause.where_clause.value());
120 }
121}
122
123void Printer::visit(const BetweenClause& clause) noexcept {
124 output_ << "BETWEEN ";
125 visit(clause.start);
126 output_ << " AND ";
127 visit(clause.end);
128 if (clause.where_clause) {
129 output_ << " ";
130 visit(clause.where_clause.value());
131 }
132}
133
134void Printer::visit(const AtClause& clause) noexcept {
135 output_ << "AT ";
136 visit(clause.timestamp);
137 if (clause.where_clause) {
138 output_ << " ";
139 visit(clause.where_clause.value());
140 }
141}
142
143void Printer::visit(const WhereClause& clause) noexcept {
144 output_ << "WHERE ";
145 visit(clause.tag_list);
146}
147
148void Printer::visit(const SelectType& type) noexcept {
149 std::visit([this](auto&& type) {
150 using T = std::decay_t<decltype(type)>;
151 if constexpr (std::is_same_v<T, SelectTypeDataExpr>) {
152 output_ << "DATA";
153 } else if constexpr (std::is_same_v<T, SelectTypeCountExpr>) {
154 output_ << "COUNT";
155 } else if constexpr (std::is_same_v<T, SelectTypeAvgExpr>) {
156 output_ << "AVG";
157 } else if constexpr (std::is_same_v<T, SelectTypeSumExpr>) {
158 output_ << "SUM";
159 } else if constexpr (std::is_same_v<T, SelectTypeMinExpr>) {
160 output_ << "MIN";
161 } else if constexpr (std::is_same_v<T, SelectTypeMaxExpr>) {
162 output_ << "MAX";
163 }
164 }, type);
165}
166
167void Printer::visit(const MetricExpr& metric) noexcept {
168 output_ << metric.token.lexeme();
169}
170
171void Printer::visit(const TableNameExpr& table_name) noexcept {
172 output_ << table_name.token.lexeme();
173}
174
175void Printer::visit(const TagKeyExpr& tag_key) noexcept {
176 output_ << tag_key.token.lexeme();
177}
178
179void Printer::visit(const TagValueExpr& tag_value) noexcept {
180 output_ << tag_value.token.lexeme();
181}
182
183void Printer::visit(const TagExpr& tag) noexcept {
184 visit(tag.key);
185 output_ << "=";
186 visit(tag.value);
187}
188
189void Printer::visit(const TagListExpr& tag_list) noexcept {
190 auto first{true};
191 for (const auto& tag : tag_list.tags) {
192 if (!first) {
193 output_ << ", ";
194 }
195 visit(tag);
196 first = false;
197 }
198}
199
200void Printer::visit(const TagColumnsExpr& tag_columns) noexcept {
201 auto first{true};
202 for (const auto& tag_key : tag_columns.keys) {
203 if (!first) {
204 output_ << ", ";
205 }
206 visit(tag_key);
207 first = false;
208 }
209}
210
211void Printer::visit(const TimestampExpr& timestamp) noexcept {
212 output_ << timestamp.token.lexeme();
213}
214
215void Printer::visit(const ValueExpr& value) noexcept {
216 output_ << value.token.lexeme();
217}
218} // namespace vkdb
std::string print(const Expr &expr) noexcept
Prints the given expression.
Definition printer.cpp:4