quaint_forked/ast/
join.rs1use crate::ast::{ConditionTree, Table};
2
3#[derive(Debug, PartialEq, Clone)]
5pub struct JoinData<'a> {
6 pub(crate) table: Table<'a>,
7 pub(crate) conditions: ConditionTree<'a>,
8}
9
10impl<'a> JoinData<'a> {
11 pub fn all_from(table: impl Into<Table<'a>>) -> Self {
13 Self {
14 table: table.into(),
15 conditions: ConditionTree::NoCondition,
16 }
17 }
18}
19
20impl<'a, T> From<T> for JoinData<'a>
21where
22 T: Into<Table<'a>>,
23{
24 fn from(table: T) -> Self {
25 Self::all_from(table)
26 }
27}
28
29#[derive(Debug, PartialEq, Clone)]
31pub enum Join<'a> {
32 Inner(JoinData<'a>),
34 Left(JoinData<'a>),
36 Right(JoinData<'a>),
38 Full(JoinData<'a>),
40}
41
42pub trait Joinable<'a> {
44 fn on<T>(self, conditions: T) -> JoinData<'a>
61 where
62 T: Into<ConditionTree<'a>>;
63}
64
65impl<'a, U> Joinable<'a> for U
66where
67 U: Into<Table<'a>>,
68{
69 fn on<T>(self, conditions: T) -> JoinData<'a>
70 where
71 T: Into<ConditionTree<'a>>,
72 {
73 JoinData {
74 table: self.into(),
75 conditions: conditions.into(),
76 }
77 }
78}
79
80impl<'a> Joinable<'a> for JoinData<'a> {
81 fn on<T>(self, conditions: T) -> JoinData<'a>
82 where
83 T: Into<ConditionTree<'a>>,
84 {
85 let conditions = match self.conditions {
86 ConditionTree::NoCondition => conditions.into(),
87 cond => cond.and(conditions.into()),
88 };
89
90 JoinData {
91 table: self.table,
92 conditions,
93 }
94 }
95}