pub fn ordinary_task_clause(alias: &'static str) -> String {
format!(
"NOT EXISTS (
SELECT 1 FROM recurrence_occurrences ro
JOIN recurrence_series rs
ON rs.workspace_id = ro.workspace_id AND rs.id = ro.series_id
WHERE ro.workspace_id = {alias}.workspace_id AND ro.task_id = {alias}.id
AND (ro.projection_state = 'archived'
OR (ro.projection_state = 'projected' AND rs.state = 'paused'))
)"
)
}
pub fn open_task_clause(alias: &'static str) -> String {
format!(
"{alias}.deleted = 0 AND {alias}.status NOT IN ('done', 'canceled') AND {}",
ordinary_task_clause(alias)
)
}
pub fn available_task_prefix(alias: &'static str) -> String {
format!("({alias}.available_at = '' OR {alias}.available_at <= ")
}
pub fn available_task_clause(alias: &'static str, now_expression: &str) -> String {
format!("{}{now_expression})", available_task_prefix(alias))
}
pub fn unresolved_blocker_clause(alias: &'static str) -> String {
format!(
"EXISTS (SELECT 1 FROM task_dependencies d
CROSS JOIN tasks blocker ON blocker.workspace_id = d.workspace_id AND blocker.id = d.depends_on_task_id
WHERE d.workspace_id = {alias}.workspace_id AND d.task_id = {alias}.id
AND {})",
open_task_clause("blocker"),
)
}
pub fn ready_dependency_clause(alias: &'static str) -> String {
format!("NOT {}", unresolved_blocker_clause(alias))
}
pub fn overdue_task_prefix(alias: &'static str) -> String {
format!(
"{} AND {alias}.due_on != '' AND {alias}.due_on < ",
open_task_clause(alias),
)
}
pub fn terminal_status_clause(alias: &'static str) -> String {
format!("{alias}.status IN ('done', 'canceled')")
}