Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
query_builder.h
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
5#pragma once
6
7#include "database_types.h"
9#include "query_dialect.h"
10#include <string>
11#include <vector>
12#include <map>
13#include <variant>
14#include <memory>
15#include <initializer_list>
16
17namespace database
18{
23 enum class join_type
24 {
25 inner,
26 left,
27 right,
29 cross
30 };
31
36 enum class sort_order
37 {
38 asc,
39 desc
40 };
41
47 {
48 public:
49 query_condition(const std::string& field, const std::string& op, const core::database_value& value);
50
51 std::string to_sql() const;
52 std::string to_mongodb() const;
53 std::string to_redis() const;
54
55 // Logical operators
56 query_condition operator&&(const query_condition& other) const;
57 query_condition operator||(const query_condition& other) const;
58
59 private:
60 // Private default constructor for internal use by logical operators
62
63 std::string field_;
64 std::string operator_;
66 std::string raw_condition_;
67 std::vector<query_condition> sub_conditions_;
68 std::string logical_operator_;
69 };
70
105 {
106 public:
108 ~query_builder() = default;
109
110 // Move-only (dialect ownership)
111 query_builder(query_builder&&) noexcept = default;
112 query_builder& operator=(query_builder&&) noexcept = default;
113 query_builder(const query_builder&) = delete;
114 query_builder& operator=(const query_builder&) = delete;
115
116 // Set database type
118
119 // SQL-style interface (works for PostgreSQL, SQLite)
120 query_builder& select(const std::vector<std::string>& columns);
121 query_builder& from(const std::string& table);
122 query_builder& where(const std::string& field, const std::string& op, const core::database_value& value);
123 query_builder& where(const query_condition& condition);
124 query_builder& join(const std::string& table, const std::string& condition, join_type type = join_type::inner);
125 query_builder& order_by(const std::string& column, sort_order order = sort_order::asc);
126 query_builder& group_by(const std::vector<std::string>& columns);
127 query_builder& group_by(const std::string& column);
128 query_builder& having(const std::string& condition);
129 query_builder& limit(size_t count);
130 query_builder& offset(size_t count);
131
132 // INSERT operations
133 query_builder& insert_into(const std::string& table);
134 query_builder& values(const std::map<std::string, core::database_value>& data);
135 query_builder& values(const std::vector<std::map<std::string, core::database_value>>& rows);
136
137 // UPDATE operations
138 query_builder& update(const std::string& table);
139 query_builder& set(const std::string& field, const core::database_value& value);
140 query_builder& set(const std::map<std::string, core::database_value>& data);
141
142 // DELETE operations
143 query_builder& delete_from(const std::string& table);
144
145 // NoSQL-style interface
146 query_builder& collection(const std::string& name); // MongoDB
147 query_builder& key(const std::string& key); // Redis
148
149 // Build and execute
150 std::string build() const;
151 core::database_result execute(core::database_backend* db) const;
152
153 // Reset builder
154 void reset();
155
156 // Get current database type
158
159 private:
161 std::unique_ptr<query_dialect> dialect_;
162
163 void ensure_dialect();
164 };
165
166} // namespace database
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(query_builder &&) noexcept=default
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
query_condition operator||(const query_condition &other) const
query_condition operator&&(const query_condition &other) const
std::string to_sql() const
Abstract interface for database-specific query formatting.
Abstract interface for database backends.
Defines the enumeration of supported database types.
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
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.