Merge remote-tracking branch 'origin/main' into optimize-operation

This commit is contained in:
Yuriy Dupyn 2024-01-28 00:26:56 +01:00
commit 900608b2f4
17 changed files with 814 additions and 198 deletions

View file

@ -1,9 +1,10 @@
use crate::internals::row::Row;
use crate::internals::row::ColumnPosition;
use crate::schema::{TableName, TableSchema};
use crate::internals::table::Table;
use crate::operation::{Operation, Condition};
use crate::result::DbResult;
use bimap::BiMap;
use crate::restricted_row::RestrictedRow;
// Use `TablePosition` as index
pub type Tables = Vec<Table>;
@ -18,7 +19,7 @@ pub struct State {
// #[derive(Debug)]
pub enum Response<'a> {
Selected(&'a TableSchema, Box<dyn Iterator<Item=Row> + 'a + Send>),
Selected(&'a TableSchema, Box<dyn Iterator<Item=RestrictedRow> + 'a + Send>),
Inserted,
Deleted(usize), // how many were deleted
TableCreated,
@ -89,8 +90,8 @@ impl State {
let selected_rows = match maybe_condition {
None => {
let x = table.select_all_rows(column_selection);
Box::new(x) as Box<dyn Iterator<Item=Row> + 'a + Send>
let rows = table.select_all_rows(column_selection);
Box::new(rows) as Box<dyn Iterator<Item=RestrictedRow> + 'a + Send>
},
Some(Condition::Eq(eq_column, value)) => {
@ -100,7 +101,7 @@ impl State {
eq_column,
value,
)?;
Box::new(x) as Box<dyn Iterator<Item=Row> + 'a + Send>
Box::new(x) as Box<dyn Iterator<Item=RestrictedRow> + 'a + Send>
}
};
@ -246,9 +247,9 @@ mod tests {
let row = &rows[0];
assert!(row.len() == 3);
assert!(row[0] == id);
assert!(row[1] == name);
assert!(row[2] == age);
assert!(row[0].1 == id);
assert!(row[1].1 == name);
assert!(row[2].1 == age);
}
#[test]
@ -305,23 +306,24 @@ mod tests {
let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap();
assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(_schema, rows) = response else {
let Response::Selected(_, rows) = response else {
panic!()
};
let rows: Vec<_> = rows.collect();
let rows: Vec<_> = rows.collect();
assert!(rows.len() == 2);
let row0 = &rows[0];
let row1 = &rows[1];
assert!(row0.len() == 3);
assert!(row0[0] == id0);
assert!(row0[1] == name0);
assert!(row0[2] == age0);
assert!(row0[0].1 == id0);
assert!(row0[1].1 == name0);
assert!(row0[2].1 == age0);
assert!(row1.len() == 3);
assert!(row1[0] == id1);
assert!(row1[1] == name1);
assert!(row1[2] == age1);
assert!(row1[0].1 == id1);
assert!(row1[1].1 == name1);
assert!(row1[2].1 == age1);
}
{
@ -333,7 +335,7 @@ mod tests {
))
.unwrap();
assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(_schema, rows) = response else {
let Response::Selected(_, rows) = response else {
panic!()
};
let rows: Vec<_> = rows.collect();
@ -341,9 +343,9 @@ mod tests {
let row0 = &rows[0];
assert!(row0.len() == 3);
assert!(row0[0] == id0);
assert!(row0[1] == name0);
assert!(row0[2] == age0);
assert!(row0[0].1 == id0);
assert!(row0[1].1 == name0);
assert!(row0[2].1 == age0);
}
{
@ -355,7 +357,7 @@ mod tests {
))
.unwrap();
assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(_schema, rows) = response else {
let Response::Selected(_, rows) = response else {
panic!()
};
let rows: Vec<_> = rows.collect();
@ -363,8 +365,8 @@ mod tests {
let row0 = &rows[0];
assert!(row0.len() == 2);
assert!(row0[0] == name0);
assert!(row0[1] == id0);
assert!(row0[0].1 == name0);
assert!(row0[1].1 == id0);
}
}
@ -430,7 +432,7 @@ mod tests {
let response: Response = state.interpret(Select(users_position, users_schema.all_selection(), None)).unwrap();
assert!(matches!(response, Response::Selected(_, _)));
let Response::Selected(_schema, rows) = response else {
let Response::Selected(_, rows) = response else {
panic!()
};
let rows: Vec<_> = rows.collect();
@ -438,9 +440,9 @@ mod tests {
let row = &rows[0];
assert!(row.len() == 3);
assert!(row[0] == id1);
assert!(row[1] == name1);
assert!(row[2] == age1);
assert!(row[0].1 == id1);
assert!(row[1].1 == name1);
assert!(row[2].1 == age1);
}
#[test]
@ -516,7 +518,6 @@ mod tests {
pub fn example() {
use crate::type_system::{IndexableValue, Value, DbType};
use crate::internals::row::ColumnPosition;
use Condition::*;
use IndexableValue::*;
use Operation::*;