#![deny(clippy::wildcard_enum_match_arm)]
use crate::bridge::envelope::PhysicalPlan;
use crate::types::Lsn;
use nodedb_physical::physical_plan::ArrayOp;
pub fn stamp_minted_lsn(plan: &mut PhysicalPlan, lsn: Lsn) {
match plan {
PhysicalPlan::Array(op) => stamp_array_op(op, lsn),
PhysicalPlan::Document(_)
| PhysicalPlan::Vector(_)
| PhysicalPlan::Crdt(_)
| PhysicalPlan::Graph(_)
| PhysicalPlan::Columnar(_)
| PhysicalPlan::Timeseries(_)
| PhysicalPlan::Kv(_)
| PhysicalPlan::Text(_)
| PhysicalPlan::Spatial(_)
| PhysicalPlan::Meta(_)
| PhysicalPlan::Query(_)
| PhysicalPlan::ClusterArray(_) => {}
}
}
fn stamp_array_op(op: &mut ArrayOp, lsn: Lsn) {
match op {
ArrayOp::Put { wal_lsn, .. } | ArrayOp::Delete { wal_lsn, .. } => *wal_lsn = lsn.as_u64(),
ArrayOp::Flush { .. }
| ArrayOp::OpenArray { .. }
| ArrayOp::Slice { .. }
| ArrayOp::SurrogateBitmapScan { .. }
| ArrayOp::Project { .. }
| ArrayOp::Aggregate { .. }
| ArrayOp::Elementwise { .. }
| ArrayOp::DropArray { .. }
| ArrayOp::Compact { .. } => {}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::TenantId;
use nodedb_array::types::ArrayId;
fn array_id() -> ArrayId {
ArrayId::new(TenantId::new(1), "g")
}
#[test]
fn put_carries_the_minted_lsn() {
let mut plan = PhysicalPlan::Array(ArrayOp::Put {
array_id: array_id(),
cells_msgpack: Vec::new(),
wal_lsn: 0,
provenance: None,
});
stamp_minted_lsn(&mut plan, Lsn::new(77));
let PhysicalPlan::Array(ArrayOp::Put { wal_lsn, .. }) = plan else {
panic!("expected an array put");
};
assert_eq!(wal_lsn, 77);
}
#[test]
fn delete_carries_the_minted_lsn() {
let mut plan = PhysicalPlan::Array(ArrayOp::Delete {
array_id: array_id(),
coords_msgpack: Vec::new(),
wal_lsn: 0,
provenance: None,
});
stamp_minted_lsn(&mut plan, Lsn::new(9));
let PhysicalPlan::Array(ArrayOp::Delete { wal_lsn, .. }) = plan else {
panic!("expected an array delete");
};
assert_eq!(wal_lsn, 9);
}
#[test]
fn flush_watermark_is_left_alone() {
let mut plan = PhysicalPlan::Array(ArrayOp::Flush {
array_id: array_id(),
wal_lsn: 5,
});
stamp_minted_lsn(&mut plan, Lsn::new(100));
let PhysicalPlan::Array(ArrayOp::Flush { wal_lsn, .. }) = plan else {
panic!("expected an array flush");
};
assert_eq!(wal_lsn, 5);
}
}