Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
query_builder_usage.cpp File Reference

Demonstrates the fluent query builder API for constructing SQL queries. More...

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "database/query_builder.h"
#include "database/database_types.h"
Include dependency graph for query_builder_usage.cpp:

Go to the source code of this file.

Functions

int main ()
 

Detailed Description

Demonstrates the fluent query builder API for constructing SQL queries.

This example shows how to:

  • Build SELECT queries with WHERE, ORDER BY, LIMIT, and OFFSET
  • Build INSERT queries with column-value maps
  • Build UPDATE queries with SET and WHERE clauses
  • Build DELETE queries with conditions
  • Use JOIN, GROUP BY, and HAVING clauses
  • Use query_condition objects with logical operators

Note: This example generates SQL strings without executing them. It does not require a running database and is useful for understanding the query builder API.

Definition in file query_builder_usage.cpp.

Function Documentation

◆ main()

int main ( )

Definition at line 32 of file query_builder_usage.cpp.

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.
Represents a WHERE condition in a query.

References database::query_builder::build(), database::query_builder::delete_from(), database::query_builder::for_database(), database::query_builder::group_by(), database::query_builder::having(), database::query_builder::insert_into(), database::query_builder::join(), database::query_builder::limit(), database::query_builder::offset(), database::query_builder::order_by(), database::query_builder::reset(), database::query_builder::select(), database::query_builder::set(), database::query_builder::update(), database::query_builder::values(), and database::query_builder::where().

Here is the call graph for this function: