11#include <gtest/gtest.h>
31 std::string sql = builder_.
build();
32 EXPECT_NE(sql.find(
"SELECT *"), std::string::npos);
33 EXPECT_NE(sql.find(
"\"users\""), std::string::npos);
39 auto q = builder_.select({
"id",
"name",
"email"});
40 std::string sql = q.build();
41 EXPECT_NE(sql.find(
"\"id\""), std::string::npos);
42 EXPECT_NE(sql.find(
"\"name\""), std::string::npos);
43 EXPECT_NE(sql.find(
"\"email\""), std::string::npos);
44 EXPECT_EQ(sql.find(
"*"), std::string::npos);
50 auto q = builder_.where(
"active",
"=",
true);
51 std::string sql = q.build();
52 EXPECT_NE(sql.find(
"WHERE"), std::string::npos);
57 .where(
"active",
"=",
true)
58 .where(
"age",
">", int64_t{18});
59 std::string sql = q.build();
60 EXPECT_NE(sql.find(
"AND"), std::string::npos);
65 auto q = builder_.where(cond);
66 std::string sql = q.build();
67 EXPECT_NE(sql.find(
"WHERE"), std::string::npos);
68 EXPECT_NE(sql.find(
"status"), std::string::npos);
74 auto q = builder_.order_by(
"name", sort_order::asc);
75 std::string sql = q.build();
76 EXPECT_NE(sql.find(
"ORDER BY"), std::string::npos);
77 EXPECT_NE(sql.find(
"ASC"), std::string::npos);
81 auto q = builder_.order_by(
"created_at", sort_order::desc);
82 std::string sql = q.build();
83 EXPECT_NE(sql.find(
"DESC"), std::string::npos);
88 .order_by(
"name", sort_order::asc)
89 .order_by(
"created_at", sort_order::desc);
90 std::string sql = q.build();
91 EXPECT_NE(sql.find(
"ASC"), std::string::npos);
92 EXPECT_NE(sql.find(
"DESC"), std::string::npos);
98 auto q = builder_.limit(10);
99 std::string sql = q.build();
100 EXPECT_NE(sql.find(
"LIMIT 10"), std::string::npos);
104 auto q = builder_.offset(20);
105 std::string sql = q.build();
106 EXPECT_NE(sql.find(
"OFFSET 20"), std::string::npos);
110 auto q = builder_.limit(10).offset(20);
111 std::string sql = q.build();
112 EXPECT_NE(sql.find(
"LIMIT 10"), std::string::npos);
113 EXPECT_NE(sql.find(
"OFFSET 20"), std::string::npos);
119 auto q = builder_.join(
"orders",
"users.id = orders.user_id", join_type::inner);
120 std::string sql = q.build();
121 EXPECT_NE(sql.find(
"INNER JOIN"), std::string::npos);
122 EXPECT_NE(sql.find(
"users.id = orders.user_id"), std::string::npos);
126 auto q = builder_.join(
"orders",
"users.id = orders.user_id", join_type::left);
127 std::string sql = q.build();
128 EXPECT_NE(sql.find(
"LEFT JOIN"), std::string::npos);
132 auto q = builder_.join(
"orders",
"users.id = orders.user_id", join_type::right);
133 std::string sql = q.build();
134 EXPECT_NE(sql.find(
"RIGHT JOIN"), std::string::npos);
138 auto q = builder_.join(
"orders",
"users.id = orders.user_id", join_type::full_outer);
139 std::string sql = q.build();
140 EXPECT_NE(sql.find(
"FULL OUTER JOIN"), std::string::npos);
144 auto q = builder_.join(
"roles",
"1=1", join_type::cross);
145 std::string sql = q.build();
146 EXPECT_NE(sql.find(
"CROSS JOIN"), std::string::npos);
152 auto q = builder_.group_by({
"department"});
153 std::string sql = q.build();
154 EXPECT_NE(sql.find(
"GROUP BY"), std::string::npos);
155 EXPECT_NE(sql.find(
"\"department\""), std::string::npos);
159 auto q = builder_.group_by({
"department",
"status"});
160 std::string sql = q.build();
161 EXPECT_NE(sql.find(
"GROUP BY"), std::string::npos);
162 EXPECT_NE(sql.find(
"\"department\""), std::string::npos);
163 EXPECT_NE(sql.find(
"\"status\""), std::string::npos);
167 auto q = builder_.group_by({
"department"}).having(
"COUNT(*) > 5");
168 std::string sql = q.build();
169 EXPECT_NE(sql.find(
"HAVING COUNT(*) > 5"), std::string::npos);
175 auto q = builder_.select({
"id",
"name"});
176 std::string sql = q.build_for_database(database_types::postgres);
177 EXPECT_NE(sql.find(
"\"id\""), std::string::npos);
178 EXPECT_NE(sql.find(
"\"name\""), std::string::npos);
179 EXPECT_NE(sql.find(
"\"users\""), std::string::npos);
183 auto q = builder_.select({
"id"});
184 std::string sql = q.build_for_database(database_types::sqlite);
185 EXPECT_NE(sql.find(
"\"id\""), std::string::npos);
186 EXPECT_NE(sql.find(
"\"users\""), std::string::npos);
190 auto q = builder_.select({
"id"});
191 std::string default_sql = q.build();
192 std::string pg_sql = q.build_for_database(database_types::postgres);
193 EXPECT_EQ(default_sql, pg_sql);
199 auto q = builder_.select({
"id"});
200 std::string original_sql = builder_.build();
201 std::string new_sql = q.build();
202 EXPECT_NE(original_sql, new_sql);
203 EXPECT_NE(original_sql.find(
"*"), std::string::npos);
204 EXPECT_EQ(new_sql.find(
"*"), std::string::npos);
208 auto q = builder_.where(
"id",
"=", int64_t{1});
209 std::string original_sql = builder_.build();
210 EXPECT_EQ(original_sql.find(
"WHERE"), std::string::npos);
214 auto q = builder_.limit(10);
215 std::string original_sql = builder_.build();
216 EXPECT_EQ(original_sql.find(
"LIMIT"), std::string::npos);
221 .select({
"id",
"name"})
222 .where(
"active",
"=",
true)
223 .order_by(
"name", sort_order::asc)
227 std::string sql = q.build();
228 EXPECT_NE(sql.find(
"SELECT"), std::string::npos);
229 EXPECT_NE(sql.find(
"WHERE"), std::string::npos);
230 EXPECT_NE(sql.find(
"ORDER BY"), std::string::npos);
231 EXPECT_NE(sql.find(
"LIMIT 10"), std::string::npos);
232 EXPECT_NE(sql.find(
"OFFSET 0"), std::string::npos);
239 .select({
"u.id",
"u.name",
"COUNT(o.id)"})
240 .join(
"orders",
"u.id = o.user_id", join_type::left)
241 .where(
"u.active",
"=",
true)
242 .group_by({
"u.id",
"u.name"})
243 .having(
"COUNT(o.id) > 0")
244 .order_by(
"u.name", sort_order::asc)
247 std::string sql = q.build();
248 EXPECT_NE(sql.find(
"SELECT"), std::string::npos);
249 EXPECT_NE(sql.find(
"LEFT JOIN"), std::string::npos);
250 EXPECT_NE(sql.find(
"WHERE"), std::string::npos);
251 EXPECT_NE(sql.find(
"GROUP BY"), std::string::npos);
252 EXPECT_NE(sql.find(
"HAVING"), std::string::npos);
253 EXPECT_NE(sql.find(
"ORDER BY"), std::string::npos);
254 EXPECT_NE(sql.find(
"LIMIT 50"), std::string::npos);
immutable_query_builder builder_
Thread-safe immutable query builder using functional programming style.
std::string build() const
Builds the final SQL query string.
Represents a WHERE condition in a query.
TEST_F(ImmutableQueryBuilderTest, DefaultBuildSelectsStar)