ORM C++
Loading...
Searching...
No Matches
query.hpp
1#pragma once
2
3#include <algorithm>
4#include <cstddef>
5#include <optional>
6#include <stdexcept>
7#include <string>
8#include <utility>
9
10#include "query/SelectSpec.hpp"
11
12namespace orm
13{
14class DatabaseCore;
15template <typename SchemaType>
16class Database;
24template <typename T>
25class Query
26{
27public:
31 Query() = default;
32
37 auto where(const query::Predicate& predicate) -> Query<T>&
38 {
39 data.predicate = predicate;
40
41 return *this;
42 }
43
48 auto andWhere(const query::Predicate& predicate) -> Query<T>&
49 {
50 data.predicate = data.predicate.has_value() ? data.predicate.value() && predicate : predicate;
51
52 return *this;
53 }
54
59 auto orWhere(const query::Predicate& predicate) -> Query<T>&
60 {
61 data.predicate = data.predicate.has_value() ? data.predicate.value() || predicate : predicate;
62
63 return *this;
64 }
65
72 template <typename... Orders>
73 auto orderBy(Orders... orders) -> Query<T>&
74 {
75 data.orderBy = {std::move(orders)...};
76
77 return *this;
78 }
79
86 template <typename... Columns>
87 auto groupBy(Columns... columns) -> Query<T>&
88 {
89 data.groupBy = {std::move(columns)...};
90
91 return *this;
92 }
93
100 auto having(const query::AggregatePredicate& predicate) -> Query<T>&
101 {
102 data.having = predicate;
103
104 return *this;
105 }
106
113 auto andHaving(const query::AggregatePredicate& predicate) -> Query<T>&
114 {
115 data.having = data.having.has_value() ? data.having.value() && predicate : predicate;
116
117 return *this;
118 }
119
126 auto orHaving(const query::AggregatePredicate& predicate) -> Query<T>&
127 {
128 data.having = data.having.has_value() ? data.having.value() || predicate : predicate;
129
130 return *this;
131 }
132
137 inline auto distinct() -> Query<T>&
138 {
139 data.isDistinct = true;
140
141 return *this;
142 }
143
149 inline auto offset(std::size_t offset) -> Query<T>&
150 {
151 data.offset = offset;
152
153 return *this;
154 }
155
161 inline auto limit(std::size_t limit) -> Query<T>&
162 {
163 data.limit = limit;
164
165 return *this;
166 }
167
173 inline auto disableJoining() -> Query<T>&
174 {
175 data.shouldJoin = false;
176
177 return *this;
178 }
179
188 auto include(std::string relation) -> Query<T>&
189 {
190 if (relation.empty())
191 {
192 throw std::invalid_argument{"Included relation name must not be empty"};
193 }
194
195 if (std::ranges::find(data.includes, relation) == data.includes.end())
196 {
197 data.includes.push_back(std::move(relation));
198 }
199
200 return *this;
201 }
202
203private:
207 template <typename>
208 friend class orm::Database;
209 friend class orm::DatabaseCore;
210
215 [[nodiscard]] inline auto getData() const -> const query::SelectSpec&
216 {
217 return data;
218 }
219
220 query::SelectSpec data;
221};
222} // namespace orm
A class representing a database in the ORM framework.
Definition database.hpp:67
Database facade bound to one closed compile-time model schema.
Definition database.hpp:704
auto orderBy(Orders... orders) -> Query< T > &
Sets the ORDER BY clauses for the select query.
Definition query.hpp:73
auto groupBy(Columns... columns) -> Query< T > &
Sets the GROUP BY columns for the select query.
Definition query.hpp:87
auto andWhere(const query::Predicate &predicate) -> Query< T > &
Adds a predicate with AND.
Definition query.hpp:48
auto orWhere(const query::Predicate &predicate) -> Query< T > &
Adds a predicate with OR.
Definition query.hpp:59
Query()=default
Constructs a Query object.
auto having(const query::AggregatePredicate &predicate) -> Query< T > &
Replaces the HAVING predicate.
Definition query.hpp:100
auto andHaving(const query::AggregatePredicate &predicate) -> Query< T > &
Adds an aggregate predicate with AND.
Definition query.hpp:113
auto where(const query::Predicate &predicate) -> Query< T > &
Replaces the WHERE predicate.
Definition query.hpp:37
auto distinct() -> Query< T > &
Select distinct rows.
Definition query.hpp:137
auto limit(std::size_t limit) -> Query< T > &
Sets the LIMIT clause for the select query.
Definition query.hpp:161
auto include(std::string relation) -> Query< T > &
Explicitly loads a mapped OneToMany or ManyToMany collection.
Definition query.hpp:188
auto disableJoining() -> Query< T > &
Disables joining for the select query.
Definition query.hpp:173
auto offset(std::size_t offset) -> Query< T > &
Sets the OFFSET clause for the select query.
Definition query.hpp:149
auto orHaving(const query::AggregatePredicate &predicate) -> Query< T > &
Adds an aggregate predicate with OR.
Definition query.hpp:126