use super::{Expr, Extension, Ident, NoExt, OrderByExpr, TableFactor};
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 struct MatchRecognize<X: Extension = NoExt> {
pub source: Box<TableFactor<X>>,
pub partition_by: ThinVec<Expr<X>>,
pub order_by: ThinVec<OrderByExpr<X>>,
pub measures: ThinVec<Measure<X>>,
pub rows_per_match: Option<RowsPerMatch>,
pub after_match_skip: Option<AfterMatchSkip>,
pub pattern: MatchRecognizePattern,
pub subsets: ThinVec<SubsetDefinition>,
pub define: ThinVec<SymbolDefinition<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 Measure<X: Extension = NoExt> {
pub expr: Expr<X>,
pub alias: Ident,
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 RowsPerMatch {
OneRow,
AllRows(Option<EmptyMatchesMode>),
}
#[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 EmptyMatchesMode {
Show,
Omit,
WithUnmatched,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum AfterMatchSkip {
PastLastRow {
meta: Meta,
},
ToNextRow {
meta: Meta,
},
ToFirst {
symbol: Ident,
meta: Meta,
},
ToLast {
symbol: Ident,
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 SubsetDefinition {
pub name: Ident,
pub members: ThinVec<Ident>,
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 SymbolDefinition<X: Extension = NoExt> {
pub symbol: Ident,
pub definition: Expr<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 enum MatchRecognizePattern {
Symbol {
symbol: Ident,
meta: Meta,
},
Start {
meta: Meta,
},
End {
meta: Meta,
},
Concat {
patterns: ThinVec<MatchRecognizePattern>,
meta: Meta,
},
Alternation {
patterns: ThinVec<MatchRecognizePattern>,
meta: Meta,
},
Group {
pattern: Box<MatchRecognizePattern>,
meta: Meta,
},
Exclude {
pattern: Box<MatchRecognizePattern>,
meta: Meta,
},
Permute {
patterns: ThinVec<MatchRecognizePattern>,
meta: Meta,
},
Repetition {
pattern: Box<MatchRecognizePattern>,
quantifier: RepetitionQuantifier,
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 RepetitionQuantifier {
ZeroOrMore,
OneOrMore,
AtMostOne,
Exactly(u32),
AtLeast(u32),
AtMost(u32),
Range(u32, u32),
}