1use crate::expr::TableRef;
2use crate::predicate::Predicate;
3use sql_orm_core::Entity;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum JoinType {
7 Inner,
8 Left,
9}
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct Join {
13 pub join_type: JoinType,
14 pub table: TableRef,
15 pub on: Predicate,
16}
17
18impl Join {
19 pub const fn new(join_type: JoinType, table: TableRef, on: Predicate) -> Self {
20 Self {
21 join_type,
22 table,
23 on,
24 }
25 }
26
27 pub fn inner(table: TableRef, on: Predicate) -> Self {
28 Self::new(JoinType::Inner, table, on)
29 }
30
31 pub fn left(table: TableRef, on: Predicate) -> Self {
32 Self::new(JoinType::Left, table, on)
33 }
34
35 pub fn inner_entity<E: Entity>(on: Predicate) -> Self {
36 Self::inner(TableRef::for_entity::<E>(), on)
37 }
38
39 pub fn left_entity<E: Entity>(on: Predicate) -> Self {
40 Self::left(TableRef::for_entity::<E>(), on)
41 }
42
43 pub fn inner_entity_as<E: Entity>(alias: &'static str, on: Predicate) -> Self {
44 Self::inner(TableRef::for_entity_as::<E>(alias), on)
45 }
46
47 pub fn left_entity_as<E: Entity>(alias: &'static str, on: Predicate) -> Self {
48 Self::left(TableRef::for_entity_as::<E>(alias), on)
49 }
50}