@@ -22,6 +22,7 @@ pub struct RecordBuffer {
22
22
inner : VecDeque < Rc < bam:: Record > > ,
23
23
overflow : Option < Rc < bam:: Record > > ,
24
24
cache_cigar : bool ,
25
+ min_refetch_distance : u64 ,
25
26
}
26
27
27
28
unsafe impl Sync for RecordBuffer { }
@@ -40,9 +41,18 @@ impl RecordBuffer {
40
41
inner : VecDeque :: new ( ) ,
41
42
overflow : None ,
42
43
cache_cigar,
44
+ min_refetch_distance : 1 ,
43
45
}
44
46
}
45
47
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
+
46
56
/// Return start position of buffer
47
57
fn start ( & self ) -> Option < u64 > {
48
58
self . inner . front ( ) . map ( |rec| rec. pos ( ) as u64 )
@@ -74,7 +84,7 @@ impl RecordBuffer {
74
84
let mut deleted = 0 ;
75
85
let window_start = start;
76
86
if self . inner . is_empty ( )
77
- || self . end ( ) . unwrap ( ) < window_start
87
+ || window_start . saturating_sub ( self . end ( ) . unwrap ( ) ) >= self . min_refetch_distance
78
88
|| self . tid ( ) . unwrap ( ) != tid as i32
79
89
|| self . start ( ) . unwrap ( ) > window_start
80
90
{
@@ -112,6 +122,11 @@ impl RecordBuffer {
112
122
113
123
let pos = record. pos ( ) ;
114
124
125
+ // skip records before the start
126
+ if pos < start as i64 {
127
+ continue ;
128
+ }
129
+
115
130
if self . cache_cigar {
116
131
Rc :: get_mut ( & mut record) . unwrap ( ) . cache_cigar ( ) ;
117
132
}
@@ -160,7 +175,6 @@ mod tests {
160
175
#[ test]
161
176
fn test_buffer ( ) {
162
177
let reader = bam:: IndexedReader :: from_path ( & "test/test.bam" ) . unwrap ( ) ;
163
-
164
178
let mut buffer = RecordBuffer :: new ( reader, false ) ;
165
179
166
180
buffer. fetch ( b"CHROMOSOME_I" , 1 , 5 ) . unwrap ( ) ;
0 commit comments