Identity Tuple
This commit is contained in:
parent
0c4b69e3b3
commit
92ac1098cb
@ -1,30 +1,33 @@
|
||||
use sea_query::{Iden, IntoIden};
|
||||
use crate::{IdenStatic};
|
||||
use std::rc::Rc;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Identity {
|
||||
Unary(Rc<dyn Iden>),
|
||||
// Binary((Rc<dyn Iden>, Rc<dyn Iden>)),
|
||||
// Ternary((Rc<dyn Iden>, Rc<dyn Iden>, Rc<dyn Iden>)),
|
||||
Binary(Rc<dyn Iden>, Rc<dyn Iden>),
|
||||
// Ternary(Rc<dyn Iden>, Rc<dyn Iden>, Rc<dyn Iden>),
|
||||
}
|
||||
|
||||
pub trait IntoIdentity {
|
||||
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
|
||||
where
|
||||
T: IntoIden,
|
||||
T: IdenStatic,
|
||||
{
|
||||
fn into_identity(self) -> Identity {
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
@ -219,6 +219,12 @@ fn join_condition(rel: RelationDef) -> SimpleExpr {
|
||||
match (owner_keys, foreign_keys) {
|
||||
(Identity::Unary(o1), Identity::Unary(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"),
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user