@@ -142,6 +142,242 @@ mod tests {
142
142
} ;
143
143
use test_log:: test;
144
144
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
+
145
381
#[ test]
146
382
fn v3_data_block_iter_forward ( ) -> crate :: Result < ( ) > {
147
383
let items = [
0 commit comments