risingwave_frontend/utils/
group_by.rsuse auto_enums::auto_enum;
use crate::expr::ExprImpl;
#[derive(Debug, Clone)]
pub enum GroupBy {
GroupKey(Vec<ExprImpl>),
GroupingSets(Vec<Vec<ExprImpl>>),
Rollup(Vec<Vec<ExprImpl>>),
Cube(Vec<Vec<ExprImpl>>),
}
impl GroupBy {
pub fn is_empty(&self) -> bool {
match self {
GroupBy::GroupKey(group_key) => group_key.is_empty(),
GroupBy::GroupingSets(grouping_sets) => grouping_sets.is_empty(),
GroupBy::Rollup(rollup) => rollup.is_empty(),
GroupBy::Cube(cube) => cube.is_empty(),
}
}
#[auto_enum(Iterator)]
pub fn iter(&self) -> impl Iterator<Item = &ExprImpl> {
match self {
GroupBy::GroupKey(group_key) => group_key.iter(),
GroupBy::GroupingSets(grouping_sets) => grouping_sets.iter().flat_map(|v| v.iter()),
GroupBy::Rollup(rollup) => rollup.iter().flat_map(|v| v.iter()),
GroupBy::Cube(cube) => cube.iter().flat_map(|v| v.iter()),
}
}
#[auto_enum(Iterator)]
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut ExprImpl> {
match self {
GroupBy::GroupKey(group_key) => group_key.iter_mut(),
GroupBy::GroupingSets(grouping_sets) => {
grouping_sets.iter_mut().flat_map(|v| v.iter_mut())
}
GroupBy::Rollup(rollup) => rollup.iter_mut().flat_map(|v| v.iter_mut()),
GroupBy::Cube(cube) => cube.iter_mut().flat_map(|v| v.iter_mut()),
}
}
}