use crate::sql::Field;
use crate::sql::Table;
#[derive(Debug, Clone, Eq, PartialEq, Default)]
pub enum JoinType {
#[default]
Inner,
Left,
Right,
}
impl ToString for JoinType {
fn to_string(&self) -> String {
match self {
Self::Inner => "inner",
Self::Left => "left",
Self::Right => "right",
}
.to_string()
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Join<F: Field> {
pub join_type: JoinType,
pub alias: Option<String>,
pub dock_table_alias: String,
pub dock_field: F,
pub connector_field: F,
}
impl<F: Field> Join<F> {
pub fn to_sql(&self) -> String {
let join_as = if let Some(alias) = &self.alias {
format!(" as \"{alias}\"")
} else {
"".to_string()
};
return format!(
"{} join {}{} on {}.{} = {}.{}",
self.join_type.to_string(),
self.connector_field.table().sql_safe_table_name(),
join_as,
self.dock_table_alias,
self.dock_field.sql_safe_field_name(),
self.table_alias(),
self.connector_field.sql_safe_field_name()
);
}
pub fn table_alias(&self) -> &str {
if let Some(alias) = &self.alias {
alias
} else {
self.connector_field.table().sql_safe_table_name()
}
}
}