use reifydb_codec::{
key::encoded::{EncodedKey, EncodedKeyRange},
row::operator::EncodedOperatorRow,
};
use reifydb_value::{
Result,
value::{datetime::DateTime, row_number::RowNumber},
};
use crate::key::operator_state::{GroupId, GroupStateKey};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum TimerKind {
Seal = 0,
Grace = 1,
RowTtl = 2,
Maintenance = 3,
}
impl TimerKind {
pub fn is_unique(&self) -> bool {
matches!(self, Self::Maintenance)
}
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0 => Some(Self::Seal),
1 => Some(Self::Grace),
2 => Some(Self::RowTtl),
3 => Some(Self::Maintenance),
_ => None,
}
}
}
pub trait StateStore {
fn state_get(&mut self, key: &GroupStateKey) -> Result<Option<EncodedOperatorRow>>;
fn state_get_many_visit(
&mut self,
keys: &[GroupStateKey],
visit: &mut dyn FnMut(GroupStateKey, EncodedOperatorRow) -> Result<()>,
) -> Result<()>;
fn state_set(&mut self, key: &GroupStateKey, payload: EncodedOperatorRow) -> Result<()>;
fn state_remove(&mut self, key: &GroupStateKey) -> Result<()>;
fn state_range_visit(
&mut self,
range: EncodedKeyRange,
limit: Option<usize>,
visit: &mut dyn FnMut(GroupStateKey, EncodedOperatorRow) -> Result<()>,
) -> Result<()>;
fn state_last(&mut self, range: EncodedKeyRange) -> Result<Option<(GroupStateKey, EncodedOperatorRow)>> {
let mut last = None;
self.state_range_visit(range, None, &mut |key, payload| {
last = Some((key, payload));
Ok(())
})?;
Ok(last)
}
fn intern_groups(&mut self, groups: &[EncodedKey]) -> Result<Vec<(GroupId, bool)>>;
fn lookup_groups(&mut self, groups: &[EncodedKey]) -> Result<Vec<Option<GroupId>>>;
fn get_or_create_row_numbers(&mut self, group: GroupId, keys: &[EncodedKey]) -> Result<Vec<(RowNumber, bool)>>;
fn get_or_create_row_numbers_for_pairs(
&mut self,
pairs: &[(GroupId, EncodedKey)],
) -> Result<Vec<(RowNumber, bool)>>;
fn remove_row_number(&mut self, group: GroupId, key: &EncodedKey) -> Result<()>;
fn written_at(&self) -> DateTime;
}
pub trait TimerStore {
fn arm_timer(&mut self, due: DateTime, kind: TimerKind, key: &EncodedKey) -> Result<()>;
fn disarm_timer(&mut self, due: DateTime, kind: TimerKind, key: &EncodedKey) -> Result<()>;
fn flow_watermark(&mut self) -> Result<Option<DateTime>>;
}