Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
join_builder.cpp
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#include "join_builder.h"
6#include <sstream>
7
8namespace database::query {
9
11
12join_builder& join_builder::join(const std::string& table, const std::string& condition,
13 const std::string& alias) {
14 joins_.push_back({table, condition, join_type::inner, alias});
15 return *this;
16}
17
18join_builder& join_builder::left_join(const std::string& table, const std::string& condition,
19 const std::string& alias) {
20 joins_.push_back({table, condition, join_type::left, alias});
21 return *this;
22}
23
24join_builder& join_builder::right_join(const std::string& table, const std::string& condition,
25 const std::string& alias) {
26 joins_.push_back({table, condition, join_type::right, alias});
27 return *this;
28}
29
30join_builder& join_builder::full_outer_join(const std::string& table, const std::string& condition,
31 const std::string& alias) {
32 joins_.push_back({table, condition, join_type::full_outer, alias});
33 return *this;
34}
35
36join_builder& join_builder::cross_join(const std::string& table, const std::string& alias) {
37 joins_.push_back({table, "", join_type::cross, alias});
38 return *this;
39}
40
42 joins_.push_back(spec);
43 return *this;
44}
45
46std::string join_builder::build(const value_formatter& formatter) const {
47 if (joins_.empty()) {
48 return "";
49 }
50
51 std::ostringstream oss;
52 for (size_t i = 0; i < joins_.size(); ++i) {
53 const auto& join = joins_[i];
54
55 if (i > 0) {
56 oss << " ";
57 }
58
59 oss << join_type_to_string(join.type) << " JOIN ";
60 oss << formatter.escape_identifier(join.table);
61
62 if (!join.alias.empty()) {
63 oss << " AS " << formatter.escape_identifier(join.alias);
64 }
65
66 if (join.type != join_type::cross && !join.condition.empty()) {
67 oss << " ON " << join.condition;
68 }
69 }
70
71 return oss.str();
72}
73
74bool join_builder::empty() const {
75 return joins_.empty();
76}
77
79 joins_.clear();
80}
81
82size_t join_builder::size() const {
83 return joins_.size();
84}
85
87 switch (type) {
89 return "INNER";
90 case join_type::left:
91 return "LEFT";
93 return "RIGHT";
95 return "FULL OUTER";
97 return "CROSS";
98 default:
99 return "INNER";
100 }
101}
102
103} // namespace database::query
Builds JOIN clauses for SQL queries.
join_builder & add(const join_spec &spec)
Add a join with explicit type.
std::vector< join_spec > joins_
join_builder & right_join(const std::string &table, const std::string &condition, const std::string &alias="")
Add a RIGHT JOIN.
join_builder & join(const std::string &table, const std::string &condition, const std::string &alias="")
Add an INNER JOIN.
bool empty() const
Check if builder is empty.
join_builder & full_outer_join(const std::string &table, const std::string &condition, const std::string &alias="")
Add a FULL OUTER JOIN.
std::string build(const value_formatter &formatter) const
Build the JOIN clauses.
join_builder & left_join(const std::string &table, const std::string &condition, const std::string &alias="")
Add a LEFT JOIN.
size_t size() const
Get number of joins.
std::string join_type_to_string(join_type type) const
void clear()
Clear all joins.
join_builder & cross_join(const std::string &table, const std::string &alias="")
Add a CROSS JOIN.
Formats database values for different backends.
std::string escape_identifier(const std::string &identifier) const
Quote and escape an identifier (table/column name)
join_type
Types of SQL joins.
@ full_outer
FULL OUTER JOIN.
@ right
RIGHT OUTER JOIN.
@ left
LEFT OUTER JOIN.
Represents a single WHERE condition.
Specification for a single JOIN clause.