11use std:: cmp:: Ordering ;
2+ use std:: fmt:: Debug ;
23
34use vortex_array:: accessor:: ArrayAccessor ;
45use vortex_array:: compute:: {
@@ -13,18 +14,10 @@ use vortex_scalar::Scalar;
1314
1415struct SearchNullableSlice < T > ( Vec < Option < T > > ) ;
1516
16- impl < T : PartialOrd > IndexOrd < Option < T > > for SearchNullableSlice < T > {
17+ impl < T : PartialOrd + Debug > IndexOrd < Option < T > > for SearchNullableSlice < T > {
1718 fn index_cmp ( & self , idx : usize , elem : & Option < T > ) -> Option < Ordering > {
18- match elem {
19- None => unreachable ! ( "Can't search for None" ) ,
20- Some ( v) => {
21- // SAFETY: Used in search_sorted_by same as the standard library. The search_sorted ensures idx is in bounds
22- match unsafe { self . 0 . get_unchecked ( idx) } {
23- None => Some ( Ordering :: Greater ) ,
24- Some ( i) => i. partial_cmp ( v) ,
25- }
26- }
27- }
19+ // SAFETY: Used in search_sorted_by same as the standard library. The search_sorted ensures idx is in bounds
20+ unsafe { self . 0 . get_unchecked ( idx) } . partial_cmp ( elem)
2821 }
2922}
3023
@@ -43,7 +36,7 @@ impl<T: NativePType> IndexOrd<Option<T>> for SearchPrimitiveSlice<T> {
4336 Some ( v) => {
4437 // SAFETY: Used in search_sorted_by same as the standard library. The search_sorted ensures idx is in bounds
4538 match unsafe { self . 0 . get_unchecked ( idx) } {
46- None => Some ( Ordering :: Greater ) ,
39+ None => Some ( Ordering :: Less ) ,
4740 Some ( i) => Some ( i. total_compare ( * v) ) ,
4841 }
4942 }
@@ -64,19 +57,19 @@ pub fn search_sorted_canonical_array(
6457) -> VortexResult < SearchResult > {
6558 match array. dtype ( ) {
6659 DType :: Bool ( _) => {
67- let bool_array = array. clone ( ) . into_bool ( ) . unwrap ( ) ;
60+ let bool_array = array. clone ( ) . into_bool ( ) ? ;
6861 let validity = bool_array. logical_validity ( ) ?. to_boolean_buffer ( ) ;
6962 let opt_values = bool_array
7063 . boolean_buffer ( )
7164 . iter ( )
7265 . zip ( validity. iter ( ) )
7366 . map ( |( b, v) | v. then_some ( b) )
7467 . collect :: < Vec < _ > > ( ) ;
75- let to_find = scalar. try_into ( ) . unwrap ( ) ;
68+ let to_find = scalar. try_into ( ) ? ;
7669 Ok ( SearchNullableSlice ( opt_values) . search_sorted ( & Some ( to_find) , side) )
7770 }
7871 DType :: Primitive ( p, _) => {
79- let primitive_array = array. clone ( ) . into_primitive ( ) . unwrap ( ) ;
72+ let primitive_array = array. clone ( ) . into_primitive ( ) ? ;
8073 let validity = primitive_array. logical_validity ( ) ?. to_boolean_buffer ( ) ;
8174 match_each_native_ptype ! ( p, |$P | {
8275 let opt_values = primitive_array
@@ -86,37 +79,32 @@ pub fn search_sorted_canonical_array(
8679 . zip( validity. iter( ) )
8780 . map( |( b, v) | v. then_some( b) )
8881 . collect:: <Vec <_>>( ) ;
89- let to_find: $P = scalar. try_into( ) . unwrap ( ) ;
82+ let to_find: $P = scalar. try_into( ) ? ;
9083 Ok ( SearchPrimitiveSlice ( opt_values) . search_sorted( & Some ( to_find) , side) )
9184 } )
9285 }
9386 DType :: Utf8 ( _) | DType :: Binary ( _) => {
94- let utf8 = array. clone ( ) . into_varbinview ( ) . unwrap ( ) ;
95- let opt_values = utf8
96- . with_iterator ( |iter| iter. map ( |v| v. map ( |u| u. to_vec ( ) ) ) . collect :: < Vec < _ > > ( ) )
97- . unwrap ( ) ;
87+ let utf8 = array. clone ( ) . into_varbinview ( ) ?;
88+ let opt_values =
89+ utf8. with_iterator ( |iter| iter. map ( |v| v. map ( |u| u. to_vec ( ) ) ) . collect :: < Vec < _ > > ( ) ) ?;
9890 let to_find = if matches ! ( array. dtype( ) , DType :: Utf8 ( _) ) {
99- BufferString :: try_from ( scalar)
100- . unwrap ( )
101- . as_str ( )
102- . as_bytes ( )
103- . to_vec ( )
91+ BufferString :: try_from ( scalar) ?. as_str ( ) . as_bytes ( ) . to_vec ( )
10492 } else {
105- ByteBuffer :: try_from ( scalar) . unwrap ( ) . to_vec ( )
93+ ByteBuffer :: try_from ( scalar) ? . to_vec ( )
10694 } ;
10795 Ok ( SearchNullableSlice ( opt_values) . search_sorted ( & Some ( to_find) , side) )
10896 }
10997 DType :: Struct ( ..) => {
11098 let scalar_vals = ( 0 ..array. len ( ) )
111- . map ( |i| scalar_at ( array, i) . unwrap ( ) )
112- . collect :: < Vec < _ > > ( ) ;
113- Ok ( scalar_vals. search_sorted ( & scalar. cast ( array. dtype ( ) ) . unwrap ( ) , side) )
99+ . map ( |i| scalar_at ( array, i) )
100+ . collect :: < VortexResult < Vec < _ > > > ( ) ? ;
101+ Ok ( scalar_vals. search_sorted ( & scalar. cast ( array. dtype ( ) ) ? , side) )
114102 }
115103 DType :: List ( ..) => {
116104 let scalar_vals = ( 0 ..array. len ( ) )
117- . map ( |i| scalar_at ( array, i) . unwrap ( ) )
118- . collect :: < Vec < _ > > ( ) ;
119- Ok ( scalar_vals. search_sorted ( & scalar. cast ( array. dtype ( ) ) . unwrap ( ) , side) )
105+ . map ( |i| scalar_at ( array, i) )
106+ . collect :: < VortexResult < Vec < _ > > > ( ) ? ;
107+ Ok ( scalar_vals. search_sorted ( & scalar. cast ( array. dtype ( ) ) ? , side) )
120108 }
121109 _ => unreachable ! ( "Not a canonical array" ) ,
122110 }
0 commit comments