Skip to content

Commit 5e53adb

Browse files
committed
fix edge cases with range bounds and add even more tests
1 parent 7f70eeb commit 5e53adb

File tree

7 files changed

+1211
-119
lines changed

7 files changed

+1211
-119
lines changed

src/multi_reader.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ mod tests {
8989
let mut readers: VecDeque<_> = VecDeque::new();
9090

9191
for segment in &segments {
92-
readers.push_back(segment.iter());
92+
if let Some(iter) = segment.iter() {
93+
readers.push_back(iter);
94+
}
9395
}
9496

9597
let multi_reader = MultiReader::new(readers);
@@ -115,7 +117,9 @@ mod tests {
115117
let mut readers: VecDeque<_> = VecDeque::new();
116118

117119
for segment in &segments {
118-
readers.push_back(segment.iter());
120+
if let Some(iter) = segment.iter() {
121+
readers.push_back(iter);
122+
}
119123
}
120124

121125
let multi_reader = MultiReader::new(readers);
@@ -141,7 +145,9 @@ mod tests {
141145
let mut readers: VecDeque<_> = VecDeque::new();
142146

143147
for segment in &segments {
144-
readers.push_back(segment.iter());
148+
if let Some(iter) = segment.iter() {
149+
readers.push_back(iter);
150+
}
145151
}
146152

147153
let multi_reader = MultiReader::new(readers);

src/prefix.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ mod tests {
234234
let key = b"test_key";
235235
let prefixes: Vec<_> = extractor.extract(key).collect();
236236
assert_eq!(prefixes.len(), 1);
237-
assert_eq!(prefixes[0], b"test_key");
237+
assert_eq!(prefixes.first(), Some(&b"test_key".as_ref()));
238238
}
239239

240240
#[test]
@@ -245,19 +245,19 @@ mod tests {
245245
let key = b"longer_key";
246246
let prefixes: Vec<_> = extractor.extract(key).collect();
247247
assert_eq!(prefixes.len(), 1);
248-
assert_eq!(prefixes[0], b"longe");
248+
assert_eq!(prefixes.first(), Some(&b"longe".as_ref()));
249249

250250
// Key shorter than prefix
251251
let key = b"key";
252252
let prefixes: Vec<_> = extractor.extract(key).collect();
253253
assert_eq!(prefixes.len(), 1);
254-
assert_eq!(prefixes[0], b"key");
254+
assert_eq!(prefixes.first(), Some(&b"key".as_ref()));
255255

256256
// Key exactly prefix length
257257
let key = b"exact";
258258
let prefixes: Vec<_> = extractor.extract(key).collect();
259259
assert_eq!(prefixes.len(), 1);
260-
assert_eq!(prefixes[0], b"exact");
260+
assert_eq!(prefixes.first(), Some(&b"exact".as_ref()));
261261
}
262262

263263
#[test]
@@ -269,11 +269,11 @@ mod tests {
269269

270270
let prefixes: Vec<_> = full_key.extract(key).collect();
271271
assert_eq!(prefixes.len(), 1);
272-
assert_eq!(prefixes[0], b"");
272+
assert_eq!(prefixes.first(), Some(&b"".as_ref()));
273273

274274
let prefixes: Vec<_> = fixed.extract(key).collect();
275275
assert_eq!(prefixes.len(), 1);
276-
assert_eq!(prefixes[0], b"");
276+
assert_eq!(prefixes.first(), Some(&b"".as_ref()));
277277
}
278278

279279
#[test]
@@ -289,12 +289,12 @@ mod tests {
289289
let key = b"exact";
290290
let prefixes: Vec<_> = extractor.extract(key).collect();
291291
assert_eq!(prefixes.len(), 1);
292-
assert_eq!(prefixes[0], b"exact");
292+
assert_eq!(prefixes.first(), Some(&b"exact".as_ref()));
293293

294294
// Key longer than required length
295295
let key = b"longer_key";
296296
let prefixes: Vec<_> = extractor.extract(key).collect();
297297
assert_eq!(prefixes.len(), 1);
298-
assert_eq!(prefixes[0], b"longe");
298+
assert_eq!(prefixes.first(), Some(&b"longe".as_ref()));
299299
}
300300
}

src/range.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,15 +227,15 @@ impl TreeIter {
227227
range.start_bound().map(|x| &*x.user_key),
228228
range.end_bound().map(|x| &*x.user_key),
229229
)) {
230-
let reader = segment.range((
230+
if let Some(reader) = segment.range((
231231
range.start_bound().map(|x| &x.user_key).cloned(),
232232
range.end_bound().map(|x| &x.user_key).cloned(),
233-
));
234-
235-
iters.push(Box::new(reader.filter(move |item| match item {
236-
Ok(item) => seqno_filter(item.key.seqno, seqno),
237-
Err(_) => true,
238-
})));
233+
)) {
234+
iters.push(Box::new(reader.filter(move |item| match item {
235+
Ok(item) => seqno_filter(item.key.seqno, seqno),
236+
Err(_) => true,
237+
})));
238+
}
239239
}
240240
}
241241
_ => {

src/run_reader.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,15 @@ impl RunReader {
4444

4545
// TODO: lazily init readers?
4646
let lo_segment = run.deref().get(lo).expect("should exist");
47-
let lo_reader = lo_segment.range(range.clone())/* .cache_policy(cache_policy) */;
47+
let lo_reader = lo_segment
48+
.range(range.clone()) /* .cache_policy(cache_policy) */
49+
.map(|x| Box::new(x) as BoxedIterator);
4850

49-
// TODO: lazily init readers?
5051
let hi_reader = if hi > lo {
5152
let hi_segment = run.deref().get(hi).expect("should exist");
52-
Some(
53-
hi_segment.range(range), /* .cache_policy(cache_policy) */
54-
)
53+
hi_segment
54+
.range(range) /* .cache_policy(cache_policy) */
55+
.map(|x| Box::new(x) as BoxedIterator)
5556
} else {
5657
None
5758
};
@@ -60,8 +61,8 @@ impl RunReader {
6061
run,
6162
lo,
6263
hi,
63-
lo_reader: Some(Box::new(lo_reader)),
64-
hi_reader: hi_reader.map(|x| Box::new(x) as BoxedIterator),
64+
lo_reader,
65+
hi_reader,
6566
cache_policy,
6667
}
6768
}
@@ -82,9 +83,12 @@ impl Iterator for RunReader {
8283
self.lo += 1;
8384

8485
if self.lo < self.hi {
85-
self.lo_reader = Some(Box::new(
86-
self.run.get(self.lo).expect("should exist").iter(),
87-
) /* .cache_policy(self.cache_policy) */);
86+
self.lo_reader = self
87+
.run
88+
.get(self.lo)
89+
.expect("should exist")
90+
.iter()
91+
.map(|x| Box::new(x) as BoxedIterator); /* .cache_policy(self.cache_policy) */
8892
}
8993
} else if let Some(hi_reader) = &mut self.hi_reader {
9094
// NOTE: We reached the hi marker, so consume from it instead
@@ -111,9 +115,12 @@ impl DoubleEndedIterator for RunReader {
111115
self.hi -= 1;
112116

113117
if self.lo < self.hi {
114-
self.hi_reader = Some(Box::new(
115-
self.run.get(self.hi).expect("should exist").iter(),
116-
) /* .cache_policy(self.cache_policy) */);
118+
self.hi_reader = self
119+
.run
120+
.get(self.hi)
121+
.expect("should exist")
122+
.iter()
123+
.map(|x| Box::new(x) as BoxedIterator); /* .cache_policy(self.cache_policy) */
117124
}
118125
} else if let Some(lo_reader) = &mut self.lo_reader {
119126
// NOTE: We reached the lo marker, so consume from it instead

0 commit comments

Comments
 (0)