use std::fmt::Debug;
use std::sync::Arc;
use glaredb_error::{DbError, Result};
use super::profile_buffer::ProfileBuffer;
use crate::catalog::profile::ExecutionProfile;
use crate::execution::partition_pipeline::ExecutablePartitionPipeline;
pub trait PipelineRuntime: Debug + Sync + Send + Clone {
fn default_partitions(&self) -> usize;
fn spawn_pipelines(
&self,
pipelines: Vec<ExecutablePartitionPipeline>,
errors: Arc<dyn ErrorSink>,
) -> Arc<dyn QueryHandle>;
}
pub trait QueryHandle: Debug + Sync + Send {
fn cancel(&self);
fn get_profile_buffer(&self) -> &ProfileBuffer;
fn generate_final_execution_profile(&self) -> Result<ExecutionProfile> {
let buffer = self.get_profile_buffer();
let profiles = buffer.take_profiles()?.into_iter().flatten().collect();
Ok(ExecutionProfile {
partition_pipeline_profiles: profiles,
})
}
}
pub trait ErrorSink: Debug + Sync + Send {
fn set_error(&self, error: DbError);
}