use vortex_array::ArrayRef;
use vortex_array::IntoArray;
use vortex_array::arrays::ConstantArray;
use vortex_array::arrays::MaskedArray;
use vortex_array::scalar::Scalar;
use vortex_error::VortexExpect;
use vortex_error::VortexResult;
use super::is_float_primitive;
use super::is_integer_primitive;
use super::is_utf8_string;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct BoolConstantScheme;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct IntConstantScheme;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct FloatConstantScheme;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct StringConstantScheme;
mod bool;
mod float;
mod integer;
mod string;
fn compress_constant_array_with_validity(source: &ArrayRef) -> VortexResult<ArrayRef> {
if source.all_invalid()? {
return Ok(
ConstantArray::new(Scalar::null(source.dtype().clone()), source.len()).into_array(),
);
}
let scalar_idx = (0..source.len())
.position(|idx| source.is_valid(idx).unwrap_or(false))
.vortex_expect("We checked that there exists a scalar that is not invalid");
let scalar = source.scalar_at(scalar_idx)?;
let const_arr = ConstantArray::new(scalar, source.len()).into_array();
if !source.all_valid()? {
Ok(MaskedArray::try_new(const_arr, source.validity()?)?.into_array())
} else {
Ok(const_arr)
}
}