use crate::{EntityName, IdenStatic, Iterable}; pub use sea_query::ColumnType; use sea_query::{Expr, Iden, SimpleExpr, Value}; use std::rc::Rc; macro_rules! bind_oper { ( $op: ident ) => { fn $op(&self, v: V) -> SimpleExpr where V: Into, { Expr::tbl(self.entity_name(), *self).$op(v) } }; } macro_rules! bind_agg_func { ( $func: ident ) => { fn $func(&self) -> SimpleExpr { Expr::tbl(self.entity_name(), *self).$func() } }; } macro_rules! bind_vec_func { ( $func: ident ) => { #[allow(clippy::wrong_self_convention)] fn $func(&self, v: I) -> SimpleExpr where V: Into, I: IntoIterator, { Expr::tbl(self.entity_name(), *self).$func(v) } }; } pub trait ColumnTrait: IdenStatic + Iterable { type EntityName: EntityName; fn def(&self) -> ColumnType; fn entity_name(&self) -> Rc { Rc::new(Self::EntityName::default()) as Rc } fn as_column_ref(&self) -> (Rc, Rc) { (self.entity_name(), Rc::new(*self) as Rc) } bind_oper!(eq); bind_oper!(ne); bind_oper!(gt); bind_oper!(gte); bind_oper!(lt); bind_oper!(lte); /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, tests_cfg::cake, sea_query::MysqlQueryBuilder}; /// /// assert_eq!( /// cake::Entity::find() /// .filter(cake::Column::Id.between(2,3)) /// .build(MysqlQueryBuilder) /// .to_string(), /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` BETWEEN 2 AND 3" /// ); /// ``` fn between(&self, a: V, b: V) -> SimpleExpr where V: Into, { Expr::tbl(self.entity_name(), *self).between(a, b) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, tests_cfg::cake, sea_query::MysqlQueryBuilder}; /// /// assert_eq!( /// cake::Entity::find() /// .filter(cake::Column::Id.not_between(2,3)) /// .build(MysqlQueryBuilder) /// .to_string(), /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` NOT BETWEEN 2 AND 3" /// ); /// ``` fn not_between(&self, a: V, b: V) -> SimpleExpr where V: Into, { Expr::tbl(self.entity_name(), *self).not_between(a, b) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, 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(&self, s: &str) -> SimpleExpr { Expr::tbl(self.entity_name(), *self).like(s) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, 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(&self, s: &str) -> SimpleExpr { Expr::tbl(self.entity_name(), *self).not_like(s) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, 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(&self, s: &str) -> SimpleExpr { let pattern = format!("{}%", s); Expr::tbl(self.entity_name(), *self).like(&pattern) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, 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(&self, s: &str) -> SimpleExpr { let pattern = format!("%{}", s); Expr::tbl(self.entity_name(), *self).like(&pattern) } /// ``` /// use sea_orm::{ColumnTrait, EntityTrait, SelectHelper, 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(&self, s: &str) -> SimpleExpr { let pattern = format!("%{}%", s); Expr::tbl(self.entity_name(), *self).like(&pattern) } bind_agg_func!(max); bind_agg_func!(min); bind_agg_func!(sum); bind_agg_func!(count); fn if_null(&self, v: V) -> SimpleExpr where V: Into, { Expr::tbl(self.entity_name(), *self).if_null(v) } bind_vec_func!(is_in); bind_vec_func!(is_not_in); }