use super::{Expr, Extension, Ident, NoExt, OrderByExpr};
use crate::vocab::Meta;
use thin_vec::ThinVec;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WindowSpec<X: Extension = NoExt> {
Named {
name: Ident,
meta: Meta,
},
Inline {
definition: Box<WindowDefinition<X>>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct WindowDefinition<X: Extension = NoExt> {
pub existing: Option<Ident>,
pub partition_by: ThinVec<Expr<X>>,
pub order_by: ThinVec<OrderByExpr<X>>,
pub frame: Option<WindowFrame<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct WindowFrame<X: Extension = NoExt> {
pub units: WindowFrameUnits,
pub start: WindowFrameBound<X>,
pub end: Option<WindowFrameBound<X>>,
pub exclusion: Option<WindowFrameExclusion>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WindowFrameUnits {
Rows,
Range,
Groups,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WindowFrameBound<X: Extension = NoExt> {
CurrentRow {
meta: Meta,
},
UnboundedPreceding {
meta: Meta,
},
UnboundedFollowing {
meta: Meta,
},
Preceding {
offset: Box<Expr<X>>,
meta: Meta,
},
Following {
offset: Box<Expr<X>>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WindowFrameExclusion {
CurrentRow,
Group,
Ties,
NoOthers,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct NamedWindow<X: Extension = NoExt> {
pub name: Ident,
pub definition: WindowDefinition<X>,
pub meta: Meta,
}