use std::sync::Arc;
use super::read_consistency_manager::ReadConsistencyManager;
#[derive(Default)]
pub struct CustomProcedureKeyHashCollection {
manager: Option<Arc<ReadConsistencyManager>>,
hashes: Vec<i64>,
}
impl CustomProcedureKeyHashCollection {
pub fn new(manager: Arc<ReadConsistencyManager>) -> Self {
Self {
manager: Some(manager),
hashes: Vec::new(),
}
}
pub fn add_hash(&mut self, hash: i64) {
self.hashes.push(hash);
}
pub fn update_sequence_number(&self, sequence_number: i64) {
if let Some(manager) = &self.manager {
for &hash in &self.hashes {
manager.update_key_sequence_number_by_hash(hash, sequence_number);
}
}
}
pub fn len(&self) -> usize {
self.hashes.len()
}
pub fn is_empty(&self) -> bool {
self.hashes.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unbound_collection_is_noop() {
let mut collection = CustomProcedureKeyHashCollection::default();
assert!(collection.is_empty());
collection.add_hash(1);
collection.add_hash(2);
assert_eq!(collection.len(), 2);
collection.update_sequence_number(5);
}
#[test]
fn bound_collection_advances_key_timestamps() {
let manager = Arc::new(ReadConsistencyManager::new(1, 1, 1, -1, 0));
let mut collection = CustomProcedureKeyHashCollection::new(Arc::clone(&manager));
let hash = manager.key_hash(b"proc-key");
collection.add_hash(hash);
collection.update_sequence_number(9);
assert_eq!(manager.get_key_sequence_number_by_hash(hash), 9);
}
}