#![warn(missing_docs)]
mod agg_table;
mod choice;
mod exec;
mod gpu;
mod join_table;
mod probe;
mod rule;
mod translate;
pub use exec::{AggKind, AggSpec, JoinHow, MetalExec, MetalOp, SortKey};
pub use probe::GroupEstimate;
pub use rule::{AggregateChoice, ArrowMetalConfig, ArrowMetalRule, Decision, GroupChoice, JoinChoice, Report};
use std::sync::Arc;
use datafusion::execution::session_state::SessionStateBuilder;
use datafusion::physical_optimizer::optimizer::PhysicalOptimizer;
use datafusion::physical_optimizer::PhysicalOptimizerRule;
use datafusion::prelude::{SessionConfig, SessionContext};
pub fn physical_optimizer_rules(
rule: ArrowMetalRule,
) -> Vec<Arc<dyn PhysicalOptimizerRule + Send + Sync>> {
let mut rules = PhysicalOptimizer::new().rules;
let at = rules
.iter()
.rposition(|r| r.name() == "SanityCheckPlan")
.unwrap_or(rules.len());
let at = if at > 0 && rules[at - 1].name().starts_with("FilterPushdown") { at - 1 } else { at };
rules.insert(at, Arc::new(rule));
rules
}
pub fn with_arrowmetal(builder: SessionStateBuilder, rule: ArrowMetalRule) -> SessionStateBuilder {
builder.with_physical_optimizer_rules(physical_optimizer_rules(rule))
}
pub fn session_context(config: SessionConfig, rule: ArrowMetalRule) -> SessionContext {
let state = with_arrowmetal(
SessionStateBuilder::new().with_config(config).with_default_features(),
rule,
)
.build();
SessionContext::new_with_state(state)
}