@@ -181,7 +181,7 @@ impl<W: Write> BatchWriter<W> {
181
181
// be determined from the data buffer size (length is in bits rather than bytes)
182
182
self . write_all ( & arr. len ( ) . to_le_bytes ( ) ) ?;
183
183
// write data buffer
184
- self . write_buffer ( arr. values ( ) . inner ( ) ) ?;
184
+ self . write_boolean_buffer ( arr. values ( ) ) ?;
185
185
// write null buffer
186
186
self . write_null_buffer ( arr. nulls ( ) ) ?;
187
187
}
@@ -300,8 +300,7 @@ impl<W: Write> BatchWriter<W> {
300
300
// write null buffer length in bits
301
301
self . write_all ( & buffer. len ( ) . to_le_bytes ( ) ) ?;
302
302
// write null buffer
303
- let buffer = buffer. inner ( ) ;
304
- self . write_buffer ( buffer) ?;
303
+ self . write_boolean_buffer ( buffer) ?;
305
304
} else {
306
305
self . inner . write_all ( & 0_usize . to_le_bytes ( ) ) ?;
307
306
}
@@ -315,6 +314,19 @@ impl<W: Write> BatchWriter<W> {
315
314
self . inner . write_all ( buffer. as_slice ( ) )
316
315
}
317
316
317
+ fn write_boolean_buffer ( & mut self , buffer : & BooleanBuffer ) -> std:: io:: Result < ( ) > {
318
+ let inner_buffer = buffer. inner ( ) ;
319
+ if buffer. offset ( ) == 0 && buffer. len ( ) == inner_buffer. len ( ) {
320
+ // Not a sliced buffer, write the inner buffer directly
321
+ self . write_buffer ( inner_buffer) ?;
322
+ } else {
323
+ // Sliced buffer, create and write the sliced buffer
324
+ let buffer = buffer. sliced ( ) ;
325
+ self . write_buffer ( & buffer) ?;
326
+ }
327
+ Ok ( ( ) )
328
+ }
329
+
318
330
pub fn inner ( self ) -> W {
319
331
self . inner
320
332
}
@@ -621,6 +633,29 @@ mod test {
621
633
assert_eq ! ( batch, batch2) ;
622
634
}
623
635
636
+ #[ test]
637
+ fn roundtrip_sliced ( ) {
638
+ let batch = create_batch ( 8192 , true ) ;
639
+
640
+ let mut start = 0 ;
641
+ let batch_size = 128 ;
642
+ while start < batch. num_rows ( ) {
643
+ let end = ( start + batch_size) . min ( batch. num_rows ( ) ) ;
644
+ let sliced_batch = batch. slice ( start, end - start) ;
645
+ let buffer = Vec :: new ( ) ;
646
+ let mut writer = BatchWriter :: new ( buffer) ;
647
+ writer. write_partial_schema ( & sliced_batch. schema ( ) ) . unwrap ( ) ;
648
+ writer. write_batch ( & sliced_batch) . unwrap ( ) ;
649
+ let buffer = writer. inner ( ) ;
650
+
651
+ let mut reader = BatchReader :: new ( & buffer) ;
652
+ let batch2 = reader. read_batch ( ) . unwrap ( ) ;
653
+ assert_eq ! ( sliced_batch, batch2) ;
654
+
655
+ start = end;
656
+ }
657
+ }
658
+
624
659
fn create_batch ( num_rows : usize , allow_nulls : bool ) -> RecordBatch {
625
660
let schema = Arc :: new ( Schema :: new ( vec ! [
626
661
Field :: new( "bool" , DataType :: Boolean , true ) ,
0 commit comments