#[cfg(test)]
mod tests;
mod hash;
mod key;
use crate::db::{
executor::aggregate::{ExecutionConfig, ExecutionContext},
query::plan::GroupedExecutionConfig,
};
pub(in crate::db) use hash::{StableHash, stable_hash_from_digest, stable_hash_value};
pub(in crate::db) use key::{CanonicalKey, GroupKey, GroupKeySet, KeyCanonicalError};
const GROUPED_DEFAULT_MAX_GROUPS: u64 = 10_000;
const GROUPED_DEFAULT_MAX_GROUP_BYTES: u64 = 16 * 1024 * 1024;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::db::executor) struct GroupedBudgetObservability {
groups: u64,
aggregate_states: u64,
estimated_bytes: u64,
distinct_values: u64,
max_groups: u64,
max_group_bytes: u64,
}
impl GroupedBudgetObservability {
#[must_use]
pub(in crate::db::executor) const fn from_context(context: &ExecutionContext) -> Self {
Self {
groups: context.budget().groups(),
aggregate_states: context.budget().aggregate_states(),
estimated_bytes: context.budget().estimated_bytes(),
distinct_values: context.budget().distinct_values(),
max_groups: context.config().max_groups(),
max_group_bytes: context.config().max_group_bytes(),
}
}
#[must_use]
pub(in crate::db::executor) const fn groups(self) -> u64 {
self.groups
}
#[must_use]
pub(in crate::db::executor) const fn aggregate_states(self) -> u64 {
self.aggregate_states
}
#[must_use]
pub(in crate::db::executor) const fn estimated_bytes(self) -> u64 {
self.estimated_bytes
}
#[must_use]
pub(in crate::db::executor) const fn distinct_values(self) -> u64 {
self.distinct_values
}
#[must_use]
pub(in crate::db::executor) const fn max_groups(self) -> u64 {
self.max_groups
}
#[must_use]
pub(in crate::db::executor) const fn max_group_bytes(self) -> u64 {
self.max_group_bytes
}
}
#[must_use]
pub(in crate::db::executor) const fn default_grouped_execution_config() -> ExecutionConfig {
ExecutionConfig::with_hard_limits(GROUPED_DEFAULT_MAX_GROUPS, GROUPED_DEFAULT_MAX_GROUP_BYTES)
}
#[must_use]
pub(in crate::db::executor) const fn grouped_execution_config_from_planner_config(
planner_config: Option<GroupedExecutionConfig>,
) -> ExecutionConfig {
let Some(planner_config) = planner_config else {
return default_grouped_execution_config();
};
ExecutionConfig::with_hard_limits(
planner_config.max_groups(),
planner_config.max_group_bytes(),
)
}
#[must_use]
pub(in crate::db::executor) fn grouped_execution_context_from_planner_config(
planner_config: Option<GroupedExecutionConfig>,
) -> ExecutionContext {
ExecutionContext::new(grouped_execution_config_from_planner_config(planner_config))
}
#[must_use]
pub(in crate::db::executor) const fn grouped_budget_observability(
context: &ExecutionContext,
) -> GroupedBudgetObservability {
GroupedBudgetObservability::from_context(context)
}