feat[edition]: session-registered editions defitions - #8871
Conversation
Polar Signals Profiling ResultsLatest Run
Previous Runs (11)
Powered by Polar Signals Cloud |
Benchmarks: Vortex queries 📖Verdict: Likely regression (medium confidence) How to read Verdict and Engines
datafusion / vortex-file-compressed (1.332x ❌, 0↑ 2↓)
datafusion / parquet (1.102x ❌, 0↑ 1↓)
duckdb / vortex-file-compressed (1.131x ❌, 0↑ 2↓)
duckdb / parquet (1.079x ➖, 0↑ 1↓)
No file size changes detected. |
Merging this PR will not alter performance
Comparing Footnotes
|
b653c99 to
bb67435
Compare
89bcb4a to
528cd3f
Compare
a07aa2e to
a4f07a8
Compare
…tex facade vortex-edition provides the editions machinery: the types (EditionId, Edition, EditionInclusion, EditionDeclaration), the EditionSession session variable holding the per-session registry (starts empty; clones share the registry like other session registries), computation (editions(), encodings_in() with membership inherited by later editions of the family, current()), validation (identifier/version forms via EditionId::validate and EditionInclusion::validate, plus whole-registry checks: undeclared references, drafts-newest chronology, members requiring a release newer than their edition declares), and the validate!(session, EDITION) macro generating a per-edition unit test. Encoding ids use the session's intern pool (registry::Id, the same identifier space as ArrayId), and declaration blocks name encodings via the AsEncodingId trait — an id string today, an encoding vtable once vortex-array implements it. The actual declarations live in the public vortex crate (vortex::editions): two core editions declared block-wise with the encodings each adds — core2026.01.0 with the 12 canonical encodings and core2026.07.0 inheriting them plus the 20 container/compressed encodings the default writer emits. Both are drafts until their min_vortex_version is recorded, which is the act of freezing. register_default_editions seeds them into the default session, golden tests pin both sets, and transitivity/consistency tests cover inheritance and the one-inclusion-per-encoding invariant. Signed-off-by: Claude <noreply@anthropic.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KdR42Svu74NcNzC7XJYwLr
a4f07a8 to
07e5746
Compare
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
robert3005
left a comment
There was a problem hiding this comment.
only had one question
| fn encoding_id(&self) -> Id; | ||
| } | ||
|
|
||
| impl AsEncodingId for str { |
There was a problem hiding this comment.
Do we use this impl anywhere?
There was a problem hiding this comment.
I think that is used for each definition since they are defined by strs
Adds a frozen, additive editions catalog mirroring the ground-truth data from vortex-data/vortex#8871 (the published spec's own registry section says "Coming soon", so the catalog was built directly from the upstream Rust source), a writer-side edition guard, and reader unknown-encoding UX naming which edition an id belongs to. core.model: - EditionId, Edition, EditionFamily (a closed CORE/UNSTABLE enum, not a sealed-interface-plus-Custom like EncodingId/LayoutId: a private edition family carries no real cross-implementation guarantee, so there's no legitimate custom-family use case) - Editions catalog: the 8 frozen/draft editions, cumulativeMembers(), owningEdition() writer: - WriteOptions gains an editions field, defaulting to the latest frozen core edition (core2026.07.0) - verified safe: the default cascade candidate list never includes the two unstable-family encoders vortex-java implements (Delta, Patched) - withEdition(Edition) / withoutEditionGuard() (the escape hatch) - VortexWriter's guard has two layers: it seeds the out-of-edition encoding ids into EncodeContext's existing exclusion set so CascadingCompressor gracefully steers away from them during cost-based selection (including nested competitions like a masked column's validity-bitmap cascade - reachable via ordinary cascading(depth) writes, not just an explicit custom encoder list), plus an after-the-fact backstop check for paths that don't consult the exclusion set at all reader: - ReadRegistry's unknown-encoding VortexException now names the edition an id belongs to and its minimum Vortex version (or that it's an unstable draft with no guarantee), or says it's unknown to every edition and points at allowUnknown() No wire-format changes - editions are a write-time/read-time policy, never persisted into the file (ADR 0023, which also records the mid-implementation course correction from a simple after-the-fact check to the two-layer filter+backstop design, and why EditionFamily ended up closed rather than mirroring EncodingId's Custom pattern). Mechanical fallout: WriteOptions' 8th record component required updating 29 direct-constructor call sites (Map.of(), preserving today's no-guard behavior) plus 3 existing test files that deliberately write unstable-family encoders through the explicit encoder-list overload (added .withoutEditionGuard()). Verified: full reactor build, full unit suite, full integration suite (including the real-world file-size comparison tests that exercise cascading writes extensively), core module javadoc build. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rationale for this change
Any encoding that vortex will write using built-in layout strategies or compressors will come from an edition.
What changes are included in this PR?
vortex-editionscrate and session variable.