use cratestack_core::CoolError;
use cratestack_sql::ViewDescriptor;
use crate::{FindMany, FindUnique, SqlxRuntime, sqlx};
#[derive(Clone, Copy)]
pub struct ViewDelegate<'a, V: 'static, PK: 'static> {
pub(super) runtime: &'a SqlxRuntime,
pub(super) descriptor: &'static ViewDescriptor<V, PK>,
}
impl<'a, V: 'static, PK: 'static> ViewDelegate<'a, V, PK> {
pub fn new(runtime: &'a SqlxRuntime, descriptor: &'static ViewDescriptor<V, PK>) -> Self {
Self {
runtime,
descriptor,
}
}
pub fn descriptor(&self) -> &'static ViewDescriptor<V, PK> {
self.descriptor
}
pub fn find_many(&self) -> FindMany<'a, V, PK> {
FindMany {
runtime: self.runtime,
descriptor: self.descriptor,
filters: Vec::new(),
order_by: Vec::new(),
limit: None,
offset: None,
for_update: false,
}
}
pub fn find_unique(&self, id: PK) -> FindUnique<'a, V, PK> {
FindUnique {
runtime: self.runtime,
descriptor: self.descriptor,
id,
for_update: false,
policy_kind: crate::query::ReadPolicyKind::Detail,
}
}
pub async fn refresh(&self) -> Result<(), CoolError> {
if !self.descriptor.is_materialized {
return Err(CoolError::Forbidden(format!(
"view `{}` is not `@@materialized`; refresh() is only valid on materialized views",
self.descriptor.view_name
)));
}
let sql = format!(
"REFRESH MATERIALIZED VIEW CONCURRENTLY {}",
self.descriptor.view_name
);
sqlx::query(&sql)
.execute(self.runtime.pool())
.await
.map_err(|error| CoolError::Database(error.to_string()))?;
Ok(())
}
}
#[derive(Clone, Copy)]
pub struct ViewDelegateNoUnique<'a, V: 'static> {
runtime: &'a SqlxRuntime,
descriptor: &'static ViewDescriptor<V, ()>,
}
impl<'a, V: 'static> ViewDelegateNoUnique<'a, V> {
pub fn new(runtime: &'a SqlxRuntime, descriptor: &'static ViewDescriptor<V, ()>) -> Self {
Self {
runtime,
descriptor,
}
}
pub fn descriptor(&self) -> &'static ViewDescriptor<V, ()> {
self.descriptor
}
pub fn find_many(&self) -> FindMany<'a, V, ()> {
FindMany {
runtime: self.runtime,
descriptor: self.descriptor,
filters: Vec::new(),
order_by: Vec::new(),
limit: None,
offset: None,
for_update: false,
}
}
}