use super::*;
impl<M: Model> QueryBuilder<M> {
#[must_use]
pub fn select(mut self, columns: Vec<&str>) -> Self {
self.select_columns = Some(columns.into_iter().map(|s| s.to_string()).collect());
self
}
#[must_use]
pub fn select_with_linked(
mut self,
local_columns: Vec<&str>,
linked_table: &str,
local_fk: &str,
remote_pk: &str,
linked_columns: Vec<&str>,
) -> Self {
let table_name = M::table_name();
let mut all_columns: Vec<String> = local_columns
.iter()
.map(|c| format!("{}.{}", table_name, c))
.collect();
for col in linked_columns {
all_columns.push(format!("{}.{}", linked_table, col));
}
self.select_columns = Some(all_columns);
self.joins.push(JoinClause {
join_type: JoinType::Left,
table: linked_table.to_string(),
alias: None,
left_column: format!("{}.{}", table_name, local_fk),
right_column: format!("{}.{}", linked_table, remote_pk),
});
self
}
#[must_use]
pub fn select_also_linked(
mut self,
linked_table: &str,
local_pk: &str,
remote_fk: &str,
linked_columns: Vec<&str>,
) -> Self {
let table_name = M::table_name();
let local_cols: Vec<String> = M::column_names()
.iter()
.map(|c| format!("{}.{}", table_name, c))
.collect();
let mut all_columns = local_cols;
for col in linked_columns {
all_columns.push(format!("{}.{}", linked_table, col));
}
self.select_columns = Some(all_columns);
self.joins.push(JoinClause {
join_type: JoinType::Left,
table: linked_table.to_string(),
alias: None,
left_column: format!("{}.{}", table_name, local_pk),
right_column: format!("{}.{}", linked_table, remote_fk),
});
self
}
#[must_use]
pub fn inner_join(self, table: &str, left_column: &str, right_column: &str) -> Self {
self.join(JoinType::Inner, table, None, left_column, right_column)
}
#[must_use]
pub fn inner_join_as(
self,
table: &str,
alias: &str,
left_column: &str,
right_column: &str,
) -> Self {
self.join(
JoinType::Inner,
table,
Some(alias),
left_column,
right_column,
)
}
#[must_use]
pub fn left_join(self, table: &str, left_column: &str, right_column: &str) -> Self {
self.join(JoinType::Left, table, None, left_column, right_column)
}
#[must_use]
pub fn left_join_as(
self,
table: &str,
alias: &str,
left_column: &str,
right_column: &str,
) -> Self {
self.join(
JoinType::Left,
table,
Some(alias),
left_column,
right_column,
)
}
#[must_use]
pub fn right_join(self, table: &str, left_column: &str, right_column: &str) -> Self {
self.join(JoinType::Right, table, None, left_column, right_column)
}
#[must_use]
pub fn right_join_as(
self,
table: &str,
alias: &str,
left_column: &str,
right_column: &str,
) -> Self {
self.join(
JoinType::Right,
table,
Some(alias),
left_column,
right_column,
)
}
fn join(
mut self,
join_type: JoinType,
table: &str,
alias: Option<&str>,
left_column: &str,
right_column: &str,
) -> Self {
if let Err(reason) = Self::validate_join_clause(table, alias, left_column, right_column) {
self.invalidate_query(reason);
return self;
}
self.joins.push(JoinClause {
join_type,
table: table.to_string(),
alias: alias.map(|s| s.to_string()),
left_column: left_column.to_string(),
right_column: right_column.to_string(),
});
self
}
}