Return table schema in SELECT response

This commit is contained in:
Yuriy Dupyn 2024-01-27 23:42:03 +01:00
parent 80c4ff220e
commit fdfdaa9fc0

View file

@ -18,7 +18,7 @@ pub struct State {
// #[derive(Debug)] // #[derive(Debug)]
pub enum Response<'a> { pub enum Response<'a> {
Selected(Box<dyn Iterator<Item=Row> + 'a + Send>), Selected(&'a TableSchema, Box<dyn Iterator<Item=Row> + 'a + Send>),
Inserted, Inserted,
Deleted(usize), // how many were deleted Deleted(usize), // how many were deleted
TableCreated, TableCreated,
@ -31,7 +31,7 @@ impl std::fmt::Debug for Response<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
use Response::*; use Response::*;
match self { match self {
Selected(_rows) => Selected(_schema, _rows) =>
// TODO: How can we iterate through the rows without having to take ownership of // TODO: How can we iterate through the rows without having to take ownership of
// them? // them?
f.write_str("Some rows... trust me"), f.write_str("Some rows... trust me"),
@ -104,7 +104,7 @@ impl State {
} }
}; };
Ok(Response::Selected(selected_rows)) Ok(Response::Selected(table.schema(), selected_rows))
}, },
Insert(table_position, values) => { Insert(table_position, values) => {
let table: &mut Table = self.table_at_mut(table_position); let table: &mut Table = self.table_at_mut(table_position);
@ -195,8 +195,8 @@ mod tests {
let response: Response = state let response: Response = state
.interpret(Operation::Select(users_position, users_schema.all_selection(), None)) .interpret(Operation::Select(users_position, users_schema.all_selection(), None))
.unwrap(); .unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();
@ -237,8 +237,8 @@ mod tests {
.interpret(Operation::Select(users, users_schema.all_selection(), None)) .interpret(Operation::Select(users, users_schema.all_selection(), None))
.unwrap(); .unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();
@ -304,8 +304,8 @@ mod tests {
{ {
let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap(); let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();
@ -332,8 +332,8 @@ mod tests {
Some(Eq(id_column, id0.clone())), Some(Eq(id_column, id0.clone())),
)) ))
.unwrap(); .unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();
@ -354,8 +354,8 @@ mod tests {
Some(Eq(id_column, id0.clone())), Some(Eq(id_column, id0.clone())),
)) ))
.unwrap(); .unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();
@ -429,8 +429,8 @@ mod tests {
let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap(); let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap();
assert!(matches!(response, Response::Selected(_))); assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(rows) = response else { let Response::Selected(_schema, rows) = response else {
panic!() panic!()
}; };
let rows: Vec<_> = rows.collect(); let rows: Vec<_> = rows.collect();