From 5db5650b6de4a8d861fce67e798d7a86fc63261f Mon Sep 17 00:00:00 2001 From: Luke Kim <80174+lukekim@users.noreply.github.com> Date: Thu, 24 Sep 2026 15:09:36 -0700 Subject: [PATCH] fix: address Copilot review on Union min_max, bench docs, GooseFS, FFI docs - Return VortexResult unsupported-type error for Union min_max (no todo!/panic) - Document 2.5B-row three-column vortex SQL bench + range query - Expose GoosefsStore on vortex.file.open / _lib/file.pyi like CosStore - Restore vx_session_clone ownership/lifecycle note for generated C API docs --- vortex-array/src/aggregate_fn/fns/min_max/mod.rs | 6 ++---- vortex-bench/sql/vortex/README.md | 6 ++++-- vortex-ffi/src/session.rs | 4 +++- vortex-python/python/vortex/_lib/file.pyi | 4 ++-- vortex-python/python/vortex/file.py | 3 ++- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/vortex-array/src/aggregate_fn/fns/min_max/mod.rs b/vortex-array/src/aggregate_fn/fns/min_max/mod.rs index 90b5c1040b1..1c23e89221d 100644 --- a/vortex-array/src/aggregate_fn/fns/min_max/mod.rs +++ b/vortex-array/src/aggregate_fn/fns/min_max/mod.rs @@ -417,10 +417,8 @@ impl AggregateFnVTable for MinMax { Canonical::Decimal(d) => accumulate_decimal(partial, d, ctx), Canonical::Extension(e) => accumulate_extension(partial, e, ctx), Canonical::Null(_) => Ok(()), - Canonical::Union(_) => { - todo!("TODO(connor)[Union]: implement min_max for Union arrays") - } - Canonical::Struct(_) + Canonical::Union(_) + | Canonical::Struct(_) | Canonical::List(_) | Canonical::Map(_) | Canonical::FixedSizeList(_) diff --git a/vortex-bench/sql/vortex/README.md b/vortex-bench/sql/vortex/README.md index 793f7fb0f67..e215394534d 100644 --- a/vortex-bench/sql/vortex/README.md +++ b/vortex-bench/sql/vortex/README.md @@ -4,14 +4,16 @@ A small suite of microbenchmark queries targeting Vortex-specific scan paths, ru **every PR commit** (unlike the label-gated suites) with a high iteration count, so it is the most sensitive — and most frequently seen — benchmark comment. -[`init.sql`](./init.sql) generates a 25M-row two-column table; the numbered queries each -pin down one scan behavior: +[`init.sql`](./init.sql) generates a 2.5B-row three-column table (`id`, `col`, `col2`); the +numbered queries each pin down one scan behavior: - [`0_sum-with-filter.sql`](./0_sum-with-filter.sql): a filtered aggregation that forces a linear scan today; once statistics are propagated to arrays it should use zone maps instead of decoding every row. - [`1_sum.sql`](./1_sum.sql): an unfiltered aggregation that should eventually be answered from footer statistics without decoding data. +- [`2_sum-range.sql`](./2_sum-range.sql): a range filter on `id` that should prune most + zone maps and only fully decode the two zones that overlap the bounds. ## CI variant diff --git a/vortex-ffi/src/session.rs b/vortex-ffi/src/session.rs index f0679a7c4c9..2af3d997444 100644 --- a/vortex-ffi/src/session.rs +++ b/vortex-ffi/src/session.rs @@ -34,7 +34,9 @@ pub unsafe extern "C-unwind" fn vx_session_new() -> *mut vx_session { vx_session_new_with(|session| session) } -/// Clone a vx_session +/// Clone a Vortex session, returning an owned copy. +/// +/// The caller is responsible for freeing the session with [`vx_session_free`]. #[unsafe(no_mangle)] pub unsafe extern "C-unwind" fn vx_session_clone(session: *const vx_session) -> *mut vx_session { let session = vx_session::as_ref(session); diff --git a/vortex-python/python/vortex/_lib/file.pyi b/vortex-python/python/vortex/_lib/file.pyi index 901e0323eec..5e499b85efc 100644 --- a/vortex-python/python/vortex/_lib/file.pyi +++ b/vortex-python/python/vortex/_lib/file.pyi @@ -9,7 +9,7 @@ from typing_extensions import override from vortex.type_aliases import IntoProjection -from . import CosStore, HfStore +from . import CosStore, GoosefsStore, HfStore from .arrays import Array from .dataset import VortexDataset from .dtype import DType @@ -61,6 +61,6 @@ class VortexFile: def open( path: str, *, - store: ObjectStore | CosStore | HfStore | None = None, + store: ObjectStore | CosStore | GoosefsStore | HfStore | None = None, without_segment_cache: bool = False, ) -> VortexFile: ... diff --git a/vortex-python/python/vortex/file.py b/vortex-python/python/vortex/file.py index a78a59ead1c..5fcd8b713ae 100644 --- a/vortex-python/python/vortex/file.py +++ b/vortex-python/python/vortex/file.py @@ -19,6 +19,7 @@ AzureStore, CosStore, GCSStore, + GoosefsStore, HfStore, HTTPStore, LocalStore, @@ -34,7 +35,7 @@ def open( path: str, *, - store: AzureStore | CosStore | GCSStore | HfStore | HTTPStore | LocalStore | MemoryStore | S3Store | None = None, + store: AzureStore | CosStore | GCSStore | GoosefsStore | HfStore | HTTPStore | LocalStore | MemoryStore | S3Store | None = None, without_segment_cache: bool = False, ) -> VortexFile: """