use crate::cure::{
dedup::Deduper,
gap::{GapDetector, GapInfo},
integrity::{IntegrityChecker, IntegrityReport},
};
use crate::storage::{StorageManager, StreamKey};
#[derive(Debug)]
pub struct RepairReport {
pub integrity: IntegrityReport,
pub deduped_kept: u64,
pub deduped_removed: u64,
pub orderbook_gaps: Vec<GapInfo>,
}
pub struct RepairPipeline<'a> {
storage: &'a StorageManager,
}
impl<'a> RepairPipeline<'a> {
pub fn new(storage: &'a StorageManager) -> Self {
Self { storage }
}
pub async fn run(
&self,
key: &StreamKey,
from_ms: i64,
to_ms: i64,
dry_run: bool,
) -> std::io::Result<RepairReport> {
let integrity = IntegrityChecker::new(self.storage)
.check(key, from_ms, to_ms)
.await?;
let (kept, removed) = if dry_run {
(integrity.record_count, integrity.duplicate_count)
} else {
Deduper::new(self.storage)
.dedup(key, from_ms, to_ms)
.await?
};
let kind_lower = key.stream_kind.to_lowercase();
let is_orderbook = kind_lower.contains("orderbook") || kind_lower.contains("delta");
let orderbook_gaps = if is_orderbook {
GapDetector::new(self.storage)
.detect(key, from_ms, to_ms)
.await?
} else {
vec![]
};
Ok(RepairReport {
integrity,
deduped_kept: kept,
deduped_removed: removed,
orderbook_gaps,
})
}
}