use crate::{
db::{
PagedLoadExecution, PagedLoadExecutionWithTrace, PersistedRow,
query::fluent::load::FluentLoadQuery,
query::intent::{Query, QueryError},
},
traits::{EntityKind, EntityValue},
};
pub struct PagedLoadQuery<'a, E>
where
E: EntityKind,
{
inner: FluentLoadQuery<'a, E>,
}
impl<'a, E> FluentLoadQuery<'a, E>
where
E: PersistedRow,
{
pub fn page(self) -> Result<PagedLoadQuery<'a, E>, QueryError> {
self.ensure_paged_mode_ready()?;
Ok(PagedLoadQuery::from_inner(self))
}
pub fn execute_paged(self) -> Result<PagedLoadExecution<E>, QueryError>
where
E: PersistedRow + EntityValue,
{
self.page()?.execute()
}
}
impl<'a, E> PagedLoadQuery<'a, E>
where
E: PersistedRow,
{
const fn from_inner(inner: FluentLoadQuery<'a, E>) -> Self {
Self { inner }
}
fn map_inner(
mut self,
map: impl FnOnce(FluentLoadQuery<'a, E>) -> FluentLoadQuery<'a, E>,
) -> Self {
self.inner = map(self.inner);
self
}
#[must_use]
pub const fn query(&self) -> &Query<E> {
self.inner.query()
}
#[must_use]
pub fn cursor(self, token: impl Into<String>) -> Self {
self.map_inner(|query| query.cursor(token))
}
pub fn execute(self) -> Result<PagedLoadExecution<E>, QueryError>
where
E: PersistedRow + EntityValue,
{
self.execute_with_trace()
.map(PagedLoadExecutionWithTrace::into_execution)
}
pub fn execute_with_trace(self) -> Result<PagedLoadExecutionWithTrace<E>, QueryError>
where
E: PersistedRow + EntityValue,
{
self.inner.session.execute_load_query_paged_with_trace(
self.inner.query(),
self.inner.cursor_token.as_deref(),
)
}
}