use crate::error::Result;
use crate::filters::{PushdownFilter, RecordFilter};
use crate::formats::vcf::{VcfReader, VcfRecord};
#[derive(Debug, Default, Clone)]
pub struct PushdownStats {
pub total_lines: usize,
pub pushdown_hits: usize,
pub full_parses: usize,
pub filter_passed: usize,
}
impl PushdownStats {
pub fn speedup(&self) -> f64 {
if self.total_lines == 0 {
return 1.0;
}
self.total_lines as f64 / self.full_parses.max(1) as f64
}
pub fn print_summary(&self) {
println!("Pushdown Statistics:");
println!(" Total lines: {}", self.total_lines);
println!(
" Pushdown hits: {} ({:.1}%)",
self.pushdown_hits,
100.0 * self.pushdown_hits as f64 / self.total_lines.max(1) as f64
);
println!(" Full parses: {}", self.full_parses);
println!(" Filter passed: {}", self.filter_passed);
println!(" Speedup: {:.2}x", self.speedup());
}
}
pub trait VcfReaderPushdown {
fn with_pushdown<F>(self, filter: F) -> Result<(PushdownIterator<F>, PushdownStats)>
where
F: PushdownFilter<VcfRecord>;
}
pub struct PushdownIterator<F>
where
F: PushdownFilter<VcfRecord>,
{
reader: VcfReader,
filter: F,
stats: PushdownStats,
}
impl<F> Iterator for PushdownIterator<F>
where
F: PushdownFilter<VcfRecord>,
{
type Item = Result<VcfRecord>;
fn next(&mut self) -> Option<Self::Item> {
use crate::core::GenomicRecordIterator;
use std::io::BufRead;
None }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pushdown_stats() {
let stats = PushdownStats {
total_lines: 1000,
pushdown_hits: 900,
full_parses: 100,
filter_passed: 50,
};
assert_eq!(stats.speedup(), 10.0); }
}