vortex_btrblocks/
temporal.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Specialized compressor for DateTimeParts metadata.
5
6use vortex_array::arrays::TemporalArray;
7use vortex_array::{ArrayRef, IntoArray, ToCanonical};
8use vortex_datetime_parts::{DateTimePartsArray, TemporalParts, split_temporal};
9use vortex_error::VortexResult;
10
11use crate::integer::IntCompressor;
12use crate::{Compressor, MAX_CASCADE};
13
14/// Compress a temporal array into a `DateTimePartsArray`.
15pub fn compress_temporal(array: TemporalArray) -> VortexResult<ArrayRef> {
16    let dtype = array.dtype().clone();
17    let TemporalParts {
18        days,
19        seconds,
20        subseconds,
21    } = split_temporal(array)?;
22
23    let days =
24        IntCompressor::compress(&days.to_primitive().narrow()?, false, MAX_CASCADE - 1, &[])?;
25    let seconds = IntCompressor::compress(
26        &seconds.to_primitive().narrow()?,
27        false,
28        MAX_CASCADE - 1,
29        &[],
30    )?;
31    let subseconds = IntCompressor::compress(
32        &subseconds.to_primitive().narrow()?,
33        false,
34        MAX_CASCADE - 1,
35        &[],
36    )?;
37
38    Ok(DateTimePartsArray::try_new(dtype, days, seconds, subseconds)?.into_array())
39}