Skip to content

Commit 3aa8160

Browse files
committed
Adds MySQL syntax to Update builder
1 parent c3a14cf commit 3aa8160

File tree

6 files changed

+249
-6
lines changed

6 files changed

+249
-6
lines changed

src/select/select.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ impl Select {
116116
/// .group_by("id");
117117
///
118118
/// # let expected = "GROUP BY id";
119-
/// # assert_eq!(select.as_string(), expected);
119+
/// # assert_eq!(expected, select.as_string());
120120
/// ```
121121
pub fn group_by(mut self, column: &str) -> Self {
122122
push_unique(&mut self._group_by, column.trim().to_string());
@@ -280,7 +280,7 @@ impl Select {
280280
/// .order_by("login asc");
281281
///
282282
/// # let expected = "SELECT name, login ORDER BY login asc";
283-
/// # assert_eq!(select.as_string(), expected);
283+
/// # assert_eq!(expected, select.as_string());
284284
/// ```
285285
pub fn order_by(mut self, column: &str) -> Self {
286286
push_unique(&mut self._order_by, column.trim().to_string());
@@ -397,7 +397,7 @@ impl Select {
397397
/// .select("count(id)");
398398
///
399399
/// # let expected = "SELECT count(id)";
400-
/// # assert_eq!(select.as_string(), expected);
400+
/// # assert_eq!(expected, select.as_string());
401401
/// ```
402402
pub fn select(mut self, column: &str) -> Self {
403403
push_unique(&mut self._select, column.trim().to_string());
@@ -672,7 +672,7 @@ impl Select {
672672
/// .limit("123");
673673
///
674674
/// # let expected = "LIMIT 123";
675-
/// # assert_eq!(select.as_string(), expected);
675+
/// # assert_eq!(expected, select.as_string());
676676
/// # }
677677
/// ```
678678
pub fn limit(mut self, num: &str) -> Self {
@@ -696,7 +696,7 @@ impl Select {
696696
/// .offset("1500");
697697
///
698698
/// # let expected = "OFFSET 1500";
699-
/// # assert_eq!(select.as_string(), expected);
699+
/// # assert_eq!(expected, select.as_string());
700700
/// # }
701701
/// ```
702702
pub fn offset(mut self, num: &str) -> Self {
@@ -774,7 +774,7 @@ impl Select {
774774
/// # FROM orders \
775775
/// # WHERE owner_login in (select * from logins)\
776776
/// # ";
777-
/// # assert_eq!(select.as_string(), expected);
777+
/// # assert_eq!(expected, select.as_string());
778778
/// # }
779779
/// ```
780780
///

src/structure.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,12 @@ pub struct Update {
772772

773773
#[cfg(feature = "sqlite")]
774774
pub(crate) _join: Vec<String>,
775+
776+
#[cfg(feature = "mysql")]
777+
pub(crate) _limit: String,
778+
779+
#[cfg(feature = "mysql")]
780+
pub(crate) _order_by: Vec<String>,
775781
}
776782

777783
#[cfg(feature = "sqlite")]
@@ -811,6 +817,14 @@ pub enum UpdateClause {
811817
#[cfg(feature = "sqlite")]
812818
#[cfg_attr(docsrs, doc(cfg(feature = "sqlite")))]
813819
Join,
820+
821+
#[cfg(feature = "mysql")]
822+
#[cfg_attr(docsrs, doc(cfg(feature = "mysql")))]
823+
Limit,
824+
825+
#[cfg(feature = "mysql")]
826+
#[cfg_attr(docsrs, doc(cfg(feature = "mysql")))]
827+
OrderBy,
814828
}
815829

816830
/// Builder to contruct a [Values] command.

src/update/update.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,53 @@ impl Update {
600600
}
601601
}
602602

603+
#[cfg(any(doc, feature = "mysql"))]
604+
#[cfg_attr(docsrs, doc(cfg(feature = "mysql")))]
605+
impl Update {
606+
/// The `limit` clause, this method overrides the previous value
607+
///
608+
/// # Example
609+
///
610+
/// ```
611+
/// # #[cfg(feature = "mysql")]
612+
/// # {
613+
/// # use sql_query_builder as sql;
614+
/// let update = sql::Update::new()
615+
/// .limit("123");
616+
///
617+
/// let update = sql::Update::new()
618+
/// .limit("1000")
619+
/// .limit("123");
620+
///
621+
/// # let expected = "LIMIT 123";
622+
/// # assert_eq!(expected, update.as_string());
623+
/// # }
624+
/// ```
625+
pub fn limit(mut self, num: &str) -> Self {
626+
self._limit = num.trim().to_string();
627+
self
628+
}
629+
630+
/// The `order by` clause
631+
///
632+
/// # Example
633+
///
634+
/// ```
635+
/// # #[cfg(feature = "mysql")]
636+
/// # {
637+
/// # use sql_query_builder as sql;
638+
/// let update = sql::Update::new()
639+
/// .order_by("login asc");
640+
///
641+
/// # let expected = "ORDER BY login asc";
642+
/// # assert_eq!(expected, update.as_string());
643+
/// # }
644+
/// ```
645+
pub fn order_by(mut self, column: &str) -> Self {
646+
push_unique(&mut self._order_by, column.trim().to_string());
647+
self
648+
}
649+
}
603650
impl std::fmt::Display for Update {
604651
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
605652
write!(f, "{}", self.as_string())

src/update/update_internal.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,26 @@ impl Concat for Update {
8282
&self._where,
8383
);
8484

85+
#[cfg(feature = "mysql")]
86+
{
87+
query = self.concat_order_by(
88+
&self._raw_before,
89+
&self._raw_after,
90+
query,
91+
&fmts,
92+
UpdateClause::OrderBy,
93+
&self._order_by,
94+
);
95+
query = self.concat_limit(
96+
&self._raw_before,
97+
&self._raw_after,
98+
query,
99+
&fmts,
100+
UpdateClause::Limit,
101+
&self._limit,
102+
);
103+
}
104+
85105
#[cfg(any(feature = "postgresql", feature = "sqlite"))]
86106
{
87107
query = self.concat_returning(
@@ -136,3 +156,11 @@ impl Update {
136156
)
137157
}
138158
}
159+
160+
#[cfg(feature = "mysql")]
161+
use crate::concat::{non_standard::ConcatLimit, sql_standard::ConcatOrderBy};
162+
163+
#[cfg(feature = "mysql")]
164+
impl ConcatLimit<UpdateClause> for Update {}
165+
#[cfg(feature = "mysql")]
166+
impl ConcatOrderBy<UpdateClause> for Update {}

tests/clause_limit_spec.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,63 @@ mod delete_command {
117117
assert_eq!(expected_query, query);
118118
}
119119
}
120+
121+
#[cfg(feature = "mysql")]
122+
mod update_command {
123+
use pretty_assertions::assert_eq;
124+
use sql_query_builder as sql;
125+
126+
#[test]
127+
fn method_limit_should_add_the_limit_clause() {
128+
let query = sql::Update::new().limit("3").as_string();
129+
let expected_query = "LIMIT 3";
130+
131+
assert_eq!(expected_query, query);
132+
}
133+
134+
#[test]
135+
fn method_limit_should_override_the_current_value() {
136+
let query = sql::Update::new().limit("3").limit("4").as_string();
137+
let expected_query = "LIMIT 4";
138+
139+
assert_eq!(expected_query, query);
140+
}
141+
142+
#[test]
143+
fn method_limit_should_trim_space_of_the_argument() {
144+
let query = sql::Update::new().limit(" 50 ").as_string();
145+
let expected_query = "LIMIT 50";
146+
147+
assert_eq!(expected_query, query);
148+
}
149+
150+
#[test]
151+
fn clause_limit_should_be_after_order_by_clause() {
152+
let query = sql::Update::new().order_by("created_at desc").limit("42").as_string();
153+
let expected_query = "ORDER BY created_at desc LIMIT 42";
154+
155+
assert_eq!(expected_query, query);
156+
}
157+
158+
#[test]
159+
fn method_raw_before_should_add_raw_sql_before_limit_clause() {
160+
let query = sql::Update::new()
161+
.raw_before(sql::UpdateClause::Limit, "order by id")
162+
.limit("10")
163+
.as_string();
164+
let expected_query = "order by id LIMIT 10";
165+
166+
assert_eq!(expected_query, query);
167+
}
168+
169+
#[test]
170+
fn method_raw_after_should_add_raw_sql_after_limit_clause() {
171+
let query = sql::Update::new()
172+
.limit("10")
173+
.raw_after(sql::UpdateClause::Limit, "/* uncommon argument */")
174+
.as_string();
175+
let expected_query = "LIMIT 10 /* uncommon argument */";
176+
177+
assert_eq!(expected_query, query);
178+
}
179+
}

tests/clause_order_by_spec.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,97 @@ mod delete_command {
187187
assert_eq!(expected_query, query);
188188
}
189189
}
190+
191+
#[cfg(feature = "mysql")]
192+
mod update_command {
193+
use pretty_assertions::assert_eq;
194+
use sql_query_builder as sql;
195+
196+
#[test]
197+
fn method_order_by_should_add_the_order_by_clause() {
198+
let query = sql::Update::new().order_by("id asc").as_string();
199+
let expected_query = "ORDER BY id asc";
200+
201+
assert_eq!(expected_query, query);
202+
}
203+
204+
#[test]
205+
fn method_order_by_should_accumulate_values_on_consecutive_calls() {
206+
let query = sql::Update::new()
207+
.order_by("login asc")
208+
.order_by("created_at desc")
209+
.as_string();
210+
let expected_query = "ORDER BY login asc, created_at desc";
211+
212+
assert_eq!(expected_query, query);
213+
}
214+
215+
#[test]
216+
fn method_order_by_should_not_accumulate_values_when_column_name_is_empty() {
217+
let query = sql::Update::new()
218+
.order_by("")
219+
.order_by("created_at desc")
220+
.order_by("")
221+
.as_string();
222+
let expected_query = "ORDER BY created_at desc";
223+
224+
assert_eq!(expected_query, query);
225+
}
226+
227+
#[test]
228+
fn method_order_by_should_trim_space_of_the_argument() {
229+
let query = sql::Update::new().order_by(" id desc ").as_string();
230+
let expected_query = "ORDER BY id desc";
231+
232+
assert_eq!(expected_query, query);
233+
}
234+
235+
#[test]
236+
fn method_order_by_should_not_accumulate_arguments_with_the_same_content() {
237+
let query = sql::Update::new().order_by("id desc").order_by("id desc").as_string();
238+
let expected_query = "ORDER BY id desc";
239+
240+
assert_eq!(expected_query, query);
241+
}
242+
243+
#[test]
244+
fn clause_order_by_should_be_after_where_clause() {
245+
let query = sql::Update::new()
246+
.where_clause("active = true")
247+
.order_by("created_at desc")
248+
.as_string();
249+
let expected_query = "WHERE active = true ORDER BY created_at desc";
250+
251+
assert_eq!(expected_query, query);
252+
}
253+
254+
#[test]
255+
fn clause_order_by_should_be_after_update_clause() {
256+
let query = sql::Update::new().update("foo").order_by("created_at desc").as_string();
257+
let expected_query = "UPDATE foo ORDER BY created_at desc";
258+
259+
assert_eq!(expected_query, query);
260+
}
261+
262+
#[test]
263+
fn method_raw_before_should_add_raw_sql_before_order_by_clause() {
264+
let query = sql::Update::new()
265+
.raw_before(sql::UpdateClause::OrderBy, "where user_login = $1")
266+
.order_by("id desc")
267+
.as_string();
268+
let expected_query = "where user_login = $1 ORDER BY id desc";
269+
270+
assert_eq!(expected_query, query);
271+
}
272+
273+
#[test]
274+
fn method_raw_after_should_add_raw_sql_after_order_by_clause() {
275+
let query = sql::Update::new()
276+
.order_by("id desc")
277+
.raw_after(sql::UpdateClause::OrderBy, "limit 20")
278+
.as_string();
279+
let expected_query = "ORDER BY id desc limit 20";
280+
281+
assert_eq!(expected_query, query);
282+
}
283+
}

0 commit comments

Comments
 (0)