17 , limit_(std::nullopt)
18 , offset_(std::nullopt)
28 std::vector<std::string> select_fields,
29 std::vector<query_condition> conditions,
30 std::vector<std::pair<std::string, sort_order>> order_by,
31 std::optional<uint32_t> limit,
32 std::optional<uint32_t> offset,
33 std::vector<std::tuple<std::string, std::string, join_type>> joins,
34 std::vector<std::string> group_by_fields,
35 std::string having_clause
37 : table_(std::move(table))
38 , select_fields_(std::move(select_fields))
39 , conditions_(std::move(conditions))
40 , order_by_(std::move(order_by))
43 , joins_(std::move(joins))
44 , group_by_fields_(std::move(group_by_fields))
45 , having_clause_(std::move(having_clause))
67 new_conditions.emplace_back(field, op, value);
72 std::move(new_conditions),
85 new_conditions.push_back(condition);
90 std::move(new_conditions),
103 new_order_by.emplace_back(field, order);
109 std::move(new_order_by),
151 new_joins.emplace_back(table, condition, type);
160 std::move(new_joins),
203 std::ostringstream query;
225 for (
const auto& [join_table, join_condition, join_type_val] :
joins_)
229 <<
" ON " << join_condition;
247 query <<
" GROUP BY ";
265 query <<
" ORDER BY ";
266 for (
size_t i = 0; i <
order_by_.size(); ++i)
278 query <<
" LIMIT " <<
limit_.value();
284 query <<
" OFFSET " <<
offset_.value();
295 return "\"" + identifier +
"\"";
297 return "\"" + identifier +
"\"";
305 if (std::holds_alternative<std::string>(value))
307 const auto& str = std::get<std::string>(value);
309 escaped.reserve(str.size() + 2);
321 else if (std::holds_alternative<int64_t>(value))
323 return std::to_string(std::get<int64_t>(value));
325 else if (std::holds_alternative<double>(value))
327 return std::to_string(std::get<double>(value));
329 else if (std::holds_alternative<bool>(value))
331 return std::get<bool>(value) ?
"TRUE" :
"FALSE";
333 else if (std::holds_alternative<std::nullptr_t>(value))
Thread-safe immutable query builder using functional programming style.
immutable_query_builder join(const std::string &table, const std::string &condition, join_type type=join_type::inner) const
JOIN clause - adds a join.
std::string format_value(const core::database_value &value, database_types db_type) const
immutable_query_builder group_by(std::vector< std::string > fields) const
GROUP BY clause - groups results.
const std::optional< uint32_t > limit_
const std::optional< uint32_t > offset_
immutable_query_builder order_by(const std::string &field, sort_order order=sort_order::asc) const
ORDER BY clause - specifies sorting.
const std::vector< std::tuple< std::string, std::string, join_type > > joins_
const std::vector< query_condition > conditions_
std::string join_type_to_string(join_type type) const
const std::vector< std::string > select_fields_
immutable_query_builder select(std::vector< std::string > fields) const
SELECT clause - specifies which columns to select.
std::string escape_identifier(const std::string &identifier, database_types db_type) const
std::string build() const
Builds the final SQL query string.
const std::vector< std::string > group_by_fields_
immutable_query_builder where(const std::string &field, const std::string &op, const core::database_value &value) const
WHERE clause - adds a condition.
immutable_query_builder(const std::string &table)
Constructs a new immutable query builder.
immutable_query_builder offset(uint32_t count) const
OFFSET clause - skips rows.
const std::vector< std::pair< std::string, sort_order > > order_by_
immutable_query_builder having(const std::string &condition) const
HAVING clause - filters grouped results.
immutable_query_builder limit(uint32_t count) const
LIMIT clause - limits number of results.
const std::string having_clause_
std::string build_for_database(database_types db_type) const
Builds the SQL query for a specific database type.
Represents a WHERE condition in a query.
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
database_types
Represents various database backends or modes.
@ sqlite
Indicates a SQLite database.
@ postgres
Indicates a PostgreSQL database.
sort_order
Sort order for ORDER BY clauses.
join_type
Types of SQL joins.