vkdb
A time series database engine in C++.
Loading...
Searching...
No Matches
interpreter.h
1#ifndef QUERY_INTERPRETER_H
2#define QUERY_INTERPRETER_H
3
4#include <vkdb/friendly_builder.h>
5#include <vkdb/expr.h>
6#include <sstream>
7#include <iostream>
8#include <string>
9#include <variant>
10
11namespace vkdb {
12class Database;
13
18using MetricExprResult = Metric;
19
24using TableNameExprResult = std::string;
25
30using TimestampExprResult = Timestamp;
31
36using ValueExprResult = double;
37
42using TagKeyExprResult = TagKey;
43
48using TagValueExprResult = TagValue;
49
54using TagExprResult = Tag;
55
60using TagListExprResult = TagTable;
61
66using TagColumnsExprResult = TagColumns;
67
72using SelectDataResult = std::vector<DataPoint<double>>;
73
78using SelectDoubleResult = double;
79
84using SelectCountResult = uint64_t;
85
91using SelectResult = std::variant<
92 SelectDataResult,
93 SelectDoubleResult,
94 SelectCountResult
95>;
96
101using SelectTypeResult = SelectType;
102
107using WhereClauseResult = TagListExprResult;
108
113using AllClauseResult = std::optional<WhereClauseResult>;
114
121using BetweenClauseResult = std::tuple<
122 TimestampExprResult,
123 TimestampExprResult,
124 std::optional<WhereClauseResult>
125>;
126
132using AtClauseResult = std::pair<
133 TimestampExprResult,
134 std::optional<WhereClauseResult>
135>;
136
142using SelectClauseResult = std::variant<
143 AllClauseResult,
144 BetweenClauseResult,
145 AtClauseResult
146>;
147
152using PutResult = void;
153
158using DeleteResult = void;
159
164using CreateResult = void;
165
170using DropResult = void;
171
176using AddResult = void;
177
182using RemoveResult = void;
183
188using TablesResult = std::vector<std::string>;
189
195using OutputResult = std::variant<SelectResult, TablesResult>;
196
201using Result = std::optional<OutputResult>;
202
207using Results = std::vector<Result>;
208
213static const std::string INTERPRETER_DEFAULT_DATABASE{"interpreter_default"};
214
220public:
227 RuntimeError(Token token, const std::string& message) noexcept;
228
234 [[nodiscard]] Token token() const noexcept;
235
241 [[nodiscard]] std::string message() const noexcept;
242
243private:
248 Token token_;
249
254 std::string message_;
255};
256
262public:
263 using error_callback = std::function<void(const RuntimeError&)>;
264
272 explicit Interpreter(
273 Database& database,
274 error_callback callback = [](const RuntimeError&) {}
275 ) noexcept;
276
284 void interpret(
285 const Expr& expr,
286 std::ostream& stream = std::cout
287 ) const noexcept;
288
289private:
296 [[nodiscard]] std::string to_string(const OutputResult& result) const;
297
304 [[nodiscard]] std::string to_string(const SelectResult& result) const;
305
312 [[nodiscard]] std::string to_string(const TablesResult& result) const;
313
321 [[nodiscard]] Results visit(const Expr& expr) const;
322
330 [[nodiscard]] Result visit(const Query& query) const;
331
338 static void add_optional_tag_list(
339 FriendlyQueryBuilder<double> &query_builder,
340 const std::optional<TagListExprResult>& tag_list
341 ) noexcept;
342
352 [[nodiscard]]
353 static SelectResult handle_select_type(
354 FriendlyQueryBuilder<double> &query_builder,
355 SelectType type
356 );
357
367 [[nodiscard]] SelectResult visit(const SelectQuery& query) const;
368
377 PutResult visit(const PutQuery& query) const;
378
387 DeleteResult visit(const DeleteQuery& query) const;
388
397 CreateResult visit(const CreateQuery& query) const;
398
407 DropResult visit(const DropQuery& query) const;
408
417 AddResult visit(const AddQuery& query) const;
418
427 RemoveResult visit(const RemoveQuery& query) const;
428
438 [[nodiscard]] TablesResult visit(const TablesQuery& query) const;
439
449 [[nodiscard]] AllClauseResult visit(const AllClause& clause) const;
450
460 [[nodiscard]] BetweenClauseResult visit(const BetweenClause& clause) const;
461
471 [[nodiscard]] AtClauseResult visit(const AtClause& clause) const;
472
481 [[nodiscard]] WhereClauseResult visit(const WhereClause& clause) const;
482
489 [[nodiscard]] SelectTypeResult visit(const SelectType& type) const noexcept;
490
497 [[nodiscard]] MetricExprResult visit(
498 const MetricExpr& metric
499 ) const noexcept;
500
507 [[nodiscard]] TableNameExprResult visit(
508 const TableNameExpr& table_name
509 ) const noexcept;
510
517 [[nodiscard]] TagKeyExprResult visit(
518 const TagKeyExpr& tag_key
519 ) const noexcept;
520
527 [[nodiscard]] TagValueExprResult visit(
528 const TagValueExpr& tag_value
529 ) const noexcept;
530
537 [[nodiscard]] TagExprResult visit(const TagExpr& tag) const noexcept;
538
547 [[nodiscard]] TagListExprResult visit(const TagListExpr& tag_list) const;
548
557 [[nodiscard]] TagColumnsExprResult visit(
558 const TagColumnsExpr& tag_columns
559 ) const;
560
569 [[nodiscard]] TimestampExprResult visit(
570 const TimestampExpr& timestamp
571 ) const;
572
581 [[nodiscard]] ValueExprResult visit(const ValueExpr& value) const;
582
587 error_callback callback_;
588
593 Database& database_;
594};
595
596} // namespace vkdb
597
598#endif // QUERY_INTERPRETER_H
Represents a database in vkdb.
Definition database.h:20
Friendly query builder for querying a Table.
Interpreter for vq.
void interpret(const Expr &expr, std::ostream &stream=std::cout) const noexcept
Interpret the expression.
Interpreter(Database &database, error_callback callback=[](const RuntimeError &) {}) noexcept
Construct a new Interpreter object.
Runtime error.
Token token() const noexcept
Get the token.
std::string message() const noexcept
Get the message.
RuntimeError(Token token, const std::string &message) noexcept
Construct a new Runtime Error object.
Represents a token.
Definition token.h:81
Add query.
Definition expr.h:420
All clause.
Definition expr.h:141
At clause.
Definition expr.h:177
Between clause.
Definition expr.h:153
Create query.
Definition expr.h:390
Delete query.
Definition expr.h:360
Drop query.
Definition expr.h:408
Metric expression.
Definition expr.h:15
Put query.
Definition expr.h:324
Remove query.
Definition expr.h:438
Select query.
Definition expr.h:293
Table name expression.
Definition expr.h:27
Tables query.
Definition expr.h:456
Tag columns expression.
Definition expr.h:75
Tag expression.
Definition expr.h:99
Tag key expression.
Definition expr.h:63
Tag list expression.
Definition expr.h:117
Tag value expression.
Definition expr.h:87
Timestamp expression.
Definition expr.h:39
Value expression.
Definition expr.h:51
Where clause.
Definition expr.h:129