use crate::SqlWriterValues;
use crate::types::Iden;
use crate::types::IntoIden;
use crate::types::TableRef;
use crate::types::write_iden;
use crate::types::write_table_ref;
use crate::writer::SqlWriter;
#[derive(Default, Debug, Clone)]
pub struct CreateIndex {
table: Option<TableRef>,
columns: Vec<Iden>,
primary: bool,
unique: bool,
}
impl CreateIndex {
pub fn new() -> Self {
Self::default()
}
pub fn to_values(&self) -> SqlWriterValues {
let mut w = SqlWriterValues::new();
write_create_index(&mut w, self);
w
}
pub fn to_sql(&self) -> String {
let mut sql = String::new();
write_create_index(&mut sql, self);
sql
}
pub fn table<T>(mut self, table: T) -> Self
where
T: Into<TableRef>,
{
self.table = Some(table.into());
self
}
pub fn column<T>(mut self, column: T) -> Self
where
T: IntoIden,
{
self.columns.push(column.into_iden());
self
}
pub fn primary(mut self) -> Self {
self.primary = true;
self
}
pub fn unique(mut self) -> Self {
self.unique = true;
self
}
}
fn write_create_index<W: SqlWriter>(w: &mut W, index: &CreateIndex) {
w.push_str("CREATE INDEX ");
if index.primary {
w.push_str("PRIMARY KEY ");
}
if index.unique {
w.push_str("UNIQUE ");
}
w.push_str("ON ");
if let Some(table) = &index.table {
write_table_ref(w, table);
}
write_index_columns(w, &index.columns);
}
pub(crate) fn write_table_index<W: SqlWriter>(w: &mut W, index: &CreateIndex) {
if index.primary {
w.push_str("PRIMARY KEY ");
}
if index.unique {
w.push_str("UNIQUE ");
}
write_index_columns(w, &index.columns);
}
fn write_index_columns<W: SqlWriter>(w: &mut W, columns: &[Iden]) {
w.push_str("(");
for (i, col) in columns.iter().enumerate() {
if i > 0 {
w.push_str(", ");
}
write_iden(w, col);
}
w.push_str(")");
}