Skip to main content

vortex_btrblocks/schemes/string/
zstd.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Zstd string compression without dictionaries (nvCOMP compatible).
5
6use vortex_array::ArrayRef;
7use vortex_array::Canonical;
8use vortex_array::ExecutionCtx;
9use vortex_array::IntoArray;
10use vortex_compressor::estimate::CompressionEstimate;
11use vortex_compressor::estimate::DeferredEstimate;
12use vortex_error::VortexResult;
13
14use crate::ArrayAndStats;
15use crate::CascadingCompressor;
16use crate::CompressorContext;
17use crate::Scheme;
18
19/// Zstd compression without dictionaries (nvCOMP compatible).
20#[derive(Debug, Copy, Clone, PartialEq, Eq)]
21pub struct ZstdScheme;
22
23impl Scheme for ZstdScheme {
24    fn scheme_name(&self) -> &'static str {
25        "vortex.string.zstd"
26    }
27
28    fn matches(&self, canonical: &Canonical) -> bool {
29        canonical.dtype().is_utf8()
30    }
31
32    fn expected_compression_ratio(
33        &self,
34        _data: &ArrayAndStats,
35        _compress_ctx: CompressorContext,
36        _exec_ctx: &mut ExecutionCtx,
37    ) -> CompressionEstimate {
38        CompressionEstimate::Deferred(DeferredEstimate::Sample)
39    }
40
41    fn compress(
42        &self,
43        _compressor: &CascadingCompressor,
44        data: &ArrayAndStats,
45        _compress_ctx: CompressorContext,
46        exec_ctx: &mut ExecutionCtx,
47    ) -> VortexResult<ArrayRef> {
48        let compacted = data
49            .array_as_varbinview()
50            .into_owned()
51            .compact_buffers(exec_ctx)?;
52        Ok(
53            vortex_zstd::Zstd::from_var_bin_view_without_dict(&compacted, 3, 8192, exec_ctx)?
54                .into_array(),
55        )
56    }
57}