mod add;
mod alter;
use super::model::{DropColumn, Operation};
use super::trigger::{Direction, Trigger};
use super::Plan;
pub(super) fn plan(operation: &Operation, latest_schema: &str) -> Plan {
match operation {
Operation::AddColumn(op) => add::plan(op, latest_schema),
Operation::AlterColumn(op) => alter::plan(op, latest_schema),
Operation::DropColumn(op) => drop_column(op, latest_schema),
Operation::Sql(op) => Plan {
statements: vec![op.up.clone()],
..Plan::default()
},
}
}
fn drop_column(op: &DropColumn, latest_schema: &str) -> Plan {
let mut plan = Plan {
drops: vec![(op.table.clone(), op.column.clone())],
..Plan::default()
};
if let Some(down) = &op.down {
plan.statements.extend(
Trigger {
table: &op.table,
physical_column: &op.column,
direction: Direction::Down,
expression: down,
latest_schema,
rewrite: None,
}
.install(),
);
plan.backfill_tables.push(op.table.clone());
}
plan
}