Skip to content

Commit 6bf739a

Browse files
fix(join!): joining with tables having composite primary keys
1 parent ea903cb commit 6bf739a

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

benzina-derive/src/join/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ impl<T: ToTokens> ToTokens for Identifiable<T> {
1919
fn to_tokens(&self, tokens: &mut TokenStream) {
2020
let Self { table } = self;
2121
tokens.extend(quote! {
22-
::benzina::__private::std::clone::Clone::clone(
23-
<_ as ::benzina::__private::diesel::associations::Identifiable>::id(&#table)
22+
::benzina::__private::deep_clone::DeepClone::deep_clone(
23+
&(<_ as ::benzina::__private::diesel::associations::Identifiable>::id(&#table),)
2424
)
2525
});
2626
}

benzina/src/__private.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,53 @@ pub type IndexMap<K, V> = indexmap::IndexMap<K, V, Hasher>;
2222
pub fn new_indexmap<K, V>() -> IndexMap<K, V> {
2323
IndexMap::with_hasher(Hasher::default())
2424
}
25+
26+
pub mod deep_clone {
27+
pub trait DeepClone {
28+
type Output;
29+
30+
fn deep_clone(&self) -> Self::Output;
31+
}
32+
33+
impl<T: Clone> DeepClone for &T {
34+
type Output = T;
35+
36+
fn deep_clone(&self) -> Self::Output {
37+
(*self).clone()
38+
}
39+
}
40+
41+
#[rustfmt::skip]
42+
mod impls {
43+
use super::DeepClone;
44+
45+
macro_rules! impl_deep_clone_for_tuples {
46+
($(($T:ident, $idx:tt)),+) => {
47+
impl<$($T: DeepClone),+> DeepClone for ($($T),+,) {
48+
type Output = ($(<$T as DeepClone>::Output),+,);
49+
50+
fn deep_clone(&self) -> Self::Output {
51+
($((&self).$idx.deep_clone()),+,)
52+
}
53+
}
54+
};
55+
}
56+
57+
impl_deep_clone_for_tuples!((T1, 0));
58+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1));
59+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2));
60+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3));
61+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4));
62+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5));
63+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6));
64+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7));
65+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8));
66+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9));
67+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10));
68+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11));
69+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12));
70+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13));
71+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13), (T15, 14));
72+
impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13), (T15, 14), (T16, 15));
73+
}
74+
}

0 commit comments

Comments
 (0)