From 4469b824e870ce5ee7278939848bc53c638ddcd7 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Sat, 8 May 2021 17:39:05 +0800 Subject: [PATCH] Doc tests --- src/entity/base.rs | 30 ++++++++++ src/entity/column.rs | 55 ++++++++++++++++++ src/query/select.rs | 130 ++++++++++++++++++------------------------- 3 files changed, 138 insertions(+), 77 deletions(-) diff --git a/src/entity/base.rs b/src/entity/base.rs index 37c3ec35..a071b99e 100644 --- a/src/entity/base.rs +++ b/src/entity/base.rs @@ -17,16 +17,46 @@ pub trait EntityTrait: Iden + Default + Debug { true } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + /// ); + /// ``` fn find<'s>() -> Select<'s, Self> { Select::new(Self::default()) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find_one() + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 1" + /// ); + /// ``` fn find_one<'s>() -> Select<'s, Self> { let mut select = Self::find(); select.query().limit(1); select } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find_one_by(11) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 11 LIMIT 1" + /// ); + /// ``` fn find_one_by<'s, V>(v: V) -> Select<'s, Self> where V: Into, diff --git a/src/entity/column.rs b/src/entity/column.rs index d7758665..4e30d0ec 100644 --- a/src/entity/column.rs +++ b/src/entity/column.rs @@ -44,24 +44,79 @@ pub trait ColumnTrait: Iden + Copy { Expr::tbl(self.entity_iden(), *self).not_between(a, b) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Name.like("cheese")) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE 'cheese'" + /// ); + /// ``` fn like(&'static self, s: &str) -> SimpleExpr { Expr::tbl(self.entity_iden(), *self).like(s) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Name.not_like("cheese")) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` NOT LIKE 'cheese'" + /// ); + /// ``` fn not_like(&'static self, s: &str) -> SimpleExpr { Expr::tbl(self.entity_iden(), *self).not_like(s) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Name.starts_with("cheese")) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE 'cheese%'" + /// ); + /// ``` fn starts_with(&'static self, s: &str) -> SimpleExpr { let pattern = format!("{}%", s); Expr::tbl(self.entity_iden(), *self).like(&pattern) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Name.ends_with("cheese")) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE '%cheese'" + /// ); + /// ``` fn ends_with(&'static self, s: &str) -> SimpleExpr { let pattern = format!("%{}", s); Expr::tbl(self.entity_iden(), *self).like(&pattern) } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Name.contains("cheese")) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE '%cheese%'" + /// ); + /// ``` fn contains(&'static self, s: &str) -> SimpleExpr { let pattern = format!("%{}%", s); Expr::tbl(self.entity_iden(), *self).like(&pattern) diff --git a/src/query/select.rs b/src/query/select.rs index 6b2686d0..48d37da7 100644 --- a/src/query/select.rs +++ b/src/query/select.rs @@ -1,4 +1,4 @@ -use crate::{EntityTrait, Identity, Iterable, RelationDef, Statement}; +use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement}; use core::fmt::Debug; use core::marker::PhantomData; pub use sea_query::JoinType; @@ -54,16 +54,49 @@ where self } + /// ``` + /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .filter(cake::Column::Id.eq(5)) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 5" + /// ); + /// ``` pub fn filter(mut self, expr: SimpleExpr) -> Self { self.select.and_where(expr); self } + /// ``` + /// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .order_by(cake::Column::Id) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` ORDER BY `cake`.`id` ASC" + /// ); + /// ``` pub fn order_by(mut self, col: E::Column) -> Self { self.select.order_by((E::default(), col), Order::Asc); self } + /// ``` + /// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; + /// + /// assert_eq!( + /// cake::Entity::find() + /// .order_by_desc(cake::Column::Id) + /// .build(MysqlQueryBuilder) + /// .to_string(), + /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` ORDER BY `cake`.`id` DESC" + /// ); + /// ``` pub fn order_by_desc(mut self, col: E::Column) -> Self { self.select.order_by((E::default(), col), Order::Desc); self @@ -81,18 +114,22 @@ where self.prepare_join(JoinType::InnerJoin, E::Relation::rel_def(&rel)) } + /// Get a mutable ref to the query builder pub fn query(&mut self) -> &mut SelectStatement { &mut self.select } + /// Get a immutable ref to the query builder pub fn as_query(&self) -> &SelectStatement { &self.select } + /// Take ownership of the query builder pub fn into_query(self) -> SelectStatement { self.select } + /// Build the query as [`Statement`] pub fn build(&self, builder: B) -> Statement where B: QueryBuilder, @@ -108,91 +145,30 @@ mod tests { use sea_query::MysqlQueryBuilder; #[test] - fn test_1() { + fn join_1() { assert_eq!( - cake::Entity::find().build(MysqlQueryBuilder).to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake`" + cake::Entity::find() + .left_join(cake::Relation::Fruit) + .build(MysqlQueryBuilder) + .to_string(), + "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LEFT JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id`" ); } #[test] - fn test_2() { + fn join_2() { assert_eq!( cake::Entity::find() - .filter(cake::Column::Id.eq(5)) + .inner_join(cake::Relation::Fruit) + .filter(fruit::Column::Name.contains("cherry")) .build(MysqlQueryBuilder) .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 5" - ); - } - - #[test] - fn test_3() { - assert_eq!( - cake::Entity::find() - .filter(cake::Column::Name.like("cheese")) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE 'cheese'" - ); - assert_eq!( - cake::Entity::find() - .filter(cake::Column::Name.starts_with("cheese")) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE 'cheese%'" - ); - assert_eq!( - cake::Entity::find() - .filter(cake::Column::Name.ends_with("cheese")) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE '%cheese'" - ); - assert_eq!( - cake::Entity::find() - .filter(cake::Column::Name.contains("cheese")) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`name` LIKE '%cheese%'" - ); - } - - #[test] - fn test_4() { - assert_eq!( - cake::Entity::find_one() - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 1" - ); - } - - #[test] - fn test_5() { - assert_eq!( - cake::Entity::find_one_by(11) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 11 LIMIT 1" - ); - } - - #[test] - fn test_6() { - assert_eq!( - cake::Entity::find() - .order_by(cake::Column::Id) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` ORDER BY `cake`.`id` ASC" - ); - assert_eq!( - cake::Entity::find() - .order_by_desc(cake::Column::Id) - .build(MysqlQueryBuilder) - .to_string(), - "SELECT `cake`.`id`, `cake`.`name` FROM `cake` ORDER BY `cake`.`id` DESC" + [ + "SELECT `cake`.`id`, `cake`.`name` FROM `cake`", + "INNER JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id`", + "WHERE `fruit`.`name` LIKE \'%cherry%\'" + ] + .join(" ") ); } }