Path: blob/main/crates/polars-arrow/src/array/static_array.rs
6939 views
use bytemuck::Zeroable;1use polars_utils::no_call_const;23use crate::array::binview::BinaryViewValueIter;4use crate::array::builder::{ShareStrategy, StaticArrayBuilder, make_builder};5use crate::array::fixed_size_list::FixedSizeListArrayBuilder;6use crate::array::static_array_collect::ArrayFromIterDtype;7use crate::array::{8Array, ArrayValuesIter, BinaryArray, BinaryValueIter, BinaryViewArray, BooleanArray,9FixedSizeListArray, ListArray, ListValuesIter, MutableBinaryViewArray, PrimitiveArray,10StructArray, Utf8Array, Utf8ValuesIter, Utf8ViewArray,11};12use crate::bitmap::Bitmap;13use crate::bitmap::utils::{BitmapIter, ZipValidity};14use crate::datatypes::ArrowDataType;15use crate::trusted_len::TrustedLen;16use crate::types::NativeType;1718pub trait StaticArray:19Array20+ for<'a> ArrayFromIterDtype<Self::ValueT<'a>>21+ for<'a> ArrayFromIterDtype<Self::ZeroableValueT<'a>>22+ for<'a> ArrayFromIterDtype<Option<Self::ValueT<'a>>>23+ Clone24{25type ValueT<'a>: Clone26where27Self: 'a;28type ZeroableValueT<'a>: Zeroable + From<Self::ValueT<'a>>29where30Self: 'a;31type ValueIterT<'a>: DoubleEndedIterator<Item = Self::ValueT<'a>> + TrustedLen + Send + Sync32where33Self: 'a;3435#[inline]36fn get(&self, idx: usize) -> Option<Self::ValueT<'_>> {37if idx >= self.len() {38None39} else {40unsafe { self.get_unchecked(idx) }41}42}4344/// # Safety45/// It is the callers responsibility that the `idx < self.len()`.46#[inline]47unsafe fn get_unchecked(&self, idx: usize) -> Option<Self::ValueT<'_>> {48if self.is_null_unchecked(idx) {49None50} else {51Some(self.value_unchecked(idx))52}53}5455#[inline]56fn last(&self) -> Option<Self::ValueT<'_>> {57unsafe { self.get_unchecked(self.len().checked_sub(1)?) }58}5960#[inline]61fn value(&self, idx: usize) -> Self::ValueT<'_> {62assert!(idx < self.len());63unsafe { self.value_unchecked(idx) }64}6566/// # Safety67/// It is the callers responsibility that the `idx < self.len()`.68#[allow(unused_variables)]69unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {70no_call_const!()71}7273#[inline(always)]74fn as_slice(&self) -> Option<&[Self::ValueT<'_>]> {75None76}7778fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {79no_call_const!()80}81fn values_iter(&self) -> Self::ValueIterT<'_> {82no_call_const!()83}84fn with_validity_typed(self, validity: Option<Bitmap>) -> Self;8586fn from_vec(v: Vec<Self::ValueT<'_>>, dtype: ArrowDataType) -> Self {87Self::arr_from_iter_with_dtype(dtype, v)88}8990fn from_zeroable_vec(v: Vec<Self::ZeroableValueT<'_>>, dtype: ArrowDataType) -> Self {91Self::arr_from_iter_with_dtype(dtype, v)92}9394fn full_null(length: usize, dtype: ArrowDataType) -> Self;9596fn full(length: usize, value: Self::ValueT<'_>, dtype: ArrowDataType) -> Self {97Self::arr_from_iter_with_dtype(dtype, std::iter::repeat_n(value, length))98}99}100101pub trait ParameterFreeDtypeStaticArray: StaticArray {102fn get_dtype() -> ArrowDataType;103}104105impl<T: NativeType> StaticArray for PrimitiveArray<T> {106type ValueT<'a> = T;107type ZeroableValueT<'a> = T;108type ValueIterT<'a> = std::iter::Copied<std::slice::Iter<'a, T>>;109110#[inline]111unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {112self.value_unchecked(idx)113}114115fn values_iter(&self) -> Self::ValueIterT<'_> {116self.values_iter().copied()117}118119#[inline(always)]120fn as_slice(&self) -> Option<&[Self::ValueT<'_>]> {121Some(self.values().as_slice())122}123124fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {125ZipValidity::new_with_validity(self.values().iter().copied(), self.validity())126}127128fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {129self.with_validity(validity)130}131132fn from_vec(v: Vec<Self::ValueT<'_>>, _dtype: ArrowDataType) -> Self {133PrimitiveArray::from_vec(v)134}135136fn from_zeroable_vec(v: Vec<Self::ZeroableValueT<'_>>, _dtype: ArrowDataType) -> Self {137PrimitiveArray::from_vec(v)138}139140fn full_null(length: usize, dtype: ArrowDataType) -> Self {141Self::new_null(dtype, length)142}143144fn full(length: usize, value: Self::ValueT<'_>, _dtype: ArrowDataType) -> Self {145PrimitiveArray::from_vec(vec![value; length])146}147}148149impl<T: NativeType> ParameterFreeDtypeStaticArray for PrimitiveArray<T> {150fn get_dtype() -> ArrowDataType {151T::PRIMITIVE.into()152}153}154155impl StaticArray for BooleanArray {156type ValueT<'a> = bool;157type ZeroableValueT<'a> = bool;158type ValueIterT<'a> = BitmapIter<'a>;159160#[inline]161unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {162self.value_unchecked(idx)163}164165fn values_iter(&self) -> Self::ValueIterT<'_> {166self.values_iter()167}168169fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {170self.iter()171}172173fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {174self.with_validity(validity)175}176177fn from_vec(v: Vec<Self::ValueT<'_>>, _dtype: ArrowDataType) -> Self {178BooleanArray::from_slice(v)179}180181fn from_zeroable_vec(v: Vec<Self::ValueT<'_>>, _dtype: ArrowDataType) -> Self {182BooleanArray::from_slice(v)183}184185fn full_null(length: usize, dtype: ArrowDataType) -> Self {186Self::new_null(dtype, length)187}188189fn full(length: usize, value: Self::ValueT<'_>, _dtype: ArrowDataType) -> Self {190Bitmap::new_with_value(value, length).into()191}192}193194impl ParameterFreeDtypeStaticArray for BooleanArray {195fn get_dtype() -> ArrowDataType {196ArrowDataType::Boolean197}198}199200impl StaticArray for Utf8Array<i64> {201type ValueT<'a> = &'a str;202type ZeroableValueT<'a> = Option<&'a str>;203type ValueIterT<'a> = Utf8ValuesIter<'a, i64>;204205#[inline]206unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {207self.value_unchecked(idx)208}209210fn values_iter(&self) -> Self::ValueIterT<'_> {211self.values_iter()212}213214fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {215self.iter()216}217218fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {219self.with_validity(validity)220}221222fn full_null(length: usize, dtype: ArrowDataType) -> Self {223Self::new_null(dtype, length)224}225}226227impl ParameterFreeDtypeStaticArray for Utf8Array<i64> {228fn get_dtype() -> ArrowDataType {229ArrowDataType::LargeUtf8230}231}232233impl StaticArray for BinaryArray<i64> {234type ValueT<'a> = &'a [u8];235type ZeroableValueT<'a> = Option<&'a [u8]>;236type ValueIterT<'a> = BinaryValueIter<'a, i64>;237238#[inline]239unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {240self.value_unchecked(idx)241}242243fn values_iter(&self) -> Self::ValueIterT<'_> {244self.values_iter()245}246247fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {248self.iter()249}250251fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {252self.with_validity(validity)253}254255fn full_null(length: usize, dtype: ArrowDataType) -> Self {256Self::new_null(dtype, length)257}258}259260impl ParameterFreeDtypeStaticArray for BinaryArray<i64> {261fn get_dtype() -> ArrowDataType {262ArrowDataType::LargeBinary263}264}265266impl StaticArray for BinaryViewArray {267type ValueT<'a> = &'a [u8];268type ZeroableValueT<'a> = Option<&'a [u8]>;269type ValueIterT<'a> = BinaryViewValueIter<'a, [u8]>;270271unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {272self.value_unchecked(idx)273}274275fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {276self.iter()277}278279fn values_iter(&self) -> Self::ValueIterT<'_> {280self.values_iter()281}282283fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {284self.with_validity(validity)285}286287fn full_null(length: usize, dtype: ArrowDataType) -> Self {288Self::new_null(dtype, length)289}290291fn full(length: usize, value: Self::ValueT<'_>, _dtype: ArrowDataType) -> Self {292let mut builder = MutableBinaryViewArray::with_capacity(length);293builder.extend_constant(length, Some(value));294builder.into()295}296}297298impl ParameterFreeDtypeStaticArray for BinaryViewArray {299fn get_dtype() -> ArrowDataType {300ArrowDataType::BinaryView301}302}303304impl StaticArray for Utf8ViewArray {305type ValueT<'a> = &'a str;306type ZeroableValueT<'a> = Option<&'a str>;307type ValueIterT<'a> = BinaryViewValueIter<'a, str>;308309unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {310self.value_unchecked(idx)311}312313fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {314self.iter()315}316317fn values_iter(&self) -> Self::ValueIterT<'_> {318self.values_iter()319}320321fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {322self.with_validity(validity)323}324325fn full_null(length: usize, dtype: ArrowDataType) -> Self {326Self::new_null(dtype, length)327}328329fn full(length: usize, value: Self::ValueT<'_>, _dtype: ArrowDataType) -> Self {330unsafe {331BinaryViewArray::full(length, value.as_bytes(), ArrowDataType::BinaryView)332.to_utf8view_unchecked()333}334}335}336337impl ParameterFreeDtypeStaticArray for Utf8ViewArray {338fn get_dtype() -> ArrowDataType {339ArrowDataType::Utf8View340}341}342343impl StaticArray for ListArray<i64> {344type ValueT<'a> = Box<dyn Array>;345type ZeroableValueT<'a> = Option<Box<dyn Array>>;346type ValueIterT<'a> = ListValuesIter<'a, i64>;347348#[inline]349unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {350self.value_unchecked(idx)351}352353fn values_iter(&self) -> Self::ValueIterT<'_> {354self.values_iter()355}356357fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {358self.iter()359}360361fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {362self.with_validity(validity)363}364365fn full_null(length: usize, dtype: ArrowDataType) -> Self {366Self::new_null(dtype, length)367}368}369370impl StaticArray for FixedSizeListArray {371type ValueT<'a> = Box<dyn Array>;372type ZeroableValueT<'a> = Option<Box<dyn Array>>;373type ValueIterT<'a> = ArrayValuesIter<'a, FixedSizeListArray>;374375#[inline]376unsafe fn value_unchecked(&self, idx: usize) -> Self::ValueT<'_> {377self.value_unchecked(idx)378}379380fn values_iter(&self) -> Self::ValueIterT<'_> {381self.values_iter()382}383384fn iter(&self) -> ZipValidity<Self::ValueT<'_>, Self::ValueIterT<'_>, BitmapIter<'_>> {385self.iter()386}387388fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {389self.with_validity(validity)390}391392fn full_null(length: usize, dtype: ArrowDataType) -> Self {393Self::new_null(dtype, length)394}395396fn full(length: usize, value: Self::ValueT<'_>, dtype: ArrowDataType) -> Self {397let singular_arr = FixedSizeListArray::new(dtype.clone(), 1, value, None);398let inner_dt = dtype.inner_dtype().unwrap();399let mut builder = FixedSizeListArrayBuilder::new(dtype.clone(), make_builder(inner_dt));400builder.subslice_extend_repeated(&singular_arr, 0, 1, length, ShareStrategy::Always);401builder.freeze()402}403}404405impl StaticArray for StructArray {406type ValueT<'a> = ();407type ZeroableValueT<'a> = ();408type ValueIterT<'a> = std::iter::Repeat<()>;409410fn with_validity_typed(self, validity: Option<Bitmap>) -> Self {411self.with_validity(validity)412}413414fn full_null(length: usize, dtype: ArrowDataType) -> Self {415Self::new_null(dtype, length)416}417}418419420