use std::sync::Arc;
use std::time::Duration;
use rustc_hash::FxHashMap;
use varpulis_core::{Event, Value};
use crate::clock::Timestamp;
pub type SharedEvent = Arc<Event>;
pub const MAX_KLEENE_EVENTS: u32 = 20;
pub const MAX_ENUMERATION_RESULTS: usize = 10_000;
#[derive(Debug, Clone)]
pub enum SasePattern {
Event {
event_type: String,
predicate: Option<Predicate>,
alias: Option<String>,
},
Seq(Vec<SasePattern>),
And(Box<SasePattern>, Box<SasePattern>),
Or(Box<SasePattern>, Box<SasePattern>),
Not(Box<SasePattern>),
KleenePlus(Box<SasePattern>),
KleeneStar(Box<SasePattern>),
Within(Box<SasePattern>, Duration),
}
#[derive(Debug, Clone)]
pub enum Predicate {
Compare {
field: String,
op: CompareOp,
value: Value,
},
CompareRef {
field: String,
op: CompareOp,
ref_alias: String,
ref_field: String,
},
And(Box<Predicate>, Box<Predicate>),
Or(Box<Predicate>, Box<Predicate>),
Not(Box<Predicate>),
Expr(Box<varpulis_core::ast::Expr>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompareOp {
Eq,
NotEq,
Lt,
Le,
Gt,
Ge,
}
#[derive(Debug, Clone)]
pub struct StackEntry {
pub event: SharedEvent,
pub alias: Option<String>,
pub timestamp: Timestamp,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SelectionStrategy {
SkipTillAnyMatch,
SkipTillNextMatch,
StrictContiguous,
}
#[derive(Debug, Clone)]
pub struct MatchResult {
pub captured: FxHashMap<String, SharedEvent>,
pub stack: Vec<StackEntry>,
pub duration: Duration,
}
#[derive(Debug, Clone)]
pub struct GlobalNegation {
pub event_type: String,
pub predicate: Option<Predicate>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TimeSemantics {
#[default]
ProcessingTime,
EventTime,
}
#[derive(Debug, Clone)]
pub struct SaseStats {
pub active_runs: usize,
pub partitions: usize,
pub nfa_states: usize,
}
#[derive(Debug, Clone)]
pub struct RunSnapshot {
pub current_state: usize,
pub started_at_ns: i64,
}