vkdb
A time series database engine in C++.
Loading...
Searching...
No Matches
friendly_builder.h
1#ifndef QUERY_FRIENDLY_BUILDER_H
2#define QUERY_FRIENDLY_BUILDER_H
3
4#include <vkdb/builder.h>
5
6namespace vkdb {
12template <ArithmeticNoCVRefQuals TValue>
14public:
15 using size_type = typename QueryBuilder<TValue>::size_type;
17 using result_type = std::vector<value_type>;
18
24
33 LSMTree<TValue>& lsm_tree,
34 const TagColumns& tag_columns
35 ) noexcept
36 : query_builder_{QueryBuilder<TValue>(lsm_tree, tag_columns)} {}
37
44 : query_builder_{std::move(query_builder)} {}
45
51
58 ) noexcept = default;
59
64 FriendlyQueryBuilder(const FriendlyQueryBuilder&) noexcept = default;
65
72 ) noexcept = default;
73
78 ~FriendlyQueryBuilder() noexcept = default;
79
92 [[nodiscard]] FriendlyQueryBuilder& get(
93 Timestamp timestamp, Metric metric,
94 const TagTable& tag_table
95 ) {
96 TimeSeriesKey key{timestamp, metric, tag_table};
97 std::ignore = query_builder_.point(key);
98 return *this;
99 }
100
110 [[nodiscard]] FriendlyQueryBuilder& whereMetricIs(const Metric& metric) {
111 std::ignore = query_builder_.filterByMetric(metric);
112 return *this;
113 }
114
125 template <typename... Metrics>
128 const Metrics&... metrics
129 ) {
130 std::ignore = query_builder_.filterByAnyMetrics(metrics...);
131 return *this;
132 }
133
144 const Timestamp& timestamp
145 ) {
146 std::ignore = query_builder_.filterByTimestamp(timestamp);
147 return *this;
148 }
149
161 const Timestamp& start,
162 const Timestamp& end
163 ) {
164 TimeSeriesKey start_key{start, MIN_METRIC, {}};
165 TimeSeriesKey end_key{end, MAX_METRIC, {}};
166 std::ignore = query_builder_.range(start_key, end_key);
167 return *this;
168 }
169
180 template <typename... Timestamps>
183 const Timestamps&... timestamps
184 ) {
185 std::ignore = query_builder_.filterByAnyTimestamps(timestamps...);
186 return *this;
187 }
188
198 [[nodiscard]] FriendlyQueryBuilder& whereTagsContain(const Tag& tag) {
199 std::ignore = query_builder_.filterByTag(tag.first, tag.second);
200 return *this;
201 }
202
213 template <typename... Tags>
216 const Tags&... tags
217 ) {
218 std::ignore = query_builder_.filterByAnyTags(tags...);
219 return *this;
220 }
221
232 template <typename... Tags>
235 const Tags&... tags
236 ) {
237 std::ignore = query_builder_.filterByAllTags(tags...);
238 return *this;
239 }
240
254 [[nodiscard]] FriendlyQueryBuilder& put(
255 Timestamp timestamp,
256 Metric metric,
257 const TagTable& tag_table, TValue value
258 ) {
259 if (
260 metric.empty() ||
261 metric.length() > TimeSeriesKey::MAX_METRIC_LENGTH
262 ) {
263 throw std::runtime_error{
264 "FriendlyQueryBuilder::get(): Invalid metric '" + metric + "'."
265 };
266 }
267 TimeSeriesKey key{timestamp, metric, tag_table};
268 std::ignore = query_builder_.put(key, value);
269 return *this;
270 }
271
285 Timestamp timestamp,
286 Metric metric,
287 const TagTable& tag_table
288 ) {
289 TimeSeriesKey key{timestamp, metric, tag_table};
290 std::ignore = query_builder_.remove(key);
291 return *this;
292 }
293
303 [[nodiscard]] size_type count() {
304 return query_builder_.count();
305 }
306
316 [[nodiscard]] TValue sum() {
317 return query_builder_.sum();
318 }
319
329 [[nodiscard]] double avg() {
330 return query_builder_.avg();
331 }
332
342 [[nodiscard]] TValue min() {
343 return query_builder_.min();
344 }
345
355 [[nodiscard]] TValue max() {
356 return query_builder_.max();
357 }
358
367 result_type execute(){
368 auto result{query_builder_.execute() |
369 std::views::transform([](const auto& entry) {
370 return DataPoint<TValue>{
371 entry.first.timestamp(),
372 entry.first.metric(),
373 entry.first.tags(),
374 entry.second.value()
375 };
376 })};
377 return {result.begin(), result.end()};
378 }
379
380private:
385 QueryBuilder<TValue> query_builder_;
386};
387} // namespace vkdb
388
389#endif // QUERY_FRIENDLY_BUILDER_H
Friendly query builder for querying a Table.
FriendlyQueryBuilder(LSMTree< TValue > &lsm_tree, const TagColumns &tag_columns) noexcept
Construct a new FriendlyQueryBuilder object.
FriendlyQueryBuilder & whereMetricIsAnyOf(const Metrics &... metrics)
Configure builder for where metric is any of clause.
double avg()
Calculate the average of the values in the range.
FriendlyQueryBuilder(FriendlyQueryBuilder &&) noexcept=default
Move-construct a FriendlyQueryBuilder object.
FriendlyQueryBuilder & whereTagsContain(const Tag &tag)
Configure builder for where tags contain clause.
FriendlyQueryBuilder(QueryBuilder< TValue > &&query_builder)
Construct a new FriendlyQueryBuilder object.
size_type count()
Count the number of entries in the range.
result_type execute()
Execute the query.
FriendlyQueryBuilder & remove(Timestamp timestamp, Metric metric, const TagTable &tag_table)
Configure builder for remove query.
FriendlyQueryBuilder()=delete
Deleted default constructor.
FriendlyQueryBuilder & whereTimestampBetween(const Timestamp &start, const Timestamp &end)
Configure builder for where timestamp is between clause.
FriendlyQueryBuilder & whereTimestampIs(const Timestamp &timestamp)
Configure builder for where timestamp is clause.
TValue max()
Calculate the maximum value in the range.
FriendlyQueryBuilder & put(Timestamp timestamp, Metric metric, const TagTable &tag_table, TValue value)
Configure builder for put query.
TValue min()
Calculate the minimum value in the range.
FriendlyQueryBuilder & get(Timestamp timestamp, Metric metric, const TagTable &tag_table)
Configure builder for get query.
FriendlyQueryBuilder & whereTimestampIsAnyOf(const Timestamps &... timestamps)
Configure builder for where timestamp is any of clause.
FriendlyQueryBuilder & whereTagsContainAllOf(const Tags &... tags)
Configure builder for where tags contain all of clause.
TValue sum()
Sum the values in the range.
FriendlyQueryBuilder & whereMetricIs(const Metric &metric)
Configure builder for where metric is clause.
FriendlyQueryBuilder & whereTagsContainAnyOf(const Tags &... tags)
Configure builder for where tags contain any of clause.
LSM tree on TimeSeriesKey.
Definition wal_lsm.h:8
Query builder for querying a Table.
Definition builder.h:26
Represents a key in vkdb.
static constexpr auto MAX_METRIC_LENGTH
Metric width.
Concept for types that are all convertible to another and have no cv- or ref-qualifiers.
Definition concepts.h:79
STL namespace.
Represents a datapoint in vkdb.