Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
8e49f35
feat(layout): add the ExecNode trait and push-based exec graph
joseph-isaacs Oct 8, 2026
6abc26e
feat(layout): replace the exec graph with push-based pipelines
claude Oct 9, 2026
94d7196
refactor(layout): drop mid-run compilation from the pipeline runtime
claude Oct 9, 2026
82fd9e5
perf(layout): bound and preallocate pipeline ports, wake only the inl…
claude Oct 9, 2026
06f2233
feat(layout): let a pipeline source have several reads in flight
claude Oct 9, 2026
b646fdb
docs(layout): describe the scan's stages as this stage builds them
claude Oct 12, 2026
cd99062
Merge develop into ji/exec-2-exec-node
claude Oct 12, 2026
339f74f
refactor(layout): source/sink ports, read cancellation, debug validation
claude Oct 12, 2026
9fdb396
fix(layout): compile what only debug validation uses in debug builds …
claude Oct 12, 2026
b80abc4
refactor(layout): name a pipeline's stages Operator, computed over an…
claude Oct 12, 2026
9343ec8
refactor(layout): a source is one ready(), asking for reads in its Step
claude Oct 12, 2026
b126427
refactor(layout): separate source readiness and drain operator contin…
joseph-isaacs Oct 12, 2026
0e6559a
style(layout): cargo fmt the pipeline
claude Oct 12, 2026
128482d
refactor(layout): organize physical plans and execution modules
joseph-isaacs Oct 12, 2026
a9686a3
Merge remote-tracking branch 'origin/develop' into ji/exec-2-exec-node
joseph-isaacs Oct 12, 2026
b966c27
refactor(layout): use blocked IO for queued and outstanding reads
joseph-isaacs Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions vortex-layout/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ pin-project-lite = { workspace = true }
prost = { workspace = true }
rustc-hash = { workspace = true }
sketches-ddsketch = { workspace = true }
smallvec = { workspace = true }
termtree = { workspace = true }
tokio = { workspace = true, features = ["rt"], optional = true }
tracing = { workspace = true }
Expand Down
72 changes: 2 additions & 70 deletions vortex-layout/src/plan/mod.rs
Original file line number Diff line number Diff line change
@@ -1,74 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright the Vortex contributors

//! Physical plans for scans.
//!
//! A plan is a tree of physical operators over a row domain. Operator identity and
//! operator-specific state do not depend on the source layout kind, so rewrites can reason about a
//! plan's shape alone. The common child container can initialize individual slots lazily.
//! Scan planning.

mod children;
mod display;
mod lower;
mod optimize;
pub mod optimizer;
mod plans;
mod typed;
mod vtable;

pub use children::PlanChildren;
pub use display::PlanIndentedFormatter;
pub use display::PlanSummaryExtractor;
pub use display::PlanTreeContext;
pub use display::PlanTreeDisplay;
pub use display::PlanTreeExtractor;
pub use lower::lower;
pub use optimize::optimize;
pub use plans::Concat;
pub use plans::ConcatData;
pub use plans::ConcatPlan;
pub use plans::Eval;
pub use plans::EvalData;
pub use plans::EvalPlan;
pub use plans::ListPack;
pub use plans::ListPackData;
pub use plans::ListPackPlan;
pub use plans::Pack;
pub use plans::PackData;
pub use plans::PackPlan;
pub use plans::RowIdx;
pub use plans::RowIdxData;
pub use plans::RowIdxPlan;
pub use plans::SegmentScan;
pub use plans::SegmentScanData;
pub use plans::SegmentScanPlan;
pub use plans::Take;
pub use plans::TakePlan;
pub use plans::plan_row_idx_expression;
pub use plans::row_idx_dtype;
pub use typed::DynPlan;
pub use typed::Plan;
pub use typed::PlanParts;
pub use typed::PlanRef;
use vortex_error::VortexResult;
use vortex_error::vortex_bail;
pub use vtable::PlanId;
pub use vtable::PlanVTable;

/// Returns an error when `children` does not have exactly `expected` entries.
pub(crate) fn check_child_count(
name: &str,
children: &PlanChildren,
expected: usize,
) -> VortexResult<()> {
if children.len() != expected {
vortex_bail!(
"{name} expects {expected} children but got {}",
children.len()
);
}
Ok(())
}

#[cfg(test)]
mod tests;
pub mod physical;
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use once_cell::sync::OnceCell;
use vortex_error::VortexResult;
use vortex_error::vortex_err;

use crate::plan::PlanRef;
use crate::plan::physical::PlanRef;

type ChildInitializer = dyn Fn(usize) -> VortexResult<PlanRef> + 'static + Send + Sync;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ use crate::layouts::list::OFFSETS_CHILD_INDEX;
use crate::layouts::list::VALIDITY_CHILD_INDEX;
use crate::layouts::struct_::Struct;
use crate::layouts::struct_::StructLayout;
use crate::plan::ConcatPlan;
use crate::plan::ListPackPlan;
use crate::plan::PackPlan;
use crate::plan::PlanChildren;
use crate::plan::PlanRef;
use crate::plan::SegmentScanPlan;
use crate::plan::TakePlan;
use crate::plan::physical::ConcatPlan;
use crate::plan::physical::ListPackPlan;
use crate::plan::physical::PackPlan;
use crate::plan::physical::PlanChildren;
use crate::plan::physical::PlanRef;
use crate::plan::physical::SegmentScanPlan;
use crate::plan::physical::TakePlan;

/// Constructs a physical-plan fixture from `layout` for tests.
///
Expand Down
80 changes: 80 additions & 0 deletions vortex-layout/src/plan/physical/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright the Vortex contributors

//! Physical plans for scans.
//!
//! A plan is a tree of physical operators over a row domain. Operator identity and
//! operator-specific state do not depend on the source layout kind, so rewrites can reason about a
//! plan's shape alone. The common child container can initialize individual slots lazily.
//!
//! [`operator`] defines the execution contracts, `operators` implements the concrete sources
//! and stages, and [`pipeline`] compiles and runs them.

mod children;
mod display;
mod lower;
pub mod operator;
pub(crate) mod operators;
mod optimize;
pub mod optimizer;
pub mod pipeline;
mod plans;
mod typed;
mod vtable;

pub use children::PlanChildren;
pub use display::PlanIndentedFormatter;
pub use display::PlanSummaryExtractor;
pub use display::PlanTreeContext;
pub use display::PlanTreeDisplay;
pub use display::PlanTreeExtractor;
pub use lower::lower;
pub use optimize::optimize;
pub use plans::Concat;
pub use plans::ConcatData;
pub use plans::ConcatPlan;
pub use plans::Eval;
pub use plans::EvalData;
pub use plans::EvalPlan;
pub use plans::ListPack;
pub use plans::ListPackData;
pub use plans::ListPackPlan;
pub use plans::Pack;
pub use plans::PackData;
pub use plans::PackPlan;
pub use plans::RowIdx;
pub use plans::RowIdxData;
pub use plans::RowIdxPlan;
pub use plans::SegmentScan;
pub use plans::SegmentScanData;
pub use plans::SegmentScanPlan;
pub use plans::Take;
pub use plans::TakePlan;
pub use plans::plan_row_idx_expression;
pub use plans::row_idx_dtype;
pub use typed::DynPlan;
pub use typed::Plan;
pub use typed::PlanParts;
pub use typed::PlanRef;
use vortex_error::VortexResult;
use vortex_error::vortex_bail;
pub use vtable::PlanId;
pub use vtable::PlanVTable;

/// Returns an error when `children` does not have exactly `expected` entries.
pub(crate) fn check_child_count(
name: &str,
children: &PlanChildren,
expected: usize,
) -> VortexResult<()> {
if children.len() != expected {
vortex_bail!(
"{name} expects {expected} children but got {}",
children.len()
);
}
Ok(())
}

#[cfg(test)]
mod tests;
Loading
Loading