@@ -235,25 +235,29 @@ where
235
235
/// especially when the operation can be vectorised, however, requires `op` to be infallible
236
236
/// for all possible values of its inputs
237
237
///
238
- /// # Panic
238
+ /// # Error
239
239
///
240
- /// Panics if the arrays have different lengths
240
+ /// This function gives error if the arrays have different lengths
241
241
pub fn binary < A , B , F , O > (
242
242
a : & PrimitiveArray < A > ,
243
243
b : & PrimitiveArray < B > ,
244
244
op : F ,
245
- ) -> PrimitiveArray < O >
245
+ ) -> Result < PrimitiveArray < O > >
246
246
where
247
247
A : ArrowPrimitiveType ,
248
248
B : ArrowPrimitiveType ,
249
249
O : ArrowPrimitiveType ,
250
250
F : Fn ( A :: Native , B :: Native ) -> O :: Native ,
251
251
{
252
- assert_eq ! ( a. len( ) , b. len( ) ) ;
252
+ if a. len ( ) != b. len ( ) {
253
+ return Err ( ArrowError :: ComputeError (
254
+ "Cannot perform binary operation on arrays of different length" . to_string ( ) ,
255
+ ) ) ;
256
+ }
253
257
let len = a. len ( ) ;
254
258
255
259
if a. is_empty ( ) {
256
- return PrimitiveArray :: from ( ArrayData :: new_empty ( & O :: DATA_TYPE ) ) ;
260
+ return Ok ( PrimitiveArray :: from ( ArrayData :: new_empty ( & O :: DATA_TYPE ) ) ) ;
257
261
}
258
262
259
263
let null_buffer = combine_option_bitmap ( & [ a. data ( ) , b. data ( ) ] , len) . unwrap ( ) ;
@@ -270,7 +274,7 @@ where
270
274
// `values` is an iterator with a known size from a PrimitiveArray
271
275
let buffer = unsafe { Buffer :: from_trusted_len_iter ( values) } ;
272
276
273
- unsafe { build_primitive_array ( len, buffer, null_count, null_buffer) }
277
+ Ok ( unsafe { build_primitive_array ( len, buffer, null_count, null_buffer) } )
274
278
}
275
279
276
280
/// Applies the provided fallible binary operation across `a` and `b`, returning any error,
@@ -344,32 +348,36 @@ where
344
348
///
345
349
/// The function is only evaluated for non-null indices
346
350
///
347
- /// # Panic
351
+ /// # Error
348
352
///
349
- /// Panics if the arrays have different lengths
353
+ /// This function gives error if the arrays have different lengths
350
354
pub ( crate ) fn binary_opt < A , B , F , O > (
351
355
a : & PrimitiveArray < A > ,
352
356
b : & PrimitiveArray < B > ,
353
357
op : F ,
354
- ) -> PrimitiveArray < O >
358
+ ) -> Result < PrimitiveArray < O > >
355
359
where
356
360
A : ArrowPrimitiveType ,
357
361
B : ArrowPrimitiveType ,
358
362
O : ArrowPrimitiveType ,
359
363
F : Fn ( A :: Native , B :: Native ) -> Option < O :: Native > ,
360
364
{
361
- assert_eq ! ( a. len( ) , b. len( ) ) ;
365
+ if a. len ( ) != b. len ( ) {
366
+ return Err ( ArrowError :: ComputeError (
367
+ "Cannot perform binary operation on arrays of different length" . to_string ( ) ,
368
+ ) ) ;
369
+ }
362
370
363
371
if a. is_empty ( ) {
364
- return PrimitiveArray :: from ( ArrayData :: new_empty ( & O :: DATA_TYPE ) ) ;
372
+ return Ok ( PrimitiveArray :: from ( ArrayData :: new_empty ( & O :: DATA_TYPE ) ) ) ;
365
373
}
366
374
367
375
if a. null_count ( ) == 0 && b. null_count ( ) == 0 {
368
- a. values ( )
376
+ Ok ( a. values ( )
369
377
. iter ( )
370
378
. zip ( b. values ( ) . iter ( ) )
371
379
. map ( |( a, b) | op ( * a, * b) )
372
- . collect ( )
380
+ . collect ( ) )
373
381
} else {
374
382
let iter_a = ArrayIter :: new ( a) ;
375
383
let iter_b = ArrayIter :: new ( b) ;
@@ -386,7 +394,7 @@ where
386
394
}
387
395
} ) ;
388
396
389
- values. collect ( )
397
+ Ok ( values. collect ( ) )
390
398
}
391
399
}
392
400
0 commit comments