Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database::query::condition_builder Class Reference

Builds WHERE clause conditions with proper precedence. More...

#include <condition_builder.h>

Collaboration diagram for database::query::condition_builder:
Collaboration graph

Classes

struct  condition_node
 

Public Member Functions

 condition_builder ()
 
condition_builderadd (const condition &cond, logical_op op=logical_op::AND)
 Add a condition.
 
condition_builderadd (const std::string &field, const std::string &operator_, const core::database_value &value, logical_op op=logical_op::AND)
 Add a simple condition.
 
condition_builderadd_raw (const std::string &raw, logical_op op=logical_op::AND)
 Add a raw SQL condition.
 
condition_builderbegin_group ()
 Begin a condition group (adds opening parenthesis)
 
condition_builderend_group ()
 End a condition group (adds closing parenthesis)
 
std::string build (const value_formatter &formatter) const
 Build the WHERE clause.
 
bool empty () const
 Check if builder is empty.
 
void clear ()
 Clear all conditions.
 

Private Member Functions

std::string format_condition (const condition &cond, const value_formatter &formatter) const
 
std::string logical_op_to_string (logical_op op) const
 

Private Attributes

std::vector< condition_nodenodes_
 
int current_group_level_
 

Detailed Description

Builds WHERE clause conditions with proper precedence.

Features:

  • Supports AND/OR logical operators
  • Nested condition grouping with parentheses
  • Raw SQL conditions
  • Automatic precedence handling

Examples:

// Simple condition: status = 'active'
builder.add({"status", "=", std::string("active")});
// Complex: status = 'active' AND (age > 18 OR verified = true)
builder.add({"status", "=", std::string("active")})
.add({"age", ">", 18}, logical_op::AND)
.add({"verified", "=", true}, logical_op::OR)
// Build with formatter
value_formatter fmt(database_types::PostgreSQL);
std::string where_clause = builder.build(fmt);
Builds WHERE clause conditions with proper precedence.
condition_builder & end_group()
End a condition group (adds closing parenthesis)
condition_builder & begin_group()
Begin a condition group (adds opening parenthesis)
std::string build(const value_formatter &formatter) const
Build the WHERE clause.
condition_builder & add(const condition &cond, logical_op op=logical_op::AND)
Add a condition.

Thread Safety:

  • NOT thread-safe (stateful builder pattern)
  • Each thread should use separate instance

Definition at line 70 of file condition_builder.h.

Constructor & Destructor Documentation

◆ condition_builder()

database::query::condition_builder::condition_builder ( )

Member Function Documentation

◆ add() [1/2]

condition_builder & database::query::condition_builder::add ( const condition & cond,
logical_op op = logical_op::AND )

Add a condition.

Parameters
condCondition to add
opLogical operator (AND/OR)
Returns
Reference to this builder

Definition at line 13 of file condition_builder.cpp.

13 {
14 condition_node node;
15 node.cond = cond;
16 node.op = op;
17 node.group_level = current_group_level_;
18 node.is_group_start = false;
19 node.is_group_end = false;
20 nodes_.push_back(node);
21 return *this;
22}
std::vector< condition_node > nodes_

References database::query::condition_builder::condition_node::cond, current_group_level_, database::query::condition_builder::condition_node::group_level, database::query::condition_builder::condition_node::is_group_end, database::query::condition_builder::condition_node::is_group_start, nodes_, and database::query::condition_builder::condition_node::op.

Referenced by add(), and add_raw().

Here is the caller graph for this function:

◆ add() [2/2]

condition_builder & database::query::condition_builder::add ( const std::string & field,
const std::string & operator_,
const core::database_value & value,
logical_op op = logical_op::AND )

Add a simple condition.

Parameters
fieldField name
operator_Comparison operator
valueValue to compare
opLogical operator (AND/OR)
Returns
Reference to this builder

Definition at line 24 of file condition_builder.cpp.

25 {
26 condition cond;
27 cond.field = field;
28 cond.op = operator_;
29 cond.value = value;
30 return add(cond, op);
31}

References add(), database::query::condition::field, database::query::condition::op, and database::query::condition::value.

Here is the call graph for this function:

◆ add_raw()

condition_builder & database::query::condition_builder::add_raw ( const std::string & raw,
logical_op op = logical_op::AND )

Add a raw SQL condition.

Parameters
rawRaw SQL condition
opLogical operator (AND/OR)
Returns
Reference to this builder

Definition at line 33 of file condition_builder.cpp.

33 {
34 condition cond;
35 cond.raw = raw;
36 return add(cond, op);
37}

References add(), and database::query::condition::raw.

Here is the call graph for this function:

◆ begin_group()

condition_builder & database::query::condition_builder::begin_group ( )

Begin a condition group (adds opening parenthesis)

Returns
Reference to this builder

Definition at line 39 of file condition_builder.cpp.

39 {
40 condition_node node;
41 node.group_level = current_group_level_;
42 node.is_group_start = true;
43 node.is_group_end = false;
44 node.op = logical_op::AND; // Default, will be overridden
45 nodes_.push_back(node);
46
48 return *this;
49}

References database::query::AND, current_group_level_, database::query::condition_builder::condition_node::group_level, database::query::condition_builder::condition_node::is_group_end, database::query::condition_builder::condition_node::is_group_start, nodes_, and database::query::condition_builder::condition_node::op.

◆ build()

std::string database::query::condition_builder::build ( const value_formatter & formatter) const

Build the WHERE clause.

Parameters
formatterValue formatter for this database
Returns
SQL WHERE clause (without "WHERE" keyword)

Definition at line 65 of file condition_builder.cpp.

65 {
66 if (nodes_.empty()) {
67 return "";
68 }
69
70 std::ostringstream oss;
71 bool first = true;
72
73 for (const auto& node : nodes_) {
74 if (node.is_group_start) {
75 if (!first) {
76 oss << " " << logical_op_to_string(node.op) << " ";
77 }
78 oss << "(";
79 first = true;
80 continue;
81 }
82
83 if (node.is_group_end) {
84 oss << ")";
85 first = false;
86 continue;
87 }
88
89 if (!first) {
90 oss << " " << logical_op_to_string(node.op) << " ";
91 }
92
93 oss << format_condition(node.cond, formatter);
94 first = false;
95 }
96
97 return oss.str();
98}
std::string logical_op_to_string(logical_op op) const
std::string format_condition(const condition &cond, const value_formatter &formatter) const

References format_condition(), logical_op_to_string(), and nodes_.

Here is the call graph for this function:

◆ clear()

void database::query::condition_builder::clear ( )

Clear all conditions.

Definition at line 104 of file condition_builder.cpp.

104 {
105 nodes_.clear();
107}

References current_group_level_, and nodes_.

◆ empty()

bool database::query::condition_builder::empty ( ) const

Check if builder is empty.

Returns
true if no conditions added

Definition at line 100 of file condition_builder.cpp.

100 {
101 return nodes_.empty();
102}

References nodes_.

◆ end_group()

condition_builder & database::query::condition_builder::end_group ( )

End a condition group (adds closing parenthesis)

Returns
Reference to this builder

Definition at line 51 of file condition_builder.cpp.

51 {
52 if (current_group_level_ > 0) {
54
55 condition_node node;
56 node.group_level = current_group_level_;
57 node.is_group_start = false;
58 node.is_group_end = true;
59 node.op = logical_op::AND;
60 nodes_.push_back(node);
61 }
62 return *this;
63}

References database::query::AND, current_group_level_, database::query::condition_builder::condition_node::group_level, database::query::condition_builder::condition_node::is_group_end, database::query::condition_builder::condition_node::is_group_start, nodes_, and database::query::condition_builder::condition_node::op.

◆ format_condition()

std::string database::query::condition_builder::format_condition ( const condition & cond,
const value_formatter & formatter ) const
private

Definition at line 109 of file condition_builder.cpp.

110 {
111 if (cond.is_raw()) {
112 return cond.raw;
113 }
114
115 std::ostringstream oss;
116 oss << formatter.escape_identifier(cond.field) << " " << cond.op << " ";
117
118 // Handle special operators
119 if (cond.op == "IS NULL" || cond.op == "IS NOT NULL") {
120 // No value needed
121 return formatter.escape_identifier(cond.field) + " " + cond.op;
122 }
123
124 oss << formatter.format(cond.value);
125 return oss.str();
126}

References database::query::value_formatter::escape_identifier(), database::query::condition::field, database::query::value_formatter::format(), database::query::condition::is_raw(), database::query::condition::op, database::query::condition::raw, and database::query::condition::value.

Referenced by build().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ logical_op_to_string()

std::string database::query::condition_builder::logical_op_to_string ( logical_op op) const
private

Definition at line 128 of file condition_builder.cpp.

128 {
129 switch (op) {
130 case logical_op::AND:
131 return "AND";
132 case logical_op::OR:
133 return "OR";
134 default:
135 return "AND";
136 }
137}

References database::query::AND, and database::query::OR.

Referenced by build().

Here is the caller graph for this function:

Member Data Documentation

◆ current_group_level_

int database::query::condition_builder::current_group_level_
private

Definition at line 141 of file condition_builder.h.

Referenced by add(), begin_group(), clear(), and end_group().

◆ nodes_

std::vector<condition_node> database::query::condition_builder::nodes_
private

Definition at line 140 of file condition_builder.h.

Referenced by add(), begin_group(), build(), clear(), empty(), and end_group().


The documentation for this class was generated from the following files: