1+ use itertools:: Itertools ;
12use vortex_error:: VortexResult ;
23use vortex_mask:: Mask ;
34
45use crate :: arrays:: { DecimalArray , DecimalEncoding , NativeDecimalType } ;
5- use crate :: compute:: { IsSortedFn , IsSortedIteratorExt } ;
6- use crate :: { Array , match_each_decimal_value_type} ;
6+ use crate :: compute:: { IsSortedIteratorExt , IsSortedKernel , IsSortedKernelAdapter } ;
7+ use crate :: { Array , match_each_decimal_value_type, register_kernel } ;
78
8- impl IsSortedFn < & DecimalArray > for DecimalEncoding {
9+ impl IsSortedKernel for DecimalEncoding {
910 fn is_sorted ( & self , array : & DecimalArray ) -> VortexResult < bool > {
1011 is_decimal_sorted ( array, false )
1112 }
@@ -15,6 +16,8 @@ impl IsSortedFn<&DecimalArray> for DecimalEncoding {
1516 }
1617}
1718
19+ register_kernel ! ( IsSortedKernelAdapter ( DecimalEncoding ) . lift( ) ) ;
20+
1821fn is_decimal_sorted ( array : & DecimalArray , strict : bool ) -> VortexResult < bool > {
1922 match_each_decimal_value_type ! ( array. values_type, |$S | {
2023 compute_is_sorted:: <$S >( array, strict)
@@ -38,12 +41,12 @@ where
3841 } )
3942 }
4043 Mask :: Values ( mask_values) => {
41- let buf = array. buffer :: < T > ( ) ;
42-
44+ let values = array. buffer :: < T > ( ) ;
4345 let iter = mask_values
4446 . boolean_buffer ( )
45- . set_indices ( )
46- . map ( |idx| buf[ idx] ) ;
47+ . iter ( )
48+ . zip_eq ( values)
49+ . map ( |( is_valid, v) | is_valid. then_some ( v) ) ;
4750
4851 Ok ( if strict {
4952 IsSortedIteratorExt :: is_strict_sorted ( iter)
5659
5760#[ cfg( test) ]
5861mod tests {
62+ use arrow_array:: types:: Decimal128Type ;
63+ use arrow_cast:: parse:: parse_decimal;
5964 use vortex_buffer:: buffer;
6065 use vortex_dtype:: DecimalDType ;
6166
@@ -65,10 +70,14 @@ mod tests {
6570
6671 #[ test]
6772 fn test_is_sorted ( ) {
68- let sorted = buffer ! [ 100i128 , 200i128 , 200i128 ] ;
69- let unsorted = buffer ! [ 200i128 , 100i128 , 200i128 ] ;
70-
7173 let dtype = DecimalDType :: new ( 19 , 2 ) ;
74+ let i100 =
75+ parse_decimal :: < Decimal128Type > ( "100.00" , dtype. precision ( ) , dtype. scale ( ) ) . unwrap ( ) ;
76+ let i200 =
77+ parse_decimal :: < Decimal128Type > ( "200.00" , dtype. precision ( ) , dtype. scale ( ) ) . unwrap ( ) ;
78+
79+ let sorted = buffer ! [ i100, i200, i200] ;
80+ let unsorted = buffer ! [ i200, i100, i200] ;
7281
7382 let sorted_array = DecimalArray :: new ( sorted, dtype, Validity :: NonNullable ) ;
7483 let unsorted_array = DecimalArray :: new ( unsorted, dtype, Validity :: NonNullable ) ;
@@ -79,8 +88,16 @@ mod tests {
7988
8089 #[ test]
8190 fn test_is_strict_sorted ( ) {
82- let strict_sorted = buffer ! [ 100i128 , 200i128 , 300i128 ] ;
83- let sorted = buffer ! [ 100i128 , 200i128 , 200i128 ] ;
91+ let dtype = DecimalDType :: new ( 19 , 2 ) ;
92+ let i100 =
93+ parse_decimal :: < Decimal128Type > ( "100.00" , dtype. precision ( ) , dtype. scale ( ) ) . unwrap ( ) ;
94+ let i200 =
95+ parse_decimal :: < Decimal128Type > ( "200.00" , dtype. precision ( ) , dtype. scale ( ) ) . unwrap ( ) ;
96+ let i300 =
97+ parse_decimal :: < Decimal128Type > ( "300.00" , dtype. precision ( ) , dtype. scale ( ) ) . unwrap ( ) ;
98+
99+ let strict_sorted = buffer ! [ i100, i200, i300] ;
100+ let sorted = buffer ! [ i100, i200, i200] ;
84101
85102 let dtype = DecimalDType :: new ( 19 , 2 ) ;
86103
0 commit comments