Merge pull request #274 from SeaQL/active-enum-3

Enumeration - 3
This commit is contained in:
Billy Chan 2021-10-27 11:09:42 +08:00 committed by GitHub
commit a1f57ec0d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 27 deletions

View File

@ -245,8 +245,7 @@ impl ColumnType {
pub(crate) fn get_enum_name(&self) -> Option<&String> { pub(crate) fn get_enum_name(&self) -> Option<&String> {
match self { match self {
// FIXME: How to get rid of this feature gate? ColumnType::Enum(s, _) => Some(s),
ColumnType::Enum(s, _) if cfg!(feature = "sqlx-postgres") => Some(s),
_ => None, _ => None,
} }
} }
@ -300,13 +299,10 @@ impl From<ColumnType> for sea_query::ColumnType {
ColumnType::Money(s) => sea_query::ColumnType::Money(s), ColumnType::Money(s) => sea_query::ColumnType::Money(s),
ColumnType::Json => sea_query::ColumnType::Json, ColumnType::Json => sea_query::ColumnType::Json,
ColumnType::JsonBinary => sea_query::ColumnType::JsonBinary, ColumnType::JsonBinary => sea_query::ColumnType::JsonBinary,
ColumnType::Custom(s) => { ColumnType::Custom(s) | ColumnType::Enum(s, _) => {
sea_query::ColumnType::Custom(sea_query::SeaRc::new(sea_query::Alias::new(&s))) sea_query::ColumnType::Custom(sea_query::SeaRc::new(sea_query::Alias::new(&s)))
} }
ColumnType::Uuid => sea_query::ColumnType::Uuid, ColumnType::Uuid => sea_query::ColumnType::Uuid,
ColumnType::Enum(s, _) => {
sea_query::ColumnType::Custom(sea_query::SeaRc::new(sea_query::Alias::new(&s)))
}
} }
} }
} }

View File

@ -3,7 +3,7 @@ use crate::{
PrimaryKeyTrait, QueryTrait, PrimaryKeyTrait, QueryTrait,
}; };
use core::marker::PhantomData; use core::marker::PhantomData;
use sea_query::{Alias, Expr, Func, InsertStatement, ValueTuple}; use sea_query::{Alias, Expr, InsertStatement, ValueTuple};
#[derive(Debug)] #[derive(Debug)]
pub struct Insert<A> pub struct Insert<A>
@ -125,7 +125,6 @@ where
let av = am.take(col); let av = am.take(col);
let av_has_val = av.is_set() || av.is_unchanged(); let av_has_val = av.is_set() || av.is_unchanged();
let col_def = col.def(); let col_def = col.def();
let enum_name = col_def.get_column_type().get_enum_name();
if columns_empty { if columns_empty {
self.columns.push(av_has_val); self.columns.push(av_has_val);
@ -134,11 +133,10 @@ where
} }
if av_has_val { if av_has_val {
columns.push(col); columns.push(col);
let val = av.into_value().unwrap(); let val = Expr::val(av.into_value().unwrap());
let expr = if let Some(enum_name) = enum_name { let expr = match col_def.get_column_type().get_enum_name() {
Func::cast_as(val, Alias::new(enum_name)) Some(enum_name) => val.as_enum(Alias::new(enum_name)),
} else { None => val.into(),
Expr::val(val).into()
}; };
values.push(expr); values.push(expr);
} }

View File

@ -2,7 +2,7 @@ use crate::{ColumnTrait, EntityTrait, Iterable, QueryFilter, QueryOrder, QuerySe
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;
use sea_query::{Alias, DynIden, Expr, Func, IntoColumnRef, SeaRc, SelectStatement, SimpleExpr}; use sea_query::{Alias, DynIden, Expr, IntoColumnRef, SeaRc, SelectStatement, SimpleExpr};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Select<E> pub struct Select<E>
@ -115,15 +115,14 @@ where
fn column_list(&self) -> Vec<SimpleExpr> { fn column_list(&self) -> Vec<SimpleExpr> {
let table = SeaRc::new(E::default()) as DynIden; let table = SeaRc::new(E::default()) as DynIden;
let text_type = SeaRc::new(Alias::new("text")) as DynIden;
E::Column::iter() E::Column::iter()
.map(|col| { .map(|col| {
let col_def = col.def(); let col_def = col.def();
let enum_name = col_def.get_column_type().get_enum_name(); let expr = Expr::tbl(table.clone(), col);
let col_expr = Expr::tbl(table.clone(), col); match col_def.get_column_type().get_enum_name() {
if enum_name.is_some() { Some(_) => expr.as_enum(text_type.clone()),
Func::cast_expr_as(col_expr, Alias::new("text")) None => expr.into(),
} else {
col_expr.into()
} }
}) })
.collect() .collect()

View File

@ -3,7 +3,7 @@ use crate::{
QueryTrait, QueryTrait,
}; };
use core::marker::PhantomData; use core::marker::PhantomData;
use sea_query::{Alias, Expr, Func, IntoIden, SimpleExpr, UpdateStatement}; use sea_query::{Alias, Expr, IntoIden, SimpleExpr, UpdateStatement};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Update; pub struct Update;
@ -105,14 +105,12 @@ where
continue; continue;
} }
let col_def = col.def(); let col_def = col.def();
let enum_name = col_def.get_column_type().get_enum_name();
let av = self.model.get(col); let av = self.model.get(col);
if av.is_set() { if av.is_set() {
let val = av.into_value().unwrap(); let val = Expr::val(av.into_value().unwrap());
let expr = if let Some(enum_name) = enum_name { let expr = match col_def.get_column_type().get_enum_name() {
Func::cast_as(val, Alias::new(enum_name)) Some(enum_name) => val.as_enum(Alias::new(enum_name)),
} else { None => val.into(),
Expr::val(val).into()
}; };
self.query.value_expr(col, expr); self.query.value_expr(col, expr);
} }