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