Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
query_builder_usage.cpp
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
22#include <iostream>
23#include <string>
24#include <vector>
25#include <map>
26
29
30using namespace database;
31
32int main()
33{
34 std::cout << "=== query_builder_usage example ===" << std::endl;
35
36 // -------------------------------------------------------
37 // 1. SELECT query
38 // -------------------------------------------------------
39 std::cout << "\n--- SELECT ---" << std::endl;
40 {
41 query_builder builder(database_types::postgres);
42
43 auto query = builder.select({"id", "name", "email"})
44 .from("users")
45 .where("age", ">=", int64_t{18})
46 .where("is_active", "=", true)
47 .order_by("name", sort_order::asc)
48 .limit(20)
49 .offset(0)
50 .build();
51
52 std::cout << "SELECT query:\n " << query << std::endl;
53 }
54
55 // -------------------------------------------------------
56 // 2. INSERT query
57 // -------------------------------------------------------
58 std::cout << "\n--- INSERT ---" << std::endl;
59 {
60 query_builder builder(database_types::postgres);
61
62 std::map<std::string, core::database_value> row;
63 row["name"] = std::string("Alice");
64 row["email"] = std::string("alice@example.com");
65 row["age"] = int64_t{30};
66 row["is_active"] = true;
67
68 auto query = builder.insert_into("users").values(row).build();
69
70 std::cout << "INSERT query:\n " << query << std::endl;
71 }
72
73 // -------------------------------------------------------
74 // 3. Batch INSERT query
75 // -------------------------------------------------------
76 std::cout << "\n--- Batch INSERT ---" << std::endl;
77 {
78 query_builder builder(database_types::postgres);
79
80 std::vector<std::map<std::string, core::database_value>> rows;
81
82 std::map<std::string, core::database_value> row1;
83 row1["name"] = std::string("Bob");
84 row1["email"] = std::string("bob@example.com");
85 row1["age"] = int64_t{25};
86 rows.push_back(row1);
87
88 std::map<std::string, core::database_value> row2;
89 row2["name"] = std::string("Carol");
90 row2["email"] = std::string("carol@example.com");
91 row2["age"] = int64_t{28};
92 rows.push_back(row2);
93
94 auto query = builder.insert_into("users").values(rows).build();
95
96 std::cout << "Batch INSERT query:\n " << query << std::endl;
97 }
98
99 // -------------------------------------------------------
100 // 4. UPDATE query
101 // -------------------------------------------------------
102 std::cout << "\n--- UPDATE ---" << std::endl;
103 {
104 query_builder builder(database_types::postgres);
105
106 auto query = builder.update("users")
107 .set("email", std::string("newalice@example.com"))
108 .set("age", int64_t{31})
109 .where("name", "=", std::string("Alice"))
110 .build();
111
112 std::cout << "UPDATE query:\n " << query << std::endl;
113 }
114
115 // -------------------------------------------------------
116 // 5. DELETE query
117 // -------------------------------------------------------
118 std::cout << "\n--- DELETE ---" << std::endl;
119 {
120 query_builder builder(database_types::postgres);
121
122 auto query = builder.delete_from("users")
123 .where("is_active", "=", false)
124 .build();
125
126 std::cout << "DELETE query:\n " << query << std::endl;
127 }
128
129 // -------------------------------------------------------
130 // 6. JOIN query
131 // -------------------------------------------------------
132 std::cout << "\n--- JOIN ---" << std::endl;
133 {
134 query_builder builder(database_types::postgres);
135
136 auto query = builder.select({"u.name", "o.total"})
137 .from("users u")
138 .join("orders o", "u.id = o.user_id", join_type::inner)
139 .where("o.total", ">", 100.0)
140 .order_by("o.total", sort_order::desc)
141 .build();
142
143 std::cout << "JOIN query:\n " << query << std::endl;
144 }
145
146 // -------------------------------------------------------
147 // 7. GROUP BY with HAVING
148 // -------------------------------------------------------
149 std::cout << "\n--- GROUP BY ---" << std::endl;
150 {
151 query_builder builder(database_types::postgres);
152
153 auto query = builder.select({"department", "COUNT(*) AS cnt"})
154 .from("employees")
155 .group_by("department")
156 .having("COUNT(*) > 5")
157 .order_by("cnt", sort_order::desc)
158 .build();
159
160 std::cout << "GROUP BY query:\n " << query << std::endl;
161 }
162
163 // -------------------------------------------------------
164 // 8. Compound conditions with query_condition
165 // -------------------------------------------------------
166 std::cout << "\n--- Compound conditions ---" << std::endl;
167 {
168 query_builder builder(database_types::postgres);
169
170 // Build individual conditions
171 query_condition age_check("age", ">=", int64_t{21});
172 query_condition active_check("is_active", "=", true);
173
174 // Combine with logical AND
175 auto combined = age_check && active_check;
176
177 auto query = builder.select({"*"}).from("users").where(combined).build();
178
179 std::cout << "Compound condition query:\n " << query << std::endl;
180 }
181
182 // -------------------------------------------------------
183 // 9. Switching database dialect
184 // -------------------------------------------------------
185 std::cout << "\n--- Dialect switch ---" << std::endl;
186 {
187 query_builder builder(database_types::postgres);
188
189 auto pg_query = builder.select({"id", "name"})
190 .from("users")
191 .where("id", "=", int64_t{1})
192 .build();
193 std::cout << "PostgreSQL: " << pg_query << std::endl;
194
195 // Reset and switch dialect to SQLite
196 builder.reset();
197 builder.for_database(database_types::sqlite);
198
199 auto sqlite_query = builder.select({"id", "name"})
200 .from("users")
201 .where("id", "=", int64_t{1})
202 .build();
203 std::cout << "SQLite: " << sqlite_query << std::endl;
204 }
205
206 std::cout << "\n=== query_builder_usage example completed ===" << std::endl;
207 return 0;
208}
Universal query builder that adapts to different database types.
query_builder & select(const std::vector< std::string > &columns)
query_builder & for_database(database_types db_type)
std::string build() const
query_builder & group_by(const std::vector< std::string > &columns)
query_builder & where(const std::string &field, const std::string &op, const core::database_value &value)
query_builder & limit(size_t count)
query_builder & update(const std::string &table)
query_builder & having(const std::string &condition)
query_builder & order_by(const std::string &column, sort_order order=sort_order::asc)
query_builder & offset(size_t count)
query_builder & set(const std::string &field, const core::database_value &value)
query_builder & delete_from(const std::string &table)
query_builder & join(const std::string &table, const std::string &condition, join_type type=join_type::inner)
query_builder & insert_into(const std::string &table)
query_builder & values(const std::map< std::string, core::database_value > &data)
Represents a WHERE condition in a query.
Defines the enumeration of supported database types.
int main()