AnnaDB 1.0
Loading...
Searching...
No Matches
query_comparision.hpp
1//
2// Created by felix on 19.02.23.
3//
4
27#ifndef ANNADB_DRIVER_QUERY_COMPARISION_HPP
28#define ANNADB_DRIVER_QUERY_COMPARISION_HPP
29
30#include <utility>
31
32#include "TySON.hpp"
33
34namespace annadb::Query
35{
40 enum class ComparisonType
41 {
42 EQ,
43 NEQ,
44 GT,
45 GTE,
46 LT,
47 LTE,
48 AND,
49 OR,
50 NOT
51 };
52
57 {
58 tyson::TySonObject value_;
59
60 [[nodiscard]] virtual std::string to_string()
61 {
62 std::stringstream sstream;
63 sstream << name_ << "{";
64
65 if (field_ == "root")
66 {
67 sstream << "root: ";
68 }
69 else
70 {
71 sstream << "value|" << field_ << "|: ";
72 }
73
74 sstream << value_ << "}";
75 return sstream.str();
76 }
77
78 friend std::ostream &operator<<(std::ostream &out, Comparison &obj)
79 {
80 return out << obj.to_string();
81 }
82
83 protected:
84 std::string field_;
85 std::string name_;
86
87 public:
88 explicit Comparison(std::string_view &field, std::string_view name) : value_(tyson::TySonObject::Null()),
89 field_(field), name_(name)
90 {}
91
92 explicit Comparison(std::string field, std::string_view name) : value_(tyson::TySonObject::Null()),
93 field_(std::move(field)), name_(name)
94 {}
95
96 template<std::convertible_to<tyson::TySonObject> T>
97 explicit
98 Comparison(T value, std::string_view name) : value_(std::forward<tyson::TySonObject>(value)), field_("root"),
99 name_(name)
100 {}
101
102 Comparison(tyson::TySonObject &value, std::string_view field, std::string_view name) : value_(value),
103 field_(field),
104 name_(name)
105 {}
106
107 virtual ~Comparison() = default;
108
109 std::string str()
110 {
111 return to_string();
112 }
113
114 ComparisonType type()
115 {
116 if (name_ == "eq")
117 {
118 return ComparisonType::EQ;
119 }
120 else if (name_ == "neq")
121 {
122 return ComparisonType::NEQ;
123 }
124 else if (name_ == "gt")
125 {
126 return ComparisonType::GT;
127 }
128 else if (name_ == "gte")
129 {
130 return ComparisonType::GTE;
131 }
132 else if (name_ == "lt")
133 {
134 return ComparisonType::LT;
135 }
136 else if (name_ == "lte")
137 {
138 return ComparisonType::LTE;
139 }
140 else if (name_ == "and")
141 {
142 return ComparisonType::AND;
143 }
144 else if (name_ == "or")
145 {
146 return ComparisonType::OR;
147 }
148 else
149 {
150 return ComparisonType::NOT;
151 }
152 }
153 };
154
158 class Eq : public Comparison
159 {
160 public:
161 explicit Eq(tyson::TySonObject &value) : Comparison(value, "eq") {};
162 Eq(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "eq") {};
163 explicit Eq(tyson::TySonObject &&value) : Comparison(value, "eq") {};
164 Eq(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "eq") {};
165 };
166
170 class Neq : public Comparison
171 {
172 public:
173 explicit Neq(tyson::TySonObject &value) : Comparison(value, "neq") {};
174 Neq(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "neq") {};
175 explicit Neq(tyson::TySonObject &&value) : Comparison(value, "neq") {};
176 Neq(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "neq") {};
177 };
178
182 class Gt : public Comparison
183 {
184 public:
185 explicit Gt(tyson::TySonObject &value) : Comparison(value, "gt") {};
186 Gt(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "gt") {};
187 explicit Gt(tyson::TySonObject &&value) : Comparison(value, "gt") {};
188 Gt(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "gt") {};
189 };
190
194 class Gte : public Comparison
195 {
196 public:
197 explicit Gte(tyson::TySonObject &value) : Comparison(value, "gte") {};
198 Gte(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "gte") {};
199 explicit Gte(tyson::TySonObject &&value) : Comparison(value, "gte") {};
200 Gte(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "gte") {};
201 };
202
206 class Lt : public Comparison
207 {
208 public:
209 explicit Lt(tyson::TySonObject &value) : Comparison(value, "lt") {};
210 Lt(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "lt") {};
211 explicit Lt(tyson::TySonObject &&value) : Comparison(value, "lt") {};
212 Lt(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "lt") {};
213 };
214
218 class Lte : public Comparison
219 {
220 public:
221 explicit Lte(const tyson::TySonObject &value) : Comparison(value, "lte") {};
222 Lte(std::string_view path_to_field, tyson::TySonObject &value) : Comparison(value, path_to_field, "lte") {};
223 explicit Lte(const tyson::TySonObject &&value) : Comparison(value, "lte") {};
224 Lte(std::string_view path_to_field, tyson::TySonObject &&value) : Comparison(value, path_to_field, "lte") {};
225 };
226
230 class And : public Comparison
231 {
232 std::vector<Comparison> compares_{};
233
234 [[nodiscard]] std::string to_string() override
235 {
236 std::stringstream sstream;
237 sstream << "and[";
238
239 std::for_each(compares_.begin(), compares_.end(), [&sstream](Comparison &val) { sstream << val << ","; });
240 sstream << "]";
241 return sstream.str();
242 }
243
244 public:
249 template<std::convertible_to<Comparison> ...Comps>
250 And(Comps ...comps) : Comparison("", "and")
251 {
252 compares_.reserve(sizeof ...(comps));
253 (compares_.emplace_back(comps), ...);
254 }
255 };
256
260 class Or : public Comparison
261 {
262 std::vector<Comparison> compares_{};
263
264 [[nodiscard]] std::string to_string() override
265 {
266 std::stringstream sstream;
267 sstream << "or[";
268
269 std::for_each(compares_.begin(), compares_.end(), [&sstream](Comparison &val) { sstream << val << ","; });
270 sstream << "]";
271 return sstream.str();
272 }
273
274 public:
279 template<std::convertible_to<Comparison> ...Comps>
280 explicit Or(Comps ...comps) : Comparison("", "or")
281 {
282 compares_.reserve(sizeof ...(comps));
283 (compares_.emplace_back(comps), ...);
284 }
285 };
286
290 class Not : public Comparison
291 {
292 [[nodiscard]] std::string to_string() override
293 {
294 return name_ + "(value|" + field_ + "|)";
295 }
296
297 public:
298 explicit Not(std::string_view field) : Comparison(field, "not")
299 {};
300 };
301
302}
303
304#endif //ANNADB_DRIVER_QUERY_COMPARISION_HPP
Definition: query_comparision.hpp:231
And(Comps ...comps)
Definition: query_comparision.hpp:250
Definition: query_comparision.hpp:57
Definition: query_comparision.hpp:159
Definition: query_comparision.hpp:183
Definition: query_comparision.hpp:195
Definition: query_comparision.hpp:207
Definition: query_comparision.hpp:219
Definition: query_comparision.hpp:171
Definition: query_comparision.hpp:291
Definition: query_comparision.hpp:261
Or(Comps ...comps)
Definition: query_comparision.hpp:280
Definition: TySON.hpp:86
static TySonObject Null() noexcept
Definition: TySON.hpp:402
Definition: query.hpp:15
ComparisonType
Definition: query_comparision.hpp:41