use crate::types::{DynIden, IntoIden};
use super::traits::{QueryBuilderTrait, QueryStatementBuilder};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReindexTarget {
Index,
Table,
Schema,
Database,
System,
}
#[derive(Debug, Clone)]
pub struct ReindexStatement {
pub(crate) target: Option<ReindexTarget>,
pub(crate) name: Option<DynIden>,
pub(crate) concurrently: bool,
pub(crate) verbose: bool,
pub(crate) tablespace: Option<DynIden>,
}
impl ReindexStatement {
pub fn new() -> Self {
Self {
target: None,
name: None,
concurrently: false,
verbose: false,
tablespace: None,
}
}
pub fn take(&mut self) -> Self {
Self {
target: self.target.take(),
name: self.name.take(),
concurrently: self.concurrently,
verbose: self.verbose,
tablespace: self.tablespace.take(),
}
}
pub fn index<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.target = Some(ReindexTarget::Index);
self.name = Some(name.into_iden());
self
}
pub fn table<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.target = Some(ReindexTarget::Table);
self.name = Some(name.into_iden());
self
}
pub fn schema<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.target = Some(ReindexTarget::Schema);
self.name = Some(name.into_iden());
self
}
pub fn database<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.target = Some(ReindexTarget::Database);
self.name = Some(name.into_iden());
self
}
pub fn system<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.target = Some(ReindexTarget::System);
self.name = Some(name.into_iden());
self
}
pub fn concurrently(&mut self) -> &mut Self {
self.concurrently = true;
self
}
pub fn verbose(&mut self) -> &mut Self {
self.verbose = true;
self
}
pub fn tablespace<T>(&mut self, tablespace: T) -> &mut Self
where
T: IntoIden,
{
self.tablespace = Some(tablespace.into_iden());
self
}
}
impl Default for ReindexStatement {
fn default() -> Self {
Self::new()
}
}
impl QueryStatementBuilder for ReindexStatement {
fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
use std::any::Any;
if let Some(postgres) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
{
use crate::backend::QueryBuilder;
postgres.build_reindex(self)
} else if let Some(_mysql) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
{
panic!(
"MySQL does not support REINDEX. Use OPTIMIZE TABLE or DROP/CREATE INDEX instead."
);
} else if let Some(sqlite) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
{
use crate::backend::QueryBuilder;
sqlite.build_reindex(self)
} else {
panic!("Unsupported query builder type");
}
}
}