Path: blob/main/crates/polars-mem-engine/src/scan_predicate/skip_files_mask.rs
7884 views
use arrow::bitmap::Bitmap;12#[derive(Debug, Clone)]3pub enum SkipFilesMask {4Exclusion(Bitmap),5Inclusion(Bitmap),6}78impl SkipFilesMask {9pub fn is_empty(&self) -> bool {10match self {11Self::Exclusion(mask) => mask.is_empty(),12Self::Inclusion(mask) => mask.is_empty(),13}14}1516pub fn len(&self) -> usize {17match self {18Self::Exclusion(mask) => mask.len(),19Self::Inclusion(mask) => mask.len(),20}21}2223pub fn is_skipped_file(&self, index: usize) -> bool {24match self {25Self::Exclusion(mask) => mask.get_bit(index),26Self::Inclusion(mask) => !mask.get_bit(index),27}28}2930pub fn num_skipped_files(&self) -> usize {31match self {32Self::Exclusion(mask) => mask.set_bits(),33Self::Inclusion(mask) => mask.unset_bits(),34}35}3637pub fn leading_skipped_files(&self) -> usize {38match self {39Self::Exclusion(mask) => mask.leading_ones(),40Self::Inclusion(mask) => mask.leading_zeros(),41}42}4344pub fn trailing_skipped_files(&self) -> usize {45match self {46Self::Exclusion(mask) => mask.trailing_ones(),47Self::Inclusion(mask) => mask.trailing_zeros(),48}49}5051pub fn sliced(self, offset: usize, len: usize) -> Self {52match self {53Self::Exclusion(mask) => Self::Exclusion(mask.sliced(offset, len)),54Self::Inclusion(mask) => Self::Inclusion(mask.sliced(offset, len)),55}56}5758pub fn non_skipped_files_idx_iter(&self) -> impl Iterator<Item = usize> + Clone {59let range_end = self.len() - self.trailing_skipped_files();60let range_start = if range_end == 0 {61062} else {63self.leading_skipped_files()64};6566(range_start..range_end).filter(|i| !self.is_skipped_file(*i))67}68}697071