Skip to content

Commit 2ee4eab

Browse files
Optimize UInt8 bitmap filter construction
1 parent ad211bb commit 2ee4eab

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

‎datafusion/physical-expr/src/expressions/in_list/primitive_filter.rs‎

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use arrow::array::{Array, ArrayRef, AsArray, BooleanArray};
2323
use arrow::buffer::{BooleanBuffer, NullBuffer};
2424
use arrow::datatypes::*;
25+
use arrow::util::bit_iterator::BitIndexIterator;
2526
use datafusion_common::{HashSet, Result, exec_datafusion_err};
2627
use std::hash::{Hash, Hasher};
2728

@@ -43,9 +44,25 @@ impl UInt8BitmapFilter {
4344
exec_datafusion_err!("UInt8BitmapFilter: expected UInt8 array")
4445
})?;
4546
let mut bits = [0u64; 4];
46-
for v in prim_array.iter().flatten() {
47-
let index = v as usize;
47+
let mut set_bit = |v: u8| {
48+
let index = usize::from(v);
4849
bits[index / 64] |= 1u64 << (index % 64);
50+
};
51+
52+
let values = prim_array.values();
53+
match prim_array.nulls() {
54+
None => {
55+
for &v in values {
56+
set_bit(v);
57+
}
58+
}
59+
Some(nulls) => {
60+
for i in
61+
BitIndexIterator::new(nulls.validity(), nulls.offset(), nulls.len())
62+
{
63+
set_bit(values[i]);
64+
}
65+
}
4966
}
5067
Ok(Self {
5168
null_count: prim_array.null_count(),

0 commit comments

Comments
 (0)