10#include <gtest/gtest.h>
42 std::vector<std::string> cols = {
"id",
"name",
"email"};
43 auto query = builder_->select(cols)
47 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
48 EXPECT_TRUE(query.find(
"FROM") != std::string::npos);
53 auto query = builder_->select({
"*"}).from(
"users").build();
54 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
55 EXPECT_TRUE(query.find(
"*") != std::string::npos);
64 std::vector<std::string> cols = {
"u.id",
"u.name",
"o.total"};
65 auto query = builder_->select(cols)
70 EXPECT_TRUE(query.find(
"INNER JOIN") != std::string::npos);
71 EXPECT_TRUE(query.find(
"ON u.id = o.user_id") != std::string::npos);
76 auto query = builder_->select({
"*"})
81 EXPECT_TRUE(query.find(
"LEFT JOIN") != std::string::npos);
86 auto query = builder_->select({
"*"})
91 EXPECT_TRUE(query.find(
"RIGHT JOIN") != std::string::npos);
96 auto query = builder_->select({
"*"})
101 EXPECT_TRUE(query.find(
"FULL OUTER JOIN") != std::string::npos);
106 auto query = builder_->select({
"*"})
111 EXPECT_TRUE(query.find(
"CROSS JOIN") != std::string::npos);
116 std::vector<std::string> cols = {
"u.id",
"u.name",
"o.total",
"p.name"};
117 auto query = builder_->select(cols)
119 .join(
"orders o",
"u.id = o.user_id")
123 EXPECT_TRUE(query.find(
"INNER JOIN") != std::string::npos);
124 EXPECT_TRUE(query.find(
"LEFT JOIN") != std::string::npos);
133 auto query = builder_->select({
"*"})
138 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
139 EXPECT_TRUE(query.find(
"active") != std::string::npos);
140 EXPECT_TRUE(query.find(
"TRUE") != std::string::npos);
145 auto query = builder_->select({
"*"})
150 EXPECT_TRUE(query.find(
"'active'") != std::string::npos);
155 auto query = builder_->select({
"*"})
160 EXPECT_TRUE(query.find(
"> 18") != std::string::npos);
165 auto query = builder_->select({
"*"})
170 EXPECT_TRUE(query.find(
"price") != std::string::npos);
171 EXPECT_TRUE(query.find(
"<") != std::string::npos);
176 auto query = builder_->select({
"*"})
182 EXPECT_TRUE(query.find(
"AND") != std::string::npos);
189 auto combined = cond1 && cond2;
191 auto query = builder_->select({
"*"})
196 EXPECT_TRUE(query.find(
"AND") != std::string::npos);
203 auto combined = cond1 || cond2;
205 auto query = builder_->select({
"*"})
210 EXPECT_TRUE(query.find(
"OR") != std::string::npos);
219 std::vector<std::string> cols = {
"department",
"COUNT(*)"};
220 auto query = builder_->select(cols)
222 .group_by(
"department")
225 EXPECT_TRUE(query.find(
"GROUP BY") != std::string::npos);
230 std::vector<std::string> cols = {
"department",
"city",
"COUNT(*)"};
231 std::vector<std::string> group_cols = {
"department",
"city"};
232 auto query = builder_->select(cols)
234 .group_by(group_cols)
237 EXPECT_TRUE(query.find(
"GROUP BY") != std::string::npos);
242 std::vector<std::string> cols = {
"department",
"COUNT(*) as count"};
243 auto query = builder_->select(cols)
245 .group_by(
"department")
246 .having(
"COUNT(*) > 5")
249 EXPECT_TRUE(query.find(
"GROUP BY") != std::string::npos);
250 EXPECT_TRUE(query.find(
"HAVING") != std::string::npos);
251 EXPECT_TRUE(query.find(
"COUNT(*) > 5") != std::string::npos);
260 auto query = builder_->select({
"*"})
265 EXPECT_TRUE(query.find(
"ORDER BY") != std::string::npos);
266 EXPECT_TRUE(query.find(
"name ASC") != std::string::npos);
271 auto query = builder_->select({
"*"})
276 EXPECT_TRUE(query.find(
"ORDER BY") != std::string::npos);
277 EXPECT_TRUE(query.find(
"created_at DESC") != std::string::npos);
282 auto query = builder_->select({
"*"})
288 EXPECT_TRUE(query.find(
"ORDER BY") != std::string::npos);
289 EXPECT_TRUE(query.find(
"category ASC") != std::string::npos);
290 EXPECT_TRUE(query.find(
"price DESC") != std::string::npos);
299 auto query = builder_->select({
"*"})
304 EXPECT_TRUE(query.find(
"LIMIT 10") != std::string::npos);
309 auto query = builder_->select({
"*"})
315 EXPECT_TRUE(query.find(
"LIMIT 10") != std::string::npos);
316 EXPECT_TRUE(query.find(
"OFFSET 20") != std::string::npos);
325 std::map<std::string, core::database_value> data;
329 auto query = builder_->insert_into(
"users")
333 EXPECT_TRUE(query.find(
"INSERT INTO") != std::string::npos);
334 EXPECT_TRUE(query.find(
"VALUES") != std::string::npos);
339 std::vector<std::map<std::string, core::database_value>> rows;
341 std::map<std::string, core::database_value> row1;
344 rows.push_back(row1);
346 std::map<std::string, core::database_value> row2;
349 rows.push_back(row2);
351 auto query = builder_->insert_into(
"users")
355 EXPECT_TRUE(query.find(
"INSERT INTO") != std::string::npos);
356 EXPECT_TRUE(query.find(
"VALUES") != std::string::npos);
365 auto query = builder_->update(
"users")
370 EXPECT_TRUE(query.find(
"UPDATE") != std::string::npos);
371 EXPECT_TRUE(query.find(
"SET") != std::string::npos);
372 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
377 std::map<std::string, core::database_value> data;
381 auto query = builder_->update(
"users")
386 EXPECT_TRUE(query.find(
"UPDATE") != std::string::npos);
387 EXPECT_TRUE(query.find(
"SET") != std::string::npos);
396 auto query = builder_->delete_from(
"users")
400 EXPECT_TRUE(query.find(
"DELETE FROM") != std::string::npos);
401 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
406 auto query = builder_->delete_from(
"users")
411 EXPECT_TRUE(query.find(
"DELETE FROM") != std::string::npos);
412 EXPECT_TRUE(query.find(
"AND") != std::string::npos);
422 auto query = pg_builder.
select({
"*"})
427 EXPECT_TRUE(query.find(
"\"users\"") != std::string::npos);
433 auto query = sqlite_builder.
select({
"*"})
438 EXPECT_TRUE(query.find(
"[users]") != std::string::npos);
447 builder_->select({
"*"}).from(
"users").limit(10);
452 auto query = builder_->select({
"id"}).from(
"test_table").build();
453 EXPECT_TRUE(query.find(
"test_table") != std::string::npos);
454 EXPECT_TRUE(query.find(
"users") == std::string::npos);
459 builder_->select({
"*"}).from(
"users").limit(10);
462 auto query = builder_->select({
"*"}).from(
"products").build();
463 EXPECT_TRUE(query.find(
"products") != std::string::npos);
464 EXPECT_TRUE(query.find(
"users") == std::string::npos);
473 std::vector<std::string> cols = {
"u.id",
"u.name",
"COUNT(o.id) as order_count"};
474 std::vector<std::string> group_cols = {
"u.id",
"u.name"};
475 auto query = builder_->select(cols)
479 .group_by(group_cols)
480 .having(
"COUNT(o.id) > 5")
485 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
486 EXPECT_TRUE(query.find(
"LEFT JOIN") != std::string::npos);
487 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
488 EXPECT_TRUE(query.find(
"GROUP BY") != std::string::npos);
489 EXPECT_TRUE(query.find(
"HAVING") != std::string::npos);
490 EXPECT_TRUE(query.find(
"ORDER BY") != std::string::npos);
491 EXPECT_TRUE(query.find(
"LIMIT") != std::string::npos);
500 auto query = builder_->select({
"*"}).from(
"users").build();
502 EXPECT_FALSE(query.find(
"WHERE") != std::string::npos);
513 auto query = builder_->select({
"*"})
517 EXPECT_TRUE(query.find(
"[users]") != std::string::npos);
Universal query builder that adapts to different database types.
query_builder & select(const std::vector< std::string > &columns)
std::string build() const
query_builder & limit(size_t count)
Represents a WHERE condition in a query.
std::unique_ptr< query_builder > builder_
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
TEST_F(SQLQueryBuilderTest, SimpleSelect)
@ sqlite
Indicates a SQLite database.
@ postgres
Indicates a PostgreSQL database.