use crate::{
db::{
QueryError,
schema::AcceptedEnumCatalog,
session::{
query::StructuralProjectionPayload, response::output_row_from_runtime,
sql::SqlStatementResult,
},
},
value::Value,
};
pub(in crate::db::session::sql) fn sql_statement_result_from_structural_projection_payload(
payload: StructuralProjectionPayload,
) -> Result<SqlStatementResult, QueryError> {
let (columns, fixed_scales, rows, row_count) = payload.into_output_components()?;
Ok(SqlStatementResult::Projection {
columns,
fixed_scales,
rows,
row_count,
})
}
pub(in crate::db::session::sql) fn sql_projection_statement_result_from_value_rows(
catalog: &AcceptedEnumCatalog,
columns: Vec<String>,
fixed_scales: Vec<Option<u32>>,
rows: impl IntoIterator<Item = Vec<Value>>,
row_count: u32,
) -> Result<SqlStatementResult, QueryError> {
Ok(SqlStatementResult::Projection {
columns,
fixed_scales,
rows: rows
.into_iter()
.map(|row| output_row_from_runtime(catalog, row))
.collect::<Result<Vec<_>, _>>()?,
row_count,
})
}
pub(in crate::db::session::sql) fn sql_projection_statement_result_from_fallible_value_rows(
catalog: &AcceptedEnumCatalog,
columns: Vec<String>,
fixed_scales: Vec<Option<u32>>,
rows: impl IntoIterator<Item = Result<Vec<Value>, QueryError>>,
row_count: u32,
) -> Result<SqlStatementResult, QueryError> {
let rows = rows
.into_iter()
.map(|row| row.and_then(|row| output_row_from_runtime(catalog, row)))
.collect::<Result<Vec<_>, _>>()?;
Ok(SqlStatementResult::Projection {
columns,
fixed_scales,
rows,
row_count,
})
}