14 : field_(field), operator_(op), value_(value)
29 std::ostringstream oss;
41 std::ostringstream oss;
44 std::visit([&oss](
const auto& val) {
45 using T = std::decay_t<
decltype(val)>;
46 if constexpr (std::is_same_v<T, std::string>) {
49 escaped.reserve(val.size() + 10);
57 oss <<
"'" << escaped <<
"'";
58 }
else if constexpr (std::is_same_v<T, int64_t>) {
60 }
else if constexpr (std::is_same_v<T, double>) {
62 }
else if constexpr (std::is_same_v<T, bool>) {
63 oss << (val ?
"TRUE" :
"FALSE");
64 }
else if constexpr (std::is_same_v<T, std::monostate>) {
79 std::ostringstream oss;
81 oss <<
"{ \"" << mongo_op <<
"\": [";
83 if (i > 0) oss <<
", ";
90 std::ostringstream oss;
91 oss <<
"{ \"" <<
field_ <<
"\": ";
94 std::visit([&oss](
const auto& val) {
95 using T = std::decay_t<
decltype(val)>;
96 if constexpr (std::is_same_v<T, std::string>) {
97 oss <<
"\"" << val <<
"\"";
98 }
else if constexpr (std::is_same_v<T, int64_t>) {
100 }
else if constexpr (std::is_same_v<T, double>) {
102 }
else if constexpr (std::is_same_v<T, bool>) {
103 oss << (val ?
"true" :
"false");
104 }
else if constexpr (std::is_same_v<T, std::monostate>) {
109 std::string mongo_op;
111 else if (
operator_ ==
">=") mongo_op =
"$gte";
112 else if (
operator_ ==
"<") mongo_op =
"$lt";
113 else if (
operator_ ==
"<=") mongo_op =
"$lte";
114 else if (
operator_ ==
"!=") mongo_op =
"$ne";
115 else mongo_op =
"$eq";
117 oss <<
"{ \"" << mongo_op <<
"\": ";
118 std::visit([&oss](
const auto& val) {
119 using T = std::decay_t<
decltype(val)>;
120 if constexpr (std::is_same_v<T, std::string>) {
121 oss <<
"\"" << val <<
"\"";
122 }
else if constexpr (std::is_same_v<T, int64_t>) {
124 }
else if constexpr (std::is_same_v<T, double>) {
126 }
else if constexpr (std::is_same_v<T, bool>) {
127 oss << (val ?
"true" :
"false");
128 }
else if constexpr (std::is_same_v<T, std::monostate>) {
183 dialect_->set_select_columns(columns);
201 dialect_->add_where_condition(field, op, value);
210 dialect_->add_where_condition(condition);
219 dialect_->add_join(table, condition, type);
228 dialect_->add_order_by(column, order);
244 return group_by(std::vector<std::string>{column});
314 std::map<std::string, core::database_value> data;
371 std::string query =
build();
377 if (result.is_err()) {
380 return result.value();
Abstract base class for database backends.
virtual kcenon::common::Result< database_result > select_query(const std::string &query_string)=0
Execute a SELECT query.
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)
core::database_result execute(core::database_backend *db) const
query_builder & update(const std::string &table)
query_builder(database_types db_type=database_types::none)
database_types get_database_type() const
query_builder & having(const std::string &condition)
query_builder & collection(const std::string &name)
query_builder & from(const std::string &table)
std::unique_ptr< query_dialect > dialect_
query_builder & order_by(const std::string &column, sort_order order=sort_order::asc)
query_builder & offset(size_t count)
query_builder & key(const std::string &key)
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.
std::vector< query_condition > sub_conditions_
std::string to_redis() const
core::database_value value_
std::string to_mongodb() const
std::string logical_operator_
query_condition operator||(const query_condition &other) const
std::string raw_condition_
query_condition operator&&(const query_condition &other) const
std::string to_sql() const
std::vector< database_row > database_result
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
std::unique_ptr< query_dialect > create_dialect(database_types type)
Factory function to create appropriate dialect for database type.
database_types
Represents various database backends or modes.
@ none
No specific database type is set.
sort_order
Sort order for ORDER BY clauses.
join_type
Types of SQL joins.