From 4e1a0e4a7ca189c628abfa2bc530909a7cb9b6e6 Mon Sep 17 00:00:00 2001 From: Billy Chan Date: Fri, 27 Jan 2023 13:03:13 +0800 Subject: [PATCH] Allows offset & limit to take `Option` (#1410) * Allows offset & limit to take `Option` * Takes `Into>` instead * Reset limit and offset when None value is provided --- src/query/helper.rs | 72 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/src/query/helper.rs b/src/query/helper.rs index 29f37492..ab98d1c8 100644 --- a/src/query/helper.rs +++ b/src/query/helper.rs @@ -174,9 +174,41 @@ pub trait QuerySelect: Sized { /// .to_string(), /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` OFFSET 10" /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .offset(Some(10)) + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` OFFSET 10" + /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .offset(None) + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .offset(10) + /// .offset(None) // This will reset the offset + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + /// ); /// ``` - fn offset(mut self, offset: u64) -> Self { - self.query().offset(offset); + fn offset(mut self, offset: T) -> Self + where + T: Into>, + { + if let Some(offset) = offset.into() { + self.query().offset(offset); + } else { + self.query().reset_offset(); + } self } @@ -191,9 +223,41 @@ pub trait QuerySelect: Sized { /// .to_string(), /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 10" /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .limit(Some(10)) + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 10" + /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .limit(None) + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + /// ); + /// + /// assert_eq!( + /// cake::Entity::find() + /// .limit(10) + /// .limit(None) + /// .build(DbBackend::MySql) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + /// ); /// ``` - fn limit(mut self, limit: u64) -> Self { - self.query().limit(limit); + fn limit(mut self, limit: T) -> Self + where + T: Into>, + { + if let Some(limit) = limit.into() { + self.query().limit(limit); + } else { + self.query().reset_limit(); + } self }