use crate::plan::NodeId;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SharedSubplanMaterializationDiagnostics {
pub considered_count: usize,
pub candidate_count: usize,
pub applied_count: usize,
pub candidates: Vec<SharedSubplanMaterializationCandidateDiagnostics>,
}
impl SharedSubplanMaterializationDiagnostics {
pub fn is_empty(&self) -> bool {
self.considered_count == 0 && self.candidate_count == 0 && self.applied_count == 0 && self.candidates.is_empty()
}
pub(crate) fn merge(&mut self, other: Self) {
self.considered_count += other.considered_count;
self.candidate_count += other.candidate_count;
self.applied_count += other.applied_count;
self.candidates.extend(other.candidates);
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SharedSubplanMaterializationCandidateDiagnostics {
pub(crate) rule_name: &'static str,
pub(crate) family_key: String,
pub aggregate_node_ids: Vec<NodeId>,
pub reuse_count: usize,
pub group_exprs: Vec<String>,
pub aggregate_exprs: Vec<String>,
pub filtered_aggregate_count: usize,
pub filtered_aggregate_memory_shape: String,
pub filtered_aggregate_estimation_input_rows: Option<u64>,
pub filtered_aggregate_estimated_materialization_bytes: Option<u64>,
pub filtered_aggregate_memory_budget_bytes: Option<u64>,
pub filtered_aggregate_memory_threshold_bytes: Option<u64>,
pub(crate) filtered_aggregate_memory_threshold_policy: String,
pub(crate) source_fingerprints: Vec<String>,
pub exact_source_variant_count: usize,
pub repeated_selected_source_bytes: Option<u64>,
pub duplicate_selected_source_bytes: Option<u64>,
pub applied: bool,
pub rejected_reason: Option<SharedSubplanMaterializationRejectedReason>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SharedSubplanMaterializationRejectedReason {
PredicateNotPostAggregateFilterable,
UnsupportedScalarAggregateShape,
PredicateColumnPropagationUnsupported,
}