Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
query_dialect.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
7#include "database_types.h"
9
10#include <memory>
11#include <string>
12#include <vector>
13#include <map>
14#include <variant>
15
16namespace database
17{
18 // Forward declarations
19 class query_condition;
20 enum class join_type;
21 enum class sort_order;
22
35 {
36 public:
37 virtual ~query_dialect() = default;
38
39 // Query type setting
41 virtual void set_query_type(query_type type) = 0;
42 virtual query_type get_query_type() const = 0;
43
44 // SELECT operations
45 virtual void set_select_columns(const std::vector<std::string>& columns) = 0;
46 virtual void set_from_table(const std::string& table) = 0;
47
48 // WHERE conditions
49 virtual void add_where_condition(const query_condition& condition) = 0;
50 virtual void add_where_condition(const std::string& field, const std::string& op, const core::database_value& value) = 0;
51
52 // JOIN operations
53 virtual void add_join(const std::string& table, const std::string& condition, join_type type) = 0;
54
55 // GROUP BY and HAVING
56 virtual void set_group_by(const std::vector<std::string>& columns) = 0;
57 virtual void set_having(const std::string& condition) = 0;
58
59 // ORDER BY
60 virtual void add_order_by(const std::string& column, sort_order order) = 0;
61
62 // LIMIT and OFFSET
63 virtual void set_limit(size_t count) = 0;
64 virtual void set_offset(size_t count) = 0;
65
66 // INSERT operations
67 virtual void set_insert_table(const std::string& table) = 0;
68 virtual void set_insert_data(const std::map<std::string, core::database_value>& data) = 0;
69 virtual void set_insert_rows(const std::vector<std::map<std::string, core::database_value>>& rows) = 0;
70
71 // UPDATE operations
72 virtual void set_update_table(const std::string& table) = 0;
73 virtual void set_update_data(const std::map<std::string, core::database_value>& data) = 0;
74
75 // DELETE operations
76 virtual void set_delete_table(const std::string& table) = 0;
77
78 // Collection/Key operations (for NoSQL)
79 virtual void set_collection(const std::string& name) = 0;
80 virtual void set_key(const std::string& key) = 0;
81
82 // Build final query
83 virtual std::string build() const = 0;
84
85 // Reset state
86 virtual void reset() = 0;
87
88 // Get database type
89 virtual database_types get_database_type() const = 0;
90 };
91
92 namespace detail
93 {
98 class sql_dialect final : public query_dialect
99 {
100 public:
101 explicit sql_dialect(database_types db_type);
102 ~sql_dialect() override = default;
103
104 void set_query_type(query_type type) override;
105 query_type get_query_type() const override;
106
107 void set_select_columns(const std::vector<std::string>& columns) override;
108 void set_from_table(const std::string& table) override;
109
110 void add_where_condition(const query_condition& condition) override;
111 void add_where_condition(const std::string& field, const std::string& op, const core::database_value& value) override;
112
113 void add_join(const std::string& table, const std::string& condition, join_type type) override;
114
115 void set_group_by(const std::vector<std::string>& columns) override;
116 void set_having(const std::string& condition) override;
117
118 void add_order_by(const std::string& column, sort_order order) override;
119
120 void set_limit(size_t count) override;
121 void set_offset(size_t count) override;
122
123 void set_insert_table(const std::string& table) override;
124 void set_insert_data(const std::map<std::string, core::database_value>& data) override;
125 void set_insert_rows(const std::vector<std::map<std::string, core::database_value>>& rows) override;
126
127 void set_update_table(const std::string& table) override;
128 void set_update_data(const std::map<std::string, core::database_value>& data) override;
129
130 void set_delete_table(const std::string& table) override;
131
132 void set_collection(const std::string& name) override;
133 void set_key(const std::string& key) override;
134
135 std::string build() const override;
136
137 void reset() override;
138
139 database_types get_database_type() const override;
140
141 private:
144 std::vector<std::string> select_columns_;
145 std::string from_table_;
146 std::vector<query_condition> where_conditions_;
147 std::vector<std::string> joins_;
148 std::vector<std::string> group_by_columns_;
149 std::string having_clause_;
150 std::vector<std::string> order_by_clauses_;
153
154 std::string target_table_;
155 std::map<std::string, core::database_value> set_data_;
156 std::vector<std::map<std::string, core::database_value>> insert_rows_;
157
158 std::string escape_identifier(const std::string& identifier) const;
159 std::string format_value(const core::database_value& value) const;
160 std::string join_type_to_string(join_type type) const;
161 };
162
163#ifdef USE_MONGODB
171 class mongodb_dialect final : public query_dialect
172 {
173 public:
174 mongodb_dialect();
175 ~mongodb_dialect() override = default;
176
177 void set_query_type(query_type type) override;
178 query_type get_query_type() const override;
179
180 void set_select_columns(const std::vector<std::string>& columns) override;
181 void set_from_table(const std::string& table) override;
182
183 void add_where_condition(const query_condition& condition) override;
184 void add_where_condition(const std::string& field, const std::string& op, const core::database_value& value) override;
185
186 void add_join(const std::string& table, const std::string& condition, join_type type) override;
187
188 void set_group_by(const std::vector<std::string>& columns) override;
189 void set_having(const std::string& condition) override;
190
191 void add_order_by(const std::string& column, sort_order order) override;
192
193 void set_limit(size_t count) override;
194 void set_offset(size_t count) override;
195
196 void set_insert_table(const std::string& table) override;
197 void set_insert_data(const std::map<std::string, core::database_value>& data) override;
198 void set_insert_rows(const std::vector<std::map<std::string, core::database_value>>& rows) override;
199
200 void set_update_table(const std::string& table) override;
201 void set_update_data(const std::map<std::string, core::database_value>& data) override;
202
203 void set_delete_table(const std::string& table) override;
204
205 void set_collection(const std::string& name) override;
206 void set_key(const std::string& key) override;
207
208 std::string build() const override;
209
210 void reset() override;
211
212 database_types get_database_type() const override;
213
214 private:
215 enum class operation_type { none, find, insert, update, delete_op, aggregate };
216
217 operation_type op_type_;
218 std::string collection_name_;
219 std::map<std::string, core::database_value> filter_;
220 std::map<std::string, core::database_value> projection_;
221 std::map<std::string, int> sort_spec_;
222 size_t limit_count_;
223 size_t skip_count_;
224
225 std::map<std::string, core::database_value> document_;
226 std::vector<std::map<std::string, core::database_value>> documents_;
227 std::map<std::string, core::database_value> update_spec_;
228
229 std::vector<std::map<std::string, core::database_value>> pipeline_;
230
231 std::string to_json(const std::map<std::string, core::database_value>& data) const;
232 std::string value_to_json(const core::database_value& value) const;
233 };
234#endif // USE_MONGODB
235
236#ifdef USE_REDIS
244 class redis_dialect final : public query_dialect
245 {
246 public:
247 redis_dialect();
248 ~redis_dialect() override = default;
249
250 void set_query_type(query_type type) override;
251 query_type get_query_type() const override;
252
253 void set_select_columns(const std::vector<std::string>& columns) override;
254 void set_from_table(const std::string& table) override;
255
256 void add_where_condition(const query_condition& condition) override;
257 void add_where_condition(const std::string& field, const std::string& op, const core::database_value& value) override;
258
259 void add_join(const std::string& table, const std::string& condition, join_type type) override;
260
261 void set_group_by(const std::vector<std::string>& columns) override;
262 void set_having(const std::string& condition) override;
263
264 void add_order_by(const std::string& column, sort_order order) override;
265
266 void set_limit(size_t count) override;
267 void set_offset(size_t count) override;
268
269 void set_insert_table(const std::string& table) override;
270 void set_insert_data(const std::map<std::string, core::database_value>& data) override;
271 void set_insert_rows(const std::vector<std::map<std::string, core::database_value>>& rows) override;
272
273 void set_update_table(const std::string& table) override;
274 void set_update_data(const std::map<std::string, core::database_value>& data) override;
275
276 void set_delete_table(const std::string& table) override;
277
278 void set_collection(const std::string& name) override;
279 void set_key(const std::string& key) override;
280
281 std::string build() const override;
282
283 void reset() override;
284
285 database_types get_database_type() const override;
286
287 std::vector<std::string> build_args() const;
288
289 private:
290 std::string command_;
291 std::vector<std::string> args_;
292 std::string key_;
293 std::string value_;
294 };
295#endif // USE_REDIS
296
297 } // namespace detail
298
305 std::unique_ptr<query_dialect> create_dialect(database_types type);
306
307} // namespace database
SQL dialect implementation for PostgreSQL, SQLite.
void add_where_condition(const query_condition &condition) override
std::vector< query_condition > where_conditions_
void set_query_type(query_type type) override
void set_collection(const std::string &name) override
~sql_dialect() override=default
query_type get_query_type() const override
void set_offset(size_t count) override
std::string build() const override
void add_order_by(const std::string &column, sort_order order) override
void set_select_columns(const std::vector< std::string > &columns) override
std::string escape_identifier(const std::string &identifier) const
std::vector< std::string > select_columns_
std::string join_type_to_string(join_type type) const
void set_update_data(const std::map< std::string, core::database_value > &data) override
void set_group_by(const std::vector< std::string > &columns) override
std::vector< std::map< std::string, core::database_value > > insert_rows_
std::vector< std::string > order_by_clauses_
std::vector< std::string > joins_
void set_delete_table(const std::string &table) override
void set_insert_table(const std::string &table) override
void set_having(const std::string &condition) override
void set_update_table(const std::string &table) override
void set_insert_data(const std::map< std::string, core::database_value > &data) override
void add_join(const std::string &table, const std::string &condition, join_type type) override
void set_from_table(const std::string &table) override
void set_limit(size_t count) override
std::map< std::string, core::database_value > set_data_
std::string format_value(const core::database_value &value) const
void set_key(const std::string &key) override
sql_dialect(database_types db_type)
database_types get_database_type() const override
void set_insert_rows(const std::vector< std::map< std::string, core::database_value > > &rows) override
std::vector< std::string > group_by_columns_
Represents a WHERE condition in a query.
Abstract interface for database-specific query formatting.
virtual void add_where_condition(const query_condition &condition)=0
virtual void add_order_by(const std::string &column, sort_order order)=0
virtual void set_group_by(const std::vector< std::string > &columns)=0
virtual void set_limit(size_t count)=0
virtual void add_where_condition(const std::string &field, const std::string &op, const core::database_value &value)=0
virtual void set_update_table(const std::string &table)=0
virtual void set_having(const std::string &condition)=0
virtual query_type get_query_type() const =0
virtual void set_key(const std::string &key)=0
virtual ~query_dialect()=default
virtual void set_query_type(query_type type)=0
virtual void set_delete_table(const std::string &table)=0
virtual void add_join(const std::string &table, const std::string &condition, join_type type)=0
virtual void set_insert_data(const std::map< std::string, core::database_value > &data)=0
virtual void set_select_columns(const std::vector< std::string > &columns)=0
virtual database_types get_database_type() const =0
virtual std::string build() const =0
virtual void set_offset(size_t count)=0
virtual void reset()=0
virtual void set_insert_table(const std::string &table)=0
virtual void set_from_table(const std::string &table)=0
virtual void set_collection(const std::string &name)=0
virtual void set_insert_rows(const std::vector< std::map< std::string, core::database_value > > &rows)=0
virtual void set_update_data(const std::map< std::string, core::database_value > &data)=0
Abstract interface for database backends.
Defines the enumeration of supported database types.
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
std::unique_ptr< query_dialect > create_dialect(database_types type)
Factory function to create appropriate dialect for database type.
database_types
Represents various database backends or modes.
@ none
No specific database type is set.
sort_order
Sort order for ORDER BY clauses.
join_type
Types of SQL joins.