Correctly apply filters on enum columns

This commit is contained in:
Billy Chan 2021-11-04 11:40:05 +08:00
parent f64f1e9216
commit 67bb168e49
No known key found for this signature in database
GPG Key ID: A2D690CAC7DF3CC7
2 changed files with 40 additions and 11 deletions

View File

@ -1,5 +1,5 @@
use crate::{EntityName, IdenStatic, Iterable}; use crate::{EntityName, IdenStatic, Iterable};
use sea_query::{DynIden, Expr, SeaRc, SelectStatement, SimpleExpr, Value}; use sea_query::{Alias, BinOper, DynIden, Expr, SeaRc, SelectStatement, SimpleExpr, Value};
use std::str::FromStr; use std::str::FromStr;
/// Defines a Column for an Entity /// Defines a Column for an Entity
@ -67,13 +67,18 @@ pub enum ColumnType {
} }
macro_rules! bind_oper { macro_rules! bind_oper {
( $op: ident ) => { ( $op: ident, $bin_op: ident ) => {
#[allow(missing_docs)] #[allow(missing_docs)]
fn $op<V>(&self, v: V) -> SimpleExpr fn $op<V>(&self, v: V) -> SimpleExpr
where where
V: Into<Value>, V: Into<Value>,
{ {
Expr::tbl(self.entity_name(), *self).$op(v) let val = Expr::val(v);
let expr = match self.def().get_column_type().get_enum_name() {
Some(enum_name) => val.as_enum(Alias::new(enum_name)),
None => val.into(),
};
Expr::tbl(self.entity_name(), *self).binary(BinOper::$bin_op, expr)
} }
}; };
} }
@ -130,12 +135,12 @@ pub trait ColumnTrait: IdenStatic + Iterable + FromStr {
(self.entity_name(), SeaRc::new(*self) as DynIden) (self.entity_name(), SeaRc::new(*self) as DynIden)
} }
bind_oper!(eq); bind_oper!(eq, Equal);
bind_oper!(ne); bind_oper!(ne, NotEqual);
bind_oper!(gt); bind_oper!(gt, GreaterThan);
bind_oper!(gte); bind_oper!(gte, GreaterThanOrEqual);
bind_oper!(lt); bind_oper!(lt, SmallerThan);
bind_oper!(lte); bind_oper!(lte, SmallerThanOrEqual);
/// ``` /// ```
/// use sea_orm::{entity::*, query::*, tests_cfg::cake, DbBackend}; /// use sea_orm::{entity::*, query::*, tests_cfg::cake, DbBackend};

View File

@ -30,8 +30,9 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> {
.insert(db) .insert(db)
.await?; .await?;
let model = Entity::find().one(db).await?.unwrap();
assert_eq!( assert_eq!(
Entity::find().one(db).await?.unwrap(), model,
Model { Model {
id: 1, id: 1,
category: None, category: None,
@ -39,6 +40,17 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> {
tea: None, tea: None,
} }
); );
assert_eq!(
model,
Entity::find()
.filter(Column::Id.is_not_null())
.filter(Column::Category.is_null())
.filter(Column::Color.is_null())
.filter(Column::Tea.is_null())
.one(db)
.await?
.unwrap()
);
let am = ActiveModel { let am = ActiveModel {
category: Set(Some(Category::Big)), category: Set(Some(Category::Big)),
@ -49,8 +61,9 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> {
.save(db) .save(db)
.await?; .await?;
let model = Entity::find().one(db).await?.unwrap();
assert_eq!( assert_eq!(
Entity::find().one(db).await?.unwrap(), model,
Model { Model {
id: 1, id: 1,
category: Some(Category::Big), category: Some(Category::Big),
@ -58,6 +71,17 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> {
tea: Some(Tea::EverydayTea), tea: Some(Tea::EverydayTea),
} }
); );
assert_eq!(
model,
Entity::find()
.filter(Column::Id.eq(1))
.filter(Column::Category.eq(Category::Big))
.filter(Column::Color.eq(Color::Black))
.filter(Column::Tea.eq(Tea::EverydayTea))
.one(db)
.await?
.unwrap()
);
let res = am.delete(db).await?; let res = am.delete(db).await?;