#![expect(clippy::cast_possible_truncation)]
#![doc(html_logo_url = "/vortex/docs/_static/vortex_spiral_logo.svg")]
mod counting;
mod file;
pub mod flatbuffers;
mod footer;
pub mod multi;
mod open;
mod pruning;
mod read;
pub mod segments;
mod strategy;
#[cfg(test)]
mod tests;
pub mod v2;
mod writer;
pub use counting::CountingVortexWrite;
pub use file::*;
pub use footer::*;
pub use forever_constant::*;
pub use open::*;
pub use strategy::*;
use vortex_array::arrays::Patched;
use vortex_array::arrays::patched::use_experimental_patches;
use vortex_array::session::ArraySessionExt;
use vortex_pco::Pco;
use vortex_session::VortexSession;
pub use writer::*;
pub const VERSION: u16 = 1;
pub const V1_FOOTER_FBS_SIZE: usize = 32;
mod forever_constant {
pub const VORTEX_FILE_EXTENSION: &str = "vortex";
pub const MAX_POSTSCRIPT_SIZE: u16 = u16::MAX - 8;
pub const MAGIC_BYTES: [u8; 4] = *b"VTXF";
pub const EOF_SIZE: usize = 8;
#[cfg(test)]
mod test {
use crate::*;
#[test]
fn never_change_these_constants() {
assert_eq!(V1_FOOTER_FBS_SIZE, 32);
assert_eq!(MAX_POSTSCRIPT_SIZE, 65527);
assert_eq!(MAGIC_BYTES, *b"VTXF");
assert_eq!(EOF_SIZE, 8);
}
}
}
pub fn register_default_encodings(session: &VortexSession) {
vortex_bytebool::initialize(session);
vortex_fsst::initialize(session);
vortex_onpair::initialize(session);
vortex_zigzag::initialize(session);
#[cfg(feature = "zstd")]
vortex_zstd::initialize(session);
{
let arrays = session.arrays();
arrays.register(Pco);
if use_experimental_patches() {
arrays.register(Patched);
}
}
vortex_alp::initialize(session);
vortex_datetime_parts::initialize(session);
vortex_decimal_byte_parts::initialize(session);
vortex_fastlanes::initialize(session);
vortex_runend::initialize(session);
vortex_sequence::initialize(session);
vortex_sparse::initialize(session);
#[cfg(feature = "tensor")]
vortex_tensor::initialize(session);
}
#[cfg(test)]
pub(crate) fn enable_all_registered_array_encodings(session: &VortexSession) {
use vortex_array::dtype::session::DTypeSessionExt;
use vortex_edition::ComponentKind;
use vortex_edition::Edition;
use vortex_edition::EditionId;
use vortex_edition::EditionInclusion;
use vortex_edition::EditionSessionExt;
use vortex_error::VortexExpect;
use vortex_error::vortex_err;
use vortex_layout::session::LayoutSessionExt;
const TEST_EDITION: EditionId = EditionId::new("test", 2026, 7, 0);
let editions = session.editions();
editions
.declare_edition(Edition {
id: TEST_EDITION,
min_library_version: None,
})
.map_err(|error| vortex_err!("{error}"))
.vortex_expect("test edition is valid");
let component_ids = [
(
ComponentKind::Array,
session
.arrays()
.registry()
.read(|map| map.keys().copied().collect::<Vec<_>>()),
),
(
ComponentKind::Layout,
session
.layouts()
.registry()
.read(|map| map.keys().copied().collect::<Vec<_>>()),
),
(
ComponentKind::DType,
session
.dtypes()
.registry()
.read(|map| map.keys().copied().collect::<Vec<_>>()),
),
];
for (kind, ids) in component_ids {
for id in ids {
editions
.declare_inclusion(EditionInclusion::new(kind, &id, TEST_EDITION))
.map_err(|error| vortex_err!("{error}"))
.vortex_expect("registered component has one test-edition inclusion");
}
}
for id in [
"vortex.bounded_max",
"vortex.bounded_min",
"vortex.max",
"vortex.min",
"vortex.nan_count",
"vortex.null_count",
] {
editions
.declare_inclusion(EditionInclusion::new(
ComponentKind::Aggregate,
id,
TEST_EDITION,
))
.map_err(|error| vortex_err!("{error}"))
.vortex_expect("default aggregate has one test-edition inclusion");
}
session
.enable_edition(TEST_EDITION)
.map_err(|error| vortex_err!("{error}"))
.vortex_expect("test edition is registered");
}
#[cfg(test)]
mod default_encoding_tests {
use vortex_array::VTable as _;
use vortex_array::array_session;
use vortex_array::arrays::Filter;
use vortex_array::optimizer::kernels::ArrayKernelsExt as _;
use vortex_array::session::ArraySessionExt as _;
use vortex_fsst::FSST;
use vortex_onpair::OnPair;
use crate::register_default_encodings;
#[test]
fn register_default_encodings_registers_external_execute_parent_kernels() {
let session = array_session();
assert!(!session.arrays().registry().contains_key(&FSST.id()));
assert!(!session.kernels().has_execute_parent(Filter.id(), FSST.id()));
register_default_encodings(&session);
assert!(session.arrays().registry().contains_key(&FSST.id()));
assert!(session.kernels().has_execute_parent(Filter.id(), FSST.id()));
assert!(session.arrays().registry().contains_key(&OnPair.id()));
assert!(
session
.kernels()
.has_execute_parent(Filter.id(), OnPair.id())
);
}
}