Skip to content

Commit 8bfff79

Browse files
alambjimexist
andauthored
add lt_bool, lt_eq_bool, gt_bool, gt_eq_bool (#860) (#868)
Co-authored-by: Jiayu Liu <[email protected]>
1 parent bfac9e5 commit 8bfff79

File tree

1 file changed

+105
-22
lines changed

1 file changed

+105
-22
lines changed

arrow/src/compute/kernels/comparison.rs

Lines changed: 105 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,15 @@ pub fn eq_utf8_scalar<OffsetSize: StringOffsetSizeTrait>(
624624
compare_op_scalar!(left, right, |a, b| a == b)
625625
}
626626

627-
/// Perform `left == right` operation on [`BooleanArray`]
628-
fn eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
627+
#[inline]
628+
fn binary_boolean_op<F>(
629+
left: &BooleanArray,
630+
right: &BooleanArray,
631+
op: F,
632+
) -> Result<BooleanArray>
633+
where
634+
F: Copy + Fn(u64, u64) -> u64,
635+
{
629636
binary_boolean_kernel(
630637
left,
631638
right,
@@ -640,32 +647,40 @@ fn eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
640647
right,
641648
right_offset_in_bits,
642649
len_in_bits,
643-
|a, b| !(a ^ b),
650+
op,
644651
)
645652
},
646653
)
647654
}
648655

656+
/// Perform `left == right` operation on [`BooleanArray`]
657+
fn eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
658+
binary_boolean_op(left, right, |a, b| !(a ^ b))
659+
}
660+
649661
/// Perform `left != right` operation on [`BooleanArray`]
650662
fn neq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
651-
binary_boolean_kernel(
652-
left,
653-
right,
654-
|left: &Buffer,
655-
left_offset_in_bits: usize,
656-
right: &Buffer,
657-
right_offset_in_bits: usize,
658-
len_in_bits: usize| {
659-
bitwise_bin_op_helper(
660-
left,
661-
left_offset_in_bits,
662-
right,
663-
right_offset_in_bits,
664-
len_in_bits,
665-
|a, b| (a ^ b),
666-
)
667-
},
668-
)
663+
binary_boolean_op(left, right, |a, b| (a ^ b))
664+
}
665+
666+
/// Perform `left < right` operation on [`BooleanArray`]
667+
fn lt_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
668+
binary_boolean_op(left, right, |a, b| ((!a) & b))
669+
}
670+
671+
/// Perform `left <= right` operation on [`BooleanArray`]
672+
fn lt_eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
673+
binary_boolean_op(left, right, |a, b| !(a & (!b)))
674+
}
675+
676+
/// Perform `left > right` operation on [`BooleanArray`]
677+
fn gt_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
678+
binary_boolean_op(left, right, |a, b| (a & (!b)))
679+
}
680+
681+
/// Perform `left >= right` operation on [`BooleanArray`]
682+
fn gt_eq_bool(left: &BooleanArray, right: &BooleanArray) -> Result<BooleanArray> {
683+
binary_boolean_op(left, right, |a, b| !((!a) & b))
669684
}
670685

671686
/// Perform `left == right` operation on [`BooleanArray`] and a scalar
@@ -1354,7 +1369,7 @@ mod tests {
13541369
vec![Some(true), Some(false), Some(false), Some(true), Some(true), None]
13551370
.into();
13561371
let b: BooleanArray =
1357-
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
1372+
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
13581373
.into();
13591374

13601375
let res: Vec<Option<bool>> = neq_bool(&a, &b).unwrap().iter().collect();
@@ -1365,6 +1380,74 @@ mod tests {
13651380
)
13661381
}
13671382

1383+
#[test]
1384+
fn test_boolean_array_lt() {
1385+
let a: BooleanArray =
1386+
vec![Some(true), Some(false), Some(false), Some(true), Some(true), None]
1387+
.into();
1388+
let b: BooleanArray =
1389+
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
1390+
.into();
1391+
1392+
let res: Vec<Option<bool>> = lt_bool(&a, &b).unwrap().iter().collect();
1393+
1394+
assert_eq!(
1395+
res,
1396+
vec![Some(false), Some(true), Some(false), Some(false), None, None]
1397+
)
1398+
}
1399+
1400+
#[test]
1401+
fn test_boolean_array_lt_eq() {
1402+
let a: BooleanArray =
1403+
vec![Some(true), Some(false), Some(false), Some(true), Some(true), None]
1404+
.into();
1405+
let b: BooleanArray =
1406+
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
1407+
.into();
1408+
1409+
let res: Vec<Option<bool>> = lt_eq_bool(&a, &b).unwrap().iter().collect();
1410+
1411+
assert_eq!(
1412+
res,
1413+
vec![Some(true), Some(true), Some(true), Some(false), None, None]
1414+
)
1415+
}
1416+
1417+
#[test]
1418+
fn test_boolean_array_gt() {
1419+
let a: BooleanArray =
1420+
vec![Some(true), Some(false), Some(false), Some(true), Some(true), None]
1421+
.into();
1422+
let b: BooleanArray =
1423+
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
1424+
.into();
1425+
1426+
let res: Vec<Option<bool>> = gt_bool(&a, &b).unwrap().iter().collect();
1427+
1428+
assert_eq!(
1429+
res,
1430+
vec![Some(false), Some(false), Some(false), Some(true), None, None]
1431+
)
1432+
}
1433+
1434+
#[test]
1435+
fn test_boolean_array_gt_eq() {
1436+
let a: BooleanArray =
1437+
vec![Some(true), Some(false), Some(false), Some(true), Some(true), None]
1438+
.into();
1439+
let b: BooleanArray =
1440+
vec![Some(true), Some(true), Some(false), Some(false), None, Some(false)]
1441+
.into();
1442+
1443+
let res: Vec<Option<bool>> = gt_eq_bool(&a, &b).unwrap().iter().collect();
1444+
1445+
assert_eq!(
1446+
res,
1447+
vec![Some(true), Some(false), Some(true), Some(true), None, None]
1448+
)
1449+
}
1450+
13681451
#[test]
13691452
fn test_boolean_array_eq_scalar() {
13701453
let a: BooleanArray = vec![Some(true), Some(false), None].into();

0 commit comments

Comments
 (0)