use std::sync::Arc;
use query_runtime::runtime::{ExecutionCancellation, GpuBackendSession};
use super::{
AlgeonNativeExecutionConfig, QueryAdmissionSource, QueryAdmissionTicket, TaskContext, invocation_admission_ticket,
};
use crate::{error::Result, native_exec::admission::attempt_execution_required_error, planner::native::Invocation};
impl AlgeonNativeExecutionConfig {
pub(crate) fn with_query_admission_source(mut self, source: QueryAdmissionSource) -> Self {
self.query_admission_source = Some(source);
self.query_admission_ticket = None;
self
}
pub(crate) fn query_admission_source(&self) -> Option<QueryAdmissionSource> {
self.query_admission_source.clone()
}
pub(crate) fn with_existing_query_admission_ticket(mut self, ticket: Arc<QueryAdmissionTicket>) -> Self {
self.query_admission_ticket = Some(ticket);
self
}
#[cfg(feature = "cugraph")]
pub(crate) fn without_query_admission_ticket(mut self) -> Self {
self.query_admission_ticket = None;
self
}
#[cfg(test)]
pub(crate) fn query_admission_ticket_id(&self) -> Option<u64> {
self.query_admission_ticket.as_ref().map(|ticket| ticket.id())
}
pub(crate) fn query_admission_ticket_for_task_context(
&self,
task_context: &TaskContext,
) -> Option<Arc<QueryAdmissionTicket>> {
invocation_admission_ticket(task_context).or_else(|| self.query_admission_ticket.as_ref().map(Arc::clone))
}
#[cfg(test)]
pub(crate) fn query_admission_ticket_id_for_task_context(&self, task_context: &TaskContext) -> Option<u64> {
self.query_admission_ticket_for_task_context(task_context).map(|ticket| ticket.id())
}
pub(crate) fn attempt_cancellation(
&self,
task_context: &TaskContext,
operation: &'static str,
) -> Result<ExecutionCancellation> {
Invocation::of_task(task_context)
.and_then(Invocation::attempt)
.map(|attempt| attempt.cancellation().execution_cancellation())
.or_else(|| {
self.query_admission_ticket_for_task_context(task_context).map(|ticket| ticket.attempt_cancellation())
})
.ok_or_else(|| attempt_execution_required_error(operation))
}
pub(crate) fn query_admission_ticket(&self) -> Option<Arc<QueryAdmissionTicket>> {
self.query_admission_ticket.as_ref().map(Arc::clone)
}
pub fn has_query_admission_authority(&self) -> bool {
self.query_admission_source.is_some() || self.query_admission_ticket.is_some()
}
pub(crate) fn query_admission_source_matches(&self, session: &GpuBackendSession) -> bool {
self.query_admission_source.as_ref().is_some_and(|source| source.backend_matches(session))
}
}