Identity Tuple

This commit is contained in:
Chris Tsang 2021-05-19 21:37:56 +08:00
parent 0c4b69e3b3
commit 92ac1098cb
2 changed files with 21 additions and 12 deletions

View File

@ -1,30 +1,33 @@
use sea_query::{Iden, IntoIden}; use sea_query::{Iden, IntoIden};
use crate::{IdenStatic};
use std::rc::Rc; use std::rc::Rc;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum Identity { pub enum Identity {
Unary(Rc<dyn Iden>), Unary(Rc<dyn Iden>),
// Binary((Rc<dyn Iden>, Rc<dyn Iden>)), Binary(Rc<dyn Iden>, Rc<dyn Iden>),
// Ternary((Rc<dyn Iden>, Rc<dyn Iden>, Rc<dyn Iden>)), // Ternary(Rc<dyn Iden>, Rc<dyn Iden>, Rc<dyn Iden>),
} }
pub trait IntoIdentity { pub trait IntoIdentity {
fn into_identity(self) -> Identity; fn into_identity(self) -> Identity;
} }
impl Identity {
pub fn into_iden(self) -> Rc<dyn Iden> {
match self {
Self::Unary(iden) => iden,
}
}
}
impl<T> IntoIdentity for T impl<T> IntoIdentity for T
where where
T: IntoIden, T: IdenStatic,
{ {
fn into_identity(self) -> Identity { fn into_identity(self) -> Identity {
Identity::Unary(self.into_iden()) Identity::Unary(self.into_iden())
} }
} }
impl<T, C> IntoIdentity for (T, C)
where
T: IdenStatic,
C: IdenStatic,
{
fn into_identity(self) -> Identity {
Identity::Binary(self.0.into_iden(), self.1.into_iden())
}
}

View File

@ -219,6 +219,12 @@ fn join_condition(rel: RelationDef) -> SimpleExpr {
match (owner_keys, foreign_keys) { match (owner_keys, foreign_keys) {
(Identity::Unary(o1), Identity::Unary(f1)) => { (Identity::Unary(o1), Identity::Unary(f1)) => {
Expr::tbl(Rc::clone(&from_tbl), o1).equals(Rc::clone(&to_tbl), f1) Expr::tbl(Rc::clone(&from_tbl), o1).equals(Rc::clone(&to_tbl), f1)
} // _ => panic!("Owner key and foreign key mismatch"), }
(Identity::Binary(o1, o2), Identity::Binary(f1, f2)) => {
Expr::tbl(Rc::clone(&from_tbl), o1).equals(Rc::clone(&to_tbl), f1).and(
Expr::tbl(Rc::clone(&from_tbl), o2).equals(Rc::clone(&to_tbl), f2)
)
}
_ => panic!("Owner key and foreign key mismatch"),
} }
} }