pub enum PipelineInput<'a> {
Rows(&'a [Row]),
RowsOwned(Vec<Row>),
Batch(ColumnarBatch),
NativeColumnar {
table_name: String,
column_indices: Vec<usize>,
},
Empty,
}Expand description
Polymorphic input for pipeline stages.
Different execution strategies work with different data representations:
- Row-oriented: Works with borrowed or owned row vectors
- Columnar: Works with columnar batches (Arrow-like format)
- Native columnar: Works directly with table storage
This enum allows pipeline stages to accept any of these formats and convert as needed for their specific execution path.
§Example
use vibesql_executor::pipeline::{PipelineInput, PipelineOutput};
// Row-based input (borrowed)
let rows = vec![Row::new(vec![SqlValue::Integer(1)])];
let input = PipelineInput::from_rows(&rows);
// Columnar batch input
let batch = ColumnarBatch::from_rows(&rows)?;
let input = PipelineInput::from_batch(batch);
// Convert to rows when needed
let rows = input.into_rows();Variants§
Rows(&'a [Row])
Borrowed slice of rows (zero-copy for row-oriented)
RowsOwned(Vec<Row>)
Owned vector of rows (when ownership transfer is needed)
Batch(ColumnarBatch)
Columnar batch for SIMD-accelerated execution
This variant enables high-performance columnar operations without row-by-row iteration. Use this for aggregations, filters, and projections that can benefit from SIMD vectorization.
NativeColumnar
Native columnar access (zero-copy from storage) Contains table reference and column indices to project
Fields
Empty
Empty input (for expression-only queries like SELECT 1+1)
Implementations§
Source§impl<'a> PipelineInput<'a>
impl<'a> PipelineInput<'a>
Sourcepub fn from_rows_owned(rows: Vec<Row>) -> Self
pub fn from_rows_owned(rows: Vec<Row>) -> Self
Create input from an owned row vector.
Sourcepub fn from_batch(batch: ColumnarBatch) -> Self
pub fn from_batch(batch: ColumnarBatch) -> Self
Create input from a columnar batch.
This enables SIMD-accelerated execution for pipelines that support it.
Sourcepub fn native_columnar(table_name: String, column_indices: Vec<usize>) -> Self
pub fn native_columnar(table_name: String, column_indices: Vec<usize>) -> Self
Create native columnar input.
Sourcepub fn into_rows(self) -> Vec<Row>
pub fn into_rows(self) -> Vec<Row>
Convert to owned rows, consuming the input.
This is used when the pipeline stage needs ownership of the data. For columnar batches, this performs a materialization to rows.
§Performance
Rows: Clones the slice (O(n))RowsOwned: Zero-copy move (O(1))Batch: Materializes to rows (O(n * m) where m = columns)NativeColumnar: Returns empty (should be handled at storage layer)Empty: Returns single empty row
Sourcepub fn row_count(&self) -> usize
pub fn row_count(&self) -> usize
Get the number of rows in the input.
For native columnar, this may require a table lookup.
Sourcepub fn as_rows(&self) -> Option<&[Row]>
pub fn as_rows(&self) -> Option<&[Row]>
Try to get rows as a slice (only works for row-based inputs).
Returns None for Batch and NativeColumnar variants.
Use into_rows() if you need rows from those variants.
Sourcepub fn as_batch(&self) -> Option<&ColumnarBatch>
pub fn as_batch(&self) -> Option<&ColumnarBatch>
Try to get the columnar batch (only works for Batch variant).
Returns None for row-based and native columnar variants.
Sourcepub fn into_batch(self) -> Option<ColumnarBatch>
pub fn into_batch(self) -> Option<ColumnarBatch>
Consume and return the columnar batch if this is a Batch variant.
Returns None for other variants.
Sourcepub fn is_native_columnar(&self) -> bool
pub fn is_native_columnar(&self) -> bool
Check if this input is native columnar format.
Trait Implementations§
Auto Trait Implementations§
impl<'a> Freeze for PipelineInput<'a>
impl<'a> RefUnwindSafe for PipelineInput<'a>
impl<'a> Send for PipelineInput<'a>
impl<'a> Sync for PipelineInput<'a>
impl<'a> Unpin for PipelineInput<'a>
impl<'a> UnwindSafe for PipelineInput<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more