Path: blob/main/crates/polars-arrow/src/compute/utils.rs
6939 views
use std::borrow::Borrow;1use std::ops::{BitAnd, BitOr};23use polars_error::{PolarsResult, polars_ensure};45use crate::array::Array;6use crate::bitmap::{Bitmap, and_not, push_bitchunk, ternary};78pub fn combine_validities_and3(9opt1: Option<&Bitmap>,10opt2: Option<&Bitmap>,11opt3: Option<&Bitmap>,12) -> Option<Bitmap> {13match (opt1, opt2, opt3) {14(Some(a), Some(b), Some(c)) => Some(ternary(a, b, c, |x, y, z| x & y & z)),15(Some(a), Some(b), None) => Some(a.bitand(b)),16(Some(a), None, Some(c)) => Some(a.bitand(c)),17(None, Some(b), Some(c)) => Some(b.bitand(c)),18(Some(a), None, None) => Some(a.clone()),19(None, Some(b), None) => Some(b.clone()),20(None, None, Some(c)) => Some(c.clone()),21(None, None, None) => None,22}23}2425pub fn combine_validities_and(opt_l: Option<&Bitmap>, opt_r: Option<&Bitmap>) -> Option<Bitmap> {26match (opt_l, opt_r) {27(Some(l), Some(r)) => Some(l.bitand(r)),28(None, Some(r)) => Some(r.clone()),29(Some(l), None) => Some(l.clone()),30(None, None) => None,31}32}3334pub fn combine_validities_or(opt_l: Option<&Bitmap>, opt_r: Option<&Bitmap>) -> Option<Bitmap> {35match (opt_l, opt_r) {36(Some(l), Some(r)) => Some(l.bitor(r)),37_ => None,38}39}4041pub fn combine_validities_and_not(42opt_l: Option<&Bitmap>,43opt_r: Option<&Bitmap>,44) -> Option<Bitmap> {45match (opt_l, opt_r) {46(Some(l), Some(r)) => Some(and_not(l, r)),47(None, Some(r)) => Some(!r),48(Some(l), None) => Some(l.clone()),49(None, None) => None,50}51}5253pub fn combine_validities_and_many<B: Borrow<Bitmap>>(bitmaps: &[Option<B>]) -> Option<Bitmap> {54let mut bitmaps = bitmaps55.iter()56.flatten()57.map(|b| b.borrow())58.collect::<Vec<_>>();5960match bitmaps.len() {610 => None,621 => bitmaps.pop().cloned(),632 => combine_validities_and(bitmaps.pop(), bitmaps.pop()),643 => combine_validities_and3(bitmaps.pop(), bitmaps.pop(), bitmaps.pop()),65_ => {66let mut iterators = bitmaps67.iter()68.map(|v| v.fast_iter_u64())69.collect::<Vec<_>>();70let mut buffer = Vec::with_capacity(iterators.first().unwrap().size_hint().0 + 2);7172'rows: loop {73// All ones so as identity for & operation74let mut out = u64::MAX;75for iter in iterators.iter_mut() {76if let Some(v) = iter.next() {77out &= v78} else {79break 'rows;80}81}82push_bitchunk(&mut buffer, out);83}8485// All ones so as identity for & operation86let mut out = [u64::MAX, u64::MAX];87let mut len = 0;88for iter in iterators.into_iter() {89let (rem, rem_len) = iter.remainder();90len = rem_len;9192for (out, rem) in out.iter_mut().zip(rem) {93*out &= rem;94}95}96push_bitchunk(&mut buffer, out[0]);97if len > 64 {98push_bitchunk(&mut buffer, out[1]);99}100let bitmap = Bitmap::from_u8_vec(buffer, bitmaps[0].len());101if bitmap.unset_bits() == bitmap.len() {102None103} else {104Some(bitmap)105}106},107}108}109110// Errors iff the two arrays have a different length.111#[inline]112pub fn check_same_len(lhs: &dyn Array, rhs: &dyn Array) -> PolarsResult<()> {113polars_ensure!(lhs.len() == rhs.len(), ComputeError:114"arrays must have the same length"115);116Ok(())117}118119120