From 92ac1098cb74fb804ccf20a52c1664847c5e494d Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Wed, 19 May 2021 21:37:56 +0800 Subject: [PATCH] Identity Tuple --- src/entity/identity.rs | 25 ++++++++++++++----------- src/query/helper.rs | 8 +++++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/entity/identity.rs b/src/entity/identity.rs index 303956aa..516f5bef 100644 --- a/src/entity/identity.rs +++ b/src/entity/identity.rs @@ -1,30 +1,33 @@ use sea_query::{Iden, IntoIden}; +use crate::{IdenStatic}; use std::rc::Rc; #[derive(Debug, Clone)] pub enum Identity { Unary(Rc), - // Binary((Rc, Rc)), - // Ternary((Rc, Rc, Rc)), + Binary(Rc, Rc), + // Ternary(Rc, Rc, Rc), } pub trait IntoIdentity { fn into_identity(self) -> Identity; } -impl Identity { - pub fn into_iden(self) -> Rc { - match self { - Self::Unary(iden) => iden, - } - } -} - impl IntoIdentity for T where - T: IntoIden, + T: IdenStatic, { fn into_identity(self) -> Identity { Identity::Unary(self.into_iden()) } } + +impl IntoIdentity for (T, C) +where + T: IdenStatic, + C: IdenStatic, +{ + fn into_identity(self) -> Identity { + Identity::Binary(self.0.into_iden(), self.1.into_iden()) + } +} diff --git a/src/query/helper.rs b/src/query/helper.rs index 86c3f1e9..8da13e75 100644 --- a/src/query/helper.rs +++ b/src/query/helper.rs @@ -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"), } }