use crate::identifier::QualifiedName;
use crate::ir::catalog::Catalog;
use crate::ir::index::Index;
use crate::plan::policy::PlannerPolicy;
use crate::plan::raw_step::{RawStep, StepKind, TransactionConstraint};
use crate::plan::rewrite::sql;
pub fn should_rewrite_create(idx: &Index, target: &Catalog, policy: &PlannerPolicy) -> bool {
policy.create_index_concurrent() && target.table_exists(idx.on.qname()) && !idx.unique
}
pub fn should_rewrite_drop(
qname: &QualifiedName,
target: &Catalog,
policy: &PlannerPolicy,
) -> bool {
if !policy.create_index_concurrent() {
return false;
}
target
.indexes
.iter()
.find(|i| &i.qname == qname)
.is_some_and(|i| !i.unique)
}
pub fn create_step(idx: &Index, destructive: bool, destructive_reason: Option<String>) -> RawStep {
RawStep {
step_no: 0,
kind: StepKind::CreateIndexConcurrent,
destructive,
destructive_reason,
intent_id: None,
targets: vec![idx.qname.clone(), idx.on.qname().clone()],
sql: sql::create_index(idx, true),
transactional: TransactionConstraint::OutsideTransaction,
}
}
pub fn drop_step(
qname: &QualifiedName,
destructive: bool,
destructive_reason: Option<String>,
) -> RawStep {
RawStep {
step_no: 0,
kind: StepKind::DropIndexConcurrent,
destructive,
destructive_reason,
intent_id: None,
targets: vec![qname.clone()],
sql: sql::drop_index(qname, true),
transactional: TransactionConstraint::OutsideTransaction,
}
}