use nodedb_types::Surrogate;
use super::ReturningSpec;
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum CalvinReplySpec {
Count(Vec<u8>),
Rows(Vec<u8>),
PostImages(CalvinPostImagesSpec),
InstalledTimeseries(CalvinInstalledTimeseriesSpec),
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum CalvinRowEngine {
Document,
Crdt,
Kv,
Vector,
Columnar,
Timeseries,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct CalvinReplyRow {
pub identity: String,
pub surrogate: Surrogate,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct CalvinPostImagesSpec {
pub spec: ReturningSpec,
pub rls_filters: Vec<u8>,
pub collection: String,
pub engine: CalvinRowEngine,
pub rows: Vec<CalvinReplyRow>,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct CalvinInstalledTimeseriesSpec {
pub spec: ReturningSpec,
pub rls_filters: Vec<u8>,
pub collection: String,
pub ordinal: u64,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct CalvinInstall {
pub epoch: u64,
pub position: u32,
pub epoch_system_ms: i64,
pub reply: CalvinReplySpec,
pub user_write: bool,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct CalvinResolved {
pub redo: Vec<u8>,
pub reply: CalvinReplySpec,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::physical_plan::ReturningColumns;
#[test]
fn a_resolved_answer_round_trips() {
let resolved = CalvinResolved {
redo: vec![1, 2, 3],
reply: CalvinReplySpec::PostImages(CalvinPostImagesSpec {
spec: ReturningSpec {
columns: ReturningColumns::Star,
},
rls_filters: vec![9],
collection: "orders".into(),
engine: CalvinRowEngine::Kv,
rows: vec![CalvinReplyRow {
identity: "k1".into(),
surrogate: Surrogate::new(4),
}],
}),
};
let bytes = zerompk::to_msgpack_vec(&resolved).expect("encode");
let decoded: CalvinResolved = zerompk::from_msgpack(&bytes).expect("decode");
assert_eq!(decoded, resolved);
}
}