#![allow(dead_code)]
use super::RowIterator;
use crate::{errors::ExecutorError, schema::CombinedSchema};
pub struct ProjectionIterator<I, F>
where
I: RowIterator,
F: FnMut(vibesql_storage::Row) -> Result<vibesql_storage::Row, ExecutorError>,
{
source: I,
schema: CombinedSchema,
projection_fn: F,
}
impl<I, F> ProjectionIterator<I, F>
where
I: RowIterator,
F: FnMut(vibesql_storage::Row) -> Result<vibesql_storage::Row, ExecutorError>,
{
pub fn new(source: I, schema: CombinedSchema, projection_fn: F) -> Self {
Self { source, schema, projection_fn }
}
}
impl<I, F> Iterator for ProjectionIterator<I, F>
where
I: RowIterator,
F: FnMut(vibesql_storage::Row) -> Result<vibesql_storage::Row, ExecutorError>,
{
type Item = Result<vibesql_storage::Row, ExecutorError>;
fn next(&mut self) -> Option<Self::Item> {
let row = match self.source.next()? {
Ok(row) => row,
Err(e) => return Some(Err(e)),
};
Some((self.projection_fn)(row))
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.source.size_hint()
}
}
impl<I, F> RowIterator for ProjectionIterator<I, F>
where
I: RowIterator,
F: FnMut(vibesql_storage::Row) -> Result<vibesql_storage::Row, ExecutorError>,
{
fn schema(&self) -> &CombinedSchema {
&self.schema
}
fn row_size_hint(&self) -> (usize, Option<usize>) {
self.source.row_size_hint()
}
}