use diesel::{QueryableByName, RunQueryDsl, sql_query, sql_types::Bool};
use crate::{Error, PgPool, queries::with_conn};
#[derive(QueryableByName)]
struct PopulatedRow {
#[diesel(sql_type = Bool)]
populated: bool,
}
pub(crate) async fn refresh_queue_stats_snapshot(pool: PgPool) -> Result<(), Error> {
with_conn(pool, |conn| {
let populated = sql_query(
"SELECT ispopulated AS populated
FROM pg_matviews
WHERE schemaname = 'apalis' AND matviewname = 'queue_stats_snapshot'",
)
.load::<PopulatedRow>(conn)
.map_err(Error::database("checking queue stats snapshot population"))?
.into_iter()
.next()
.map(|row| row.populated)
.unwrap_or(false);
let stmt = if populated {
"REFRESH MATERIALIZED VIEW CONCURRENTLY apalis.queue_stats_snapshot"
} else {
"REFRESH MATERIALIZED VIEW apalis.queue_stats_snapshot"
};
sql_query(stmt)
.execute(conn)
.map(|_| ())
.map_err(Error::database("refreshing queue stats snapshot"))
})
.await
}