use super::super::result::ResultRow;
use super::super::result::ResultSet;
pub mod aggregate;
pub mod heap_top_k;
pub mod optional_match;
pub mod pattern_source;
pub mod pipeline;
pub struct RowStream<'q> {
iter: Box<dyn Iterator<Item = Result<ResultRow, String>> + 'q>,
columns: Vec<String>,
}
impl<'q> RowStream<'q> {
pub fn new<I>(iter: I, columns: Vec<String>) -> Self
where
I: Iterator<Item = Result<ResultRow, String>> + 'q,
{
RowStream {
iter: Box::new(iter),
columns,
}
}
pub fn from_vec(rows: Vec<ResultRow>, columns: Vec<String>) -> Self {
RowStream::new(rows.into_iter().map(Ok), columns)
}
pub fn from_result_set(rs: ResultSet) -> Self {
let columns = rs.columns;
RowStream::from_vec(rs.rows, columns)
}
#[allow(dead_code)]
pub fn columns(&self) -> &[String] {
&self.columns
}
pub fn columns_owned(&self) -> Vec<String> {
self.columns.clone()
}
pub fn drain(self) -> Result<ResultSet, String> {
let columns = self.columns;
let mut rows = Vec::new();
for row in self.iter {
rows.push(row?);
}
Ok(ResultSet {
rows,
columns,
lazy_return_items: None,
})
}
}
impl<'q> Iterator for RowStream<'q> {
type Item = Result<ResultRow, String>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}