Skip to content

Commit 1c2c259

Browse files
allow to set minimum distance for refetching in bam::RecordBuffer.
1 parent 6da1052 commit 1c2c259

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/bam/buffer.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub struct RecordBuffer {
2222
inner: VecDeque<Rc<bam::Record>>,
2323
overflow: Option<Rc<bam::Record>>,
2424
cache_cigar: bool,
25+
min_refetch_distance: u64,
2526
}
2627

2728
unsafe impl Sync for RecordBuffer {}
@@ -40,9 +41,18 @@ impl RecordBuffer {
4041
inner: VecDeque::new(),
4142
overflow: None,
4243
cache_cigar,
44+
min_refetch_distance: 1,
4345
}
4446
}
4547

48+
/// maximum distance to previous fetch window such that a
49+
/// new fetch operation is performed. If the distance is smaller, buffer will simply
50+
/// read through until the start of the new fetch window (probably saving some time
51+
/// by avoiding the random access).
52+
pub fn set_min_refetch_distance(&mut self, min_refetch_distance: u64) {
53+
self.min_refetch_distance = min_refetch_distance;
54+
}
55+
4656
/// Return start position of buffer
4757
fn start(&self) -> Option<u64> {
4858
self.inner.front().map(|rec| rec.pos() as u64)
@@ -74,7 +84,7 @@ impl RecordBuffer {
7484
let mut deleted = 0;
7585
let window_start = start;
7686
if self.inner.is_empty()
77-
|| self.end().unwrap() < window_start
87+
|| window_start.saturating_sub(self.end().unwrap()) >= self.min_refetch_distance
7888
|| self.tid().unwrap() != tid as i32
7989
|| self.start().unwrap() > window_start
8090
{
@@ -112,6 +122,11 @@ impl RecordBuffer {
112122

113123
let pos = record.pos();
114124

125+
// skip records before the start
126+
if pos < start as i64 {
127+
continue;
128+
}
129+
115130
if self.cache_cigar {
116131
Rc::get_mut(&mut record).unwrap().cache_cigar();
117132
}
@@ -160,7 +175,6 @@ mod tests {
160175
#[test]
161176
fn test_buffer() {
162177
let reader = bam::IndexedReader::from_path(&"test/test.bam").unwrap();
163-
164178
let mut buffer = RecordBuffer::new(reader, false);
165179

166180
buffer.fetch(b"CHROMOSOME_I", 1, 5).unwrap();

0 commit comments

Comments
 (0)