@@ -24,7 +24,6 @@ use crate::{
24
24
compute:: concat,
25
25
} ;
26
26
use num:: abs;
27
- use num:: traits:: clamp_min;
28
27
29
28
/// Shifts array by defined number of items (to left or right)
30
29
/// A positive value for `offset` shifts the array to the right
@@ -64,18 +63,21 @@ pub fn shift(array: &dyn Array, offset: i64) -> Result<ArrayRef> {
64
63
} else if offset == i64:: MIN || abs ( offset) >= value_len {
65
64
Ok ( new_null_array ( array. data_type ( ) , array. len ( ) ) )
66
65
} else {
67
- let slice_offset = clamp_min ( -offset, 0 ) as usize ;
68
- let length = array. len ( ) - abs ( offset) as usize ;
69
- let slice = array. slice ( slice_offset, length) ;
70
-
71
- // Generate array with remaining `null` items
72
- let nulls = abs ( offset) as usize ;
73
- let null_arr = new_null_array ( array. data_type ( ) , nulls) ;
74
-
75
66
// Concatenate both arrays, add nulls after if shift > 0 else before
76
67
if offset > 0 {
68
+ let length = array. len ( ) - offset as usize ;
69
+ let slice = array. slice ( 0 , length) ;
70
+
71
+ // Generate array with remaining `null` items
72
+ let null_arr = new_null_array ( array. data_type ( ) , offset as usize ) ;
77
73
concat ( & [ null_arr. as_ref ( ) , slice. as_ref ( ) ] )
78
74
} else {
75
+ let offset = -offset as usize ;
76
+ let length = array. len ( ) - offset;
77
+ let slice = array. slice ( offset, length) ;
78
+
79
+ // Generate array with remaining `null` items
80
+ let null_arr = new_null_array ( array. data_type ( ) , offset) ;
79
81
concat ( & [ slice. as_ref ( ) , null_arr. as_ref ( ) ] )
80
82
}
81
83
}
0 commit comments