Skip to content

Commit 3c58f6b

Browse files
committed
add some test cases
1 parent 80b7d52 commit 3c58f6b

File tree

4 files changed

+373
-1
lines changed

4 files changed

+373
-1
lines changed

src/segment/block/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ impl Block {
7070
writer.write_all(data)?;
7171

7272
log::trace!(
73-
"Writing block with size {}B (compressed: {}B)",
73+
"Writing block with size {}B (compressed: {}B) (excluding header of {}B)",
7474
header.uncompressed_length,
7575
header.data_length,
76+
Header::serialized_len(),
7677
);
7778

7879
Ok(header)

src/segment/data_block/iter.rs

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,242 @@ mod tests {
142142
};
143143
use test_log::test;
144144

145+
#[test]
146+
fn v3_data_block_wtf() -> crate::Result<()> {
147+
let keys = [
148+
[0, 0, 0, 0, 0, 0, 0, 108],
149+
[0, 0, 0, 0, 0, 0, 0, 109],
150+
[0, 0, 0, 0, 0, 0, 0, 110],
151+
[0, 0, 0, 0, 0, 0, 0, 111],
152+
[0, 0, 0, 0, 0, 0, 0, 112],
153+
[0, 0, 0, 0, 0, 0, 0, 113],
154+
[0, 0, 0, 0, 0, 0, 0, 114],
155+
[0, 0, 0, 0, 0, 0, 0, 115],
156+
[0, 0, 0, 0, 0, 0, 0, 116],
157+
[0, 0, 0, 0, 0, 0, 0, 117],
158+
[0, 0, 0, 0, 0, 0, 0, 118],
159+
[0, 0, 0, 0, 0, 0, 0, 119],
160+
[0, 0, 0, 0, 0, 0, 0, 120],
161+
[0, 0, 0, 0, 0, 0, 0, 121],
162+
[0, 0, 0, 0, 0, 0, 0, 122],
163+
[0, 0, 0, 0, 0, 0, 0, 123],
164+
[0, 0, 0, 0, 0, 0, 0, 124],
165+
[0, 0, 0, 0, 0, 0, 0, 125],
166+
[0, 0, 0, 0, 0, 0, 0, 126],
167+
[0, 0, 0, 0, 0, 0, 0, 127],
168+
[0, 0, 0, 0, 0, 0, 0, 128],
169+
[0, 0, 0, 0, 0, 0, 0, 129],
170+
[0, 0, 0, 0, 0, 0, 0, 130],
171+
[0, 0, 0, 0, 0, 0, 0, 131],
172+
[0, 0, 0, 0, 0, 0, 0, 132],
173+
[0, 0, 0, 0, 0, 0, 0, 133],
174+
[0, 0, 0, 0, 0, 0, 0, 134],
175+
[0, 0, 0, 0, 0, 0, 0, 135],
176+
[0, 0, 0, 0, 0, 0, 0, 136],
177+
[0, 0, 0, 0, 0, 0, 0, 137],
178+
[0, 0, 0, 0, 0, 0, 0, 138],
179+
[0, 0, 0, 0, 0, 0, 0, 139],
180+
[0, 0, 0, 0, 0, 0, 0, 140],
181+
[0, 0, 0, 0, 0, 0, 0, 141],
182+
[0, 0, 0, 0, 0, 0, 0, 142],
183+
[0, 0, 0, 0, 0, 0, 0, 143],
184+
];
185+
186+
let items = keys
187+
.into_iter()
188+
.map(|key| InternalValue::from_components(key, "", 0, Value))
189+
.collect::<Vec<_>>();
190+
191+
for restart_interval in 1..=16 {
192+
let bytes = DataBlock::encode_items(&items, restart_interval, 1.33)?;
193+
194+
let data_block = DataBlock::new(Block {
195+
data: bytes.into(),
196+
header: Header {
197+
checksum: Checksum::from_raw(0),
198+
data_length: 0,
199+
uncompressed_length: 0,
200+
previous_block_offset: BlockOffset(0),
201+
},
202+
});
203+
204+
{
205+
let mut iter = data_block.iter();
206+
iter.seek(&10u64.to_be_bytes());
207+
iter.seek_upper(&110u64.to_be_bytes());
208+
let iter = iter.map(|x| x.materialize(data_block.as_slice()));
209+
210+
assert_eq!(
211+
items.iter().take(3).cloned().collect::<Vec<_>>(),
212+
iter.collect::<Vec<_>>(),
213+
);
214+
}
215+
216+
{
217+
let mut iter: crate::segment::data_block::Iter<'_> = data_block.iter();
218+
iter.seek(&10u64.to_be_bytes());
219+
iter.seek_upper(&110u64.to_be_bytes());
220+
let iter = iter.map(|x| x.materialize(data_block.as_slice()));
221+
222+
assert_eq!(
223+
items.iter().take(3).rev().cloned().collect::<Vec<_>>(),
224+
iter.rev().collect::<Vec<_>>(),
225+
);
226+
}
227+
228+
{
229+
let mut iter = data_block.iter();
230+
iter.seek(&10u64.to_be_bytes());
231+
iter.seek_upper(&110u64.to_be_bytes());
232+
233+
let mut iter = iter.map(|item| item.materialize(&data_block.inner.data));
234+
let mut count = 0;
235+
236+
for x in 0.. {
237+
if x % 2 == 0 {
238+
let Some(_) = iter.next() else {
239+
break;
240+
};
241+
242+
count += 1;
243+
} else {
244+
let Some(_) = iter.next_back() else {
245+
break;
246+
};
247+
248+
count += 1;
249+
}
250+
}
251+
252+
assert_eq!(3, count);
253+
}
254+
}
255+
256+
Ok(())
257+
}
258+
259+
#[test]
260+
fn v3_data_block_range() -> crate::Result<()> {
261+
let items = (100u64..110)
262+
.map(|i| InternalValue::from_components(i.to_be_bytes(), "", 0, Value))
263+
.collect::<Vec<_>>();
264+
265+
for restart_interval in 1..=16 {
266+
let bytes = DataBlock::encode_items(&items, restart_interval, 1.33)?;
267+
268+
let data_block = DataBlock::new(Block {
269+
data: bytes.into(),
270+
header: Header {
271+
checksum: Checksum::from_raw(0),
272+
data_length: 0,
273+
uncompressed_length: 0,
274+
previous_block_offset: BlockOffset(0),
275+
},
276+
});
277+
278+
{
279+
let mut iter = data_block.iter();
280+
iter.seek(&10u64.to_be_bytes());
281+
iter.seek_upper(&109u64.to_be_bytes());
282+
let iter = iter.map(|x| x.materialize(data_block.as_slice()));
283+
284+
assert_eq!(
285+
items.iter().take(10).cloned().collect::<Vec<_>>(),
286+
iter.collect::<Vec<_>>(),
287+
);
288+
}
289+
290+
{
291+
let mut iter: crate::segment::data_block::Iter<'_> = data_block.iter();
292+
iter.seek(&10u64.to_be_bytes());
293+
iter.seek_upper(&109u64.to_be_bytes());
294+
let iter = iter.map(|x| x.materialize(data_block.as_slice()));
295+
296+
assert_eq!(
297+
items.iter().take(10).rev().cloned().collect::<Vec<_>>(),
298+
iter.rev().collect::<Vec<_>>(),
299+
);
300+
}
301+
302+
{
303+
let mut iter = data_block.iter();
304+
iter.seek(&10u64.to_be_bytes());
305+
iter.seek_upper(&109u64.to_be_bytes());
306+
307+
let mut iter = iter.map(|item| item.materialize(&data_block.inner.data));
308+
let mut count = 0;
309+
310+
for x in 0.. {
311+
if x % 2 == 0 {
312+
let Some(_) = iter.next() else {
313+
break;
314+
};
315+
316+
count += 1;
317+
} else {
318+
let Some(_) = iter.next_back() else {
319+
break;
320+
};
321+
322+
count += 1;
323+
}
324+
}
325+
326+
assert_eq!(10, count);
327+
}
328+
}
329+
330+
Ok(())
331+
}
332+
333+
#[test]
334+
fn v3_data_block_range_ping_pong() -> crate::Result<()> {
335+
let items = (0u64..100)
336+
.map(|i| InternalValue::from_components(i.to_be_bytes(), "", 0, Value))
337+
.collect::<Vec<_>>();
338+
339+
for restart_interval in 1..=16 {
340+
let bytes = DataBlock::encode_items(&items, restart_interval, 1.33)?;
341+
342+
let data_block = DataBlock::new(Block {
343+
data: bytes.into(),
344+
header: Header {
345+
checksum: Checksum::from_raw(0),
346+
data_length: 0,
347+
uncompressed_length: 0,
348+
previous_block_offset: BlockOffset(0),
349+
},
350+
});
351+
352+
let mut iter = data_block.iter();
353+
iter.seek(&5u64.to_be_bytes());
354+
iter.seek_upper(&9u64.to_be_bytes());
355+
356+
let mut iter = iter.map(|item| item.materialize(&data_block.inner.data));
357+
let mut count = 0;
358+
359+
for x in 0.. {
360+
if x % 2 == 0 {
361+
let Some(_) = iter.next() else {
362+
break;
363+
};
364+
365+
count += 1;
366+
} else {
367+
let Some(_) = iter.next_back() else {
368+
break;
369+
};
370+
371+
count += 1;
372+
}
373+
}
374+
375+
assert_eq!(5, count);
376+
}
377+
378+
Ok(())
379+
}
380+
145381
#[test]
146382
fn v3_data_block_iter_forward() -> crate::Result<()> {
147383
let items = [

src/segment/index_block/iter.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,4 +398,67 @@ mod tests {
398398

399399
Ok(())
400400
}
401+
402+
#[test]
403+
fn v3_index_block_iter_range_1() -> crate::Result<()> {
404+
let items = [
405+
KeyedBlockHandle::new(b"a".into(), BlockOffset(0), 6_000),
406+
KeyedBlockHandle::new(b"b".into(), BlockOffset(13_000), 5_000),
407+
KeyedBlockHandle::new(b"c".into(), BlockOffset(13_000), 5_000),
408+
KeyedBlockHandle::new(b"d".into(), BlockOffset(13_000), 5_000),
409+
KeyedBlockHandle::new(b"e".into(), BlockOffset(13_000), 5_000),
410+
];
411+
412+
let bytes = IndexBlock::encode_items(&items)?;
413+
414+
let index_block = IndexBlock::new(Block {
415+
data: bytes.into(),
416+
header: Header {
417+
checksum: Checksum::from_raw(0),
418+
data_length: 0,
419+
uncompressed_length: 0,
420+
previous_block_offset: BlockOffset(0),
421+
},
422+
});
423+
424+
assert_eq!(index_block.len(), items.len());
425+
426+
{
427+
let mut iter = index_block.iter();
428+
assert!(iter.seek(b"b"), "should seek");
429+
assert!(iter.seek_upper(b"c"), "should seek");
430+
431+
let real_items: Vec<_> = iter
432+
.map(|item| item.materialize(&index_block.inner.data))
433+
.collect();
434+
435+
assert_eq!(
436+
items.iter().skip(1).take(3).cloned().collect::<Vec<_>>(),
437+
&*real_items,
438+
);
439+
}
440+
441+
{
442+
let mut iter = index_block.iter();
443+
assert!(iter.seek(b"b"), "should seek");
444+
assert!(iter.seek_upper(b"c"), "should seek");
445+
446+
let real_items: Vec<_> = iter
447+
.map(|item| item.materialize(&index_block.inner.data))
448+
.collect();
449+
450+
assert_eq!(
451+
items
452+
.iter()
453+
.skip(1)
454+
.take(3)
455+
.rev()
456+
.cloned()
457+
.collect::<Vec<_>>(),
458+
&*real_items,
459+
);
460+
}
461+
462+
Ok(())
463+
}
401464
}

0 commit comments

Comments
 (0)