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 = IntCompressor::compress(
24        &days.to_primitive()?.downcast()?,
25        false,
26        MAX_CASCADE - 1,
27        &[],
28    )?;
29    let seconds = IntCompressor::compress(
30        &seconds.to_primitive()?.downcast()?,
31        false,
32        MAX_CASCADE - 1,
33        &[],
34    )?;
35    let subseconds = IntCompressor::compress(
36        &subseconds.to_primitive()?.downcast()?,
37        false,
38        MAX_CASCADE - 1,
39        &[],
40    )?;
41
42    Ok(DateTimePartsArray::try_new(dtype, days, seconds, subseconds)?.into_array())
43}