Doc tests

This commit is contained in:
Chris Tsang 2021-05-08 17:39:05 +08:00
parent add2e1ca0c
commit 4469b824e8
3 changed files with 138 additions and 77 deletions

View File

@ -17,16 +17,46 @@ pub trait EntityTrait: Iden + Default + Debug {
true 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> { fn find<'s>() -> Select<'s, Self> {
Select::new(Self::default()) 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> { fn find_one<'s>() -> Select<'s, Self> {
let mut select = Self::find(); let mut select = Self::find();
select.query().limit(1); select.query().limit(1);
select 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> fn find_one_by<'s, V>(v: V) -> Select<'s, Self>
where where
V: Into<Value>, V: Into<Value>,

View File

@ -44,24 +44,79 @@ pub trait ColumnTrait: Iden + Copy {
Expr::tbl(self.entity_iden(), *self).not_between(a, b) 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 { fn like(&'static self, s: &str) -> SimpleExpr {
Expr::tbl(self.entity_iden(), *self).like(s) 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 { fn not_like(&'static self, s: &str) -> SimpleExpr {
Expr::tbl(self.entity_iden(), *self).not_like(s) 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 { fn starts_with(&'static self, s: &str) -> SimpleExpr {
let pattern = format!("{}%", s); let pattern = format!("{}%", s);
Expr::tbl(self.entity_iden(), *self).like(&pattern) 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 { fn ends_with(&'static self, s: &str) -> SimpleExpr {
let pattern = format!("%{}", s); let pattern = format!("%{}", s);
Expr::tbl(self.entity_iden(), *self).like(&pattern) 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 { fn contains(&'static self, s: &str) -> SimpleExpr {
let pattern = format!("%{}%", s); let pattern = format!("%{}%", s);
Expr::tbl(self.entity_iden(), *self).like(&pattern) Expr::tbl(self.entity_iden(), *self).like(&pattern)

View File

@ -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::fmt::Debug;
use core::marker::PhantomData; use core::marker::PhantomData;
pub use sea_query::JoinType; pub use sea_query::JoinType;
@ -54,16 +54,49 @@ where
self 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 { pub fn filter(mut self, expr: SimpleExpr) -> Self {
self.select.and_where(expr); self.select.and_where(expr);
self 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 { pub fn order_by(mut self, col: E::Column) -> Self {
self.select.order_by((E::default(), col), Order::Asc); self.select.order_by((E::default(), col), Order::Asc);
self 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 { pub fn order_by_desc(mut self, col: E::Column) -> Self {
self.select.order_by((E::default(), col), Order::Desc); self.select.order_by((E::default(), col), Order::Desc);
self self
@ -81,18 +114,22 @@ where
self.prepare_join(JoinType::InnerJoin, E::Relation::rel_def(&rel)) 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 { pub fn query(&mut self) -> &mut SelectStatement {
&mut self.select &mut self.select
} }
/// Get a immutable ref to the query builder
pub fn as_query(&self) -> &SelectStatement { pub fn as_query(&self) -> &SelectStatement {
&self.select &self.select
} }
/// Take ownership of the query builder
pub fn into_query(self) -> SelectStatement { pub fn into_query(self) -> SelectStatement {
self.select self.select
} }
/// Build the query as [`Statement`]
pub fn build<B>(&self, builder: B) -> Statement pub fn build<B>(&self, builder: B) -> Statement
where where
B: QueryBuilder, B: QueryBuilder,
@ -108,91 +145,30 @@ mod tests {
use sea_query::MysqlQueryBuilder; use sea_query::MysqlQueryBuilder;
#[test] #[test]
fn test_1() { fn join_1() {
assert_eq!( assert_eq!(
cake::Entity::find().build(MysqlQueryBuilder).to_string(), cake::Entity::find()
"SELECT `cake`.`id`, `cake`.`name` FROM `cake`" .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] #[test]
fn test_2() { fn join_2() {
assert_eq!( assert_eq!(
cake::Entity::find() cake::Entity::find()
.filter(cake::Column::Id.eq(5)) .inner_join(cake::Relation::Fruit)
.filter(fruit::Column::Name.contains("cherry"))
.build(MysqlQueryBuilder) .build(MysqlQueryBuilder)
.to_string(), .to_string(),
"SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 5" [
); "SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
} "INNER JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id`",
"WHERE `fruit`.`name` LIKE \'%cherry%\'"
#[test] ]
fn test_3() { .join(" ")
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"
); );
} }
} }