15
15
// specific language governing permissions and limitations
16
16
// under the License.
17
17
18
+ use arrow:: array:: make_view;
18
19
use arrow:: array:: BufferBuilder ;
19
20
use arrow:: array:: GenericBinaryArray ;
20
21
use arrow:: array:: GenericStringArray ;
@@ -39,6 +40,7 @@ use datafusion_common::utils::proxy::VecAllocExt;
39
40
use crate :: aggregates:: group_values:: null_builder:: MaybeNullBufferBuilder ;
40
41
use arrow_array:: types:: GenericStringType ;
41
42
use datafusion_physical_expr_common:: binary_map:: { OutputType , INITIAL_BUFFER_CAPACITY } ;
43
+ use std:: mem;
42
44
use std:: sync:: Arc ;
43
45
use std:: vec;
44
46
@@ -424,23 +426,58 @@ pub struct ByteGroupValueViewBuilder {
424
426
nulls : MaybeNullBufferBuilder ,
425
427
}
426
428
427
- // impl ByteGroupValueViewBuilder {
428
- // fn append_val_inner<B>(&mut self, array: &ArrayRef, row: usize)
429
- // where
430
- // B: ByteViewType,
431
- // {
432
- // let arr = array.as_byte_view::<B>();
433
- // if arr.is_null(row) {
434
- // self.nulls.append(true);
435
- // self.views.push(0);
436
- // } else {
437
- // self.nulls.append(false);
438
- // let value: &[u8] = arr.value(row).as_ref();
439
- // self.buffer.append_slice(value);
440
- // self.offsets.push(O::usize_as(self.buffer.len()));
441
- // }
442
- // }
443
- // }
429
+ impl ByteGroupValueViewBuilder {
430
+ fn append_val_inner < B > ( & mut self , array : & ArrayRef , row : usize )
431
+ where
432
+ B : ByteViewType ,
433
+ {
434
+ let arr = array. as_byte_view :: < B > ( ) ;
435
+
436
+ // If a null row, set and return
437
+ if arr. is_null ( row) {
438
+ self . nulls . append ( true ) ;
439
+ self . views . push ( 0 ) ;
440
+ return ;
441
+ }
442
+
443
+ // Not null case
444
+ self . nulls . append ( false ) ;
445
+ let value: & [ u8 ] = arr. value ( row) . as_ref ( ) ;
446
+
447
+ let value_len = value. len ( ) ;
448
+ let view = if value_len > 12 {
449
+ // Ensure big enough block to hold the value firstly
450
+ self . ensure_in_progress_big_enough ( value_len) ;
451
+
452
+ // Append value
453
+ let block_id = self . completed . len ( ) ;
454
+ let offset = self . in_progress . len ( ) ;
455
+ self . in_progress . extend_from_slice ( value) ;
456
+
457
+ make_view ( value, block_id, offset)
458
+ } else {
459
+ make_view ( value, 0 , 0 )
460
+ } ;
461
+
462
+ // Append view
463
+ self . views . push ( view) ;
464
+ }
465
+
466
+ fn ensure_in_progress_big_enough ( & mut self , value_len : usize ) {
467
+ debug_assert ! ( value_len > 12 ) ;
468
+ let require_cap = self . in_progress . len ( ) + value_len;
469
+
470
+ // If current block isn't big enough, flush it and create a new in progress block
471
+ if require_cap > self . max_block_size {
472
+ let flushed_block = mem:: replace (
473
+ & mut self . in_progress ,
474
+ Vec :: with_capacity ( self . max_block_size ) ,
475
+ ) ;
476
+ let buffer = Buffer :: from_vec ( flushed_block) ;
477
+ self . completed . push ( buffer) ;
478
+ }
479
+ }
480
+ }
444
481
445
482
/// Determines if the nullability of the existing and new input array can be used
446
483
/// to short-circuit the comparison of the two values.
0 commit comments