use datafusion::physical_plan::ExecutionPlan;
pub use query_planning::{
contract_report::{CapabilityContractReport, CapabilityDecisionRow},
mode::StatisticalAggregateExecutionMode,
optimizer::{NativeOptimizerDiagnostics, NativeOptimizerOptions},
source::SourceDiagnostics,
};
use crate::{final_plan_observation::observe_final_plan, native_exec::AlgeonNativeExecutionConfig};
pub(crate) mod native;
pub use native::{
AlgeonNativePhysicalOptimizerRule, NativeCapabilityAcceptedCandidateDiagnostics,
NativeCapabilityCompiledGraphDiagnostics, NativeCapabilityContractDiagnostics,
NativeCapabilityRejectedCandidateDiagnostics, NativePlanningDiagnostics, plan_with_native_diagnostics,
};
pub use crate::final_plan_observation::FinalPlanCoverage;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum FinalPlanDisposition {
DataFusion,
Native,
Mixed,
}
impl FinalPlanDisposition {
pub const fn as_str(self) -> &'static str {
match self {
Self::DataFusion => "datafusion",
Self::Native => "native",
Self::Mixed => "mixed",
}
}
}
impl std::fmt::Display for FinalPlanDisposition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[non_exhaustive]
pub enum AlgeonGpuExecutionMode {
#[default]
NativePreferred,
FunctionsOnly,
NativeRequired,
}
impl AlgeonGpuExecutionMode {
pub const fn rewrites_relational_plans(self) -> bool {
!matches!(self, Self::FunctionsOnly)
}
pub const fn rejects_datafusion_cpu(self) -> bool {
matches!(self, Self::NativeRequired)
}
pub const fn as_str(self) -> &'static str {
match self {
Self::FunctionsOnly => "functions_only",
Self::NativePreferred => "native_preferred",
Self::NativeRequired => "native_required",
}
}
}
impl std::fmt::Display for AlgeonGpuExecutionMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
pub fn classify_final_plan(plan: &dyn ExecutionPlan) -> FinalPlanDisposition {
observe_final_plan(plan).disposition()
}
#[derive(Debug, Clone)]
pub struct AlgeonNativeOptimizerConfig {
native_execution_config: AlgeonNativeExecutionConfig,
native_optimizer_options: NativeOptimizerOptions,
execution_mode: AlgeonGpuExecutionMode,
}
impl Default for AlgeonNativeOptimizerConfig {
fn default() -> Self {
Self {
native_execution_config: AlgeonNativeExecutionConfig::default(),
native_optimizer_options: NativeOptimizerOptions::default(),
execution_mode: AlgeonGpuExecutionMode::NativePreferred,
}
}
}
impl AlgeonNativeOptimizerConfig {
pub fn native_execution_config(&self) -> &AlgeonNativeExecutionConfig {
&self.native_execution_config
}
pub fn native_optimizer_options(&self) -> &NativeOptimizerOptions {
&self.native_optimizer_options
}
pub fn execution_mode(&self) -> AlgeonGpuExecutionMode {
self.execution_mode
}
pub fn with_execution_mode(mut self, mode: AlgeonGpuExecutionMode) -> Self {
self.execution_mode = mode;
self
}
pub fn statistical_aggregate_execution_mode(&self) -> StatisticalAggregateExecutionMode {
self.native_execution_config.statistical_aggregate_execution_mode()
}
pub fn with_native_execution_config(mut self, execution_config: AlgeonNativeExecutionConfig) -> Self {
self.native_execution_config = execution_config;
self
}
pub fn with_native_optimizer_options(mut self, options: NativeOptimizerOptions) -> Self {
self.native_optimizer_options = options;
self
}
pub fn with_statistical_aggregate_execution_mode(mut self, mode: StatisticalAggregateExecutionMode) -> Self {
self.native_execution_config =
self.native_execution_config.clone().with_statistical_aggregate_execution_mode(mode);
self
}
}