Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
immutable_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"
8#include "../query_builder.h"
9#include <string>
10#include <vector>
11#include <map>
12#include <optional>
13#include <memory>
14
15namespace database
16{
44 {
45 public:
50 explicit immutable_query_builder(const std::string& table);
51
57 immutable_query_builder select(std::vector<std::string> fields) const;
58
66 immutable_query_builder where(const std::string& field, const std::string& op, const core::database_value& value) const;
67
73 immutable_query_builder where(const query_condition& condition) const;
74
81 immutable_query_builder order_by(const std::string& field, sort_order order = sort_order::asc) const;
82
88 immutable_query_builder limit(uint32_t count) const;
89
95 immutable_query_builder offset(uint32_t count) const;
96
104 immutable_query_builder join(const std::string& table, const std::string& condition, join_type type = join_type::inner) const;
105
111 immutable_query_builder group_by(std::vector<std::string> fields) const;
112
118 immutable_query_builder having(const std::string& condition) const;
119
126 std::string build() const;
127
133 std::string build_for_database(database_types db_type) const;
134
135 private:
136 // All fields are const - immutable state
137 const std::string table_;
138 const std::vector<std::string> select_fields_;
139 const std::vector<query_condition> conditions_;
140 const std::vector<std::pair<std::string, sort_order>> order_by_;
141 const std::optional<uint32_t> limit_;
142 const std::optional<uint32_t> offset_;
143 const std::vector<std::tuple<std::string, std::string, join_type>> joins_;
144 const std::vector<std::string> group_by_fields_;
145 const std::string having_clause_;
146
147 // Private constructor for internal use (copy with modification)
149 std::string table,
150 std::vector<std::string> select_fields,
151 std::vector<query_condition> conditions,
152 std::vector<std::pair<std::string, sort_order>> order_by,
153 std::optional<uint32_t> limit,
154 std::optional<uint32_t> offset,
155 std::vector<std::tuple<std::string, std::string, join_type>> joins,
156 std::vector<std::string> group_by_fields,
157 std::string having_clause
158 );
159
160 // Helper methods
161 std::string escape_identifier(const std::string& identifier, database_types db_type) const;
162 std::string format_value(const core::database_value& value, database_types db_type) const;
163 std::string join_type_to_string(join_type type) const;
164 };
165
166} // namespace database
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.
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.
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.
sort_order
Sort order for ORDER BY clauses.
join_type
Types of SQL joins.