Simplify select_where, delete_where

This commit is contained in:
Yuriy Dupyn 2023-12-28 14:39:13 +01:00
parent 291f90ef03
commit 5e4abc3cb1

View file

@ -59,7 +59,7 @@ enum IndexableDbValue {
String(String), String(String),
Int(u64), Int(u64),
UUID(UUID), UUID(UUID),
// TODO: what bout null? // TODO: what about null?
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
@ -149,7 +149,7 @@ fn restrict_columns(row: &Row, columns: &Vec<ColumnPosition>) -> Row {
#[derive(Debug)] #[derive(Debug)]
struct State { struct State {
table_name_position_mapping: BiMap<TableName, TablePosition>, table_name_position_mapping: BiMap<TableName, TablePosition>,
tables: Vec<Table>, tables: Tables,
} }
impl State { impl State {
@ -414,29 +414,15 @@ impl Table {
Ok(self.rows.values().map(|row| restrict_columns(row, &selected_column_positions)).collect()), Ok(self.rows.values().map(|row| restrict_columns(row, &selected_column_positions)).collect()),
Some(Condition::Eq(eq_column_name, value)) => { Some(Condition::Eq(eq_column_name, value)) => {
let (type_, eq_column_position) = self.schema.get_column(&eq_column_name)?; let eq_column_position = self.schema.column_position_from_column_name(&eq_column_name)?;
if self.schema.is_primary(eq_column_position) {
match value {
DbValue::Indexable(IndexableDbValue::UUID(uuid)) => {
match self.get_row_by_id(uuid) {
Some(row) => Ok(vec![restrict_columns(&row, &selected_column_positions)]),
None => Ok(vec![]),
}
},
_ => Err(Error::ValueDoesNotMatchExpectedType(self.schema.table_name.clone(), eq_column_name.clone(), type_, value.clone()))
}
} else {
match value { match value {
DbValue::Indexable(value) => { DbValue::Indexable(value) => {
match self.indexes.get(&eq_column_position) { match self.fetch_ids_from_index(eq_column_position, &value)? {
Some(column_index) => { Some(ids) =>
let ids = column_index.get(value); Ok(self.get_rows_by_ids(ids).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect()),
Ok(self.get_rows_by_ids(ids).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect()) None =>
},
None => {
Ok(self.get_rows_by_value(eq_column_position, &DbValue::Indexable(value)).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect()) Ok(self.get_rows_by_value(eq_column_position, &DbValue::Indexable(value)).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect())
} }
}
}, },
_ => { _ => {
Ok(self.get_rows_by_value(eq_column_position, &value).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect()) Ok(self.get_rows_by_value(eq_column_position, &value).iter().map(|row| restrict_columns(row, &selected_column_positions)).collect())
@ -445,7 +431,6 @@ impl Table {
} }
} }
} }
}
fn insert(&mut self, values: InsertionValues) -> DbResult<()> { fn insert(&mut self, values: InsertionValues) -> DbResult<()> {
let (id, row) = self.schema.row_from_insertion_values(values)?; let (id, row) = self.schema.row_from_insertion_values(values)?;
@ -479,24 +464,12 @@ impl Table {
}, },
Some(Condition::Eq(eq_column_name, value)) => { Some(Condition::Eq(eq_column_name, value)) => {
let (type_, eq_column_position) = self.schema.get_column(&eq_column_name)?; let eq_column_position = self.schema.column_position_from_column_name(&eq_column_name)?;
if self.schema.is_primary(eq_column_position) {
match value {
DbValue::Indexable(IndexableDbValue::UUID(uuid)) => {
Ok(self.delete_row_by_id(uuid))
},
_ =>
return Err(Error::ValueDoesNotMatchExpectedType(self.schema.table_name.clone(), eq_column_name.clone(), type_, value.clone()))
}
} else {
match value { match value {
DbValue::Indexable(value) => { DbValue::Indexable(value) => {
match self.indexes.get(&eq_column_position) { match self.fetch_ids_from_index(eq_column_position, &value)? {
Some(column_index) => { Some(ids) =>
let ids = column_index.get(value); Ok(self.delete_rows_by_ids(ids)),
Ok(self.delete_rows_by_ids(ids))
},
None => None =>
Ok(self.delete_rows_by_value(eq_column_position, &DbValue::Indexable(value))) Ok(self.delete_rows_by_value(eq_column_position, &DbValue::Indexable(value)))
} }
@ -507,6 +480,29 @@ impl Table {
} }
} }
} }
fn fetch_ids_from_index(&self, column_position: ColumnPosition, value: &IndexableDbValue) -> DbResult<Option<HashSet<UUID>>> {
if self.schema.is_primary(column_position) {
match value {
IndexableDbValue::UUID(id) =>
Ok(Some(HashSet::from([*id]))),
_ => {
let column_name: ColumnName = self.schema.column_name_from_column_position(column_position)?;
let type_ = self.schema.types[column_position];
Err(Error::ValueDoesNotMatchExpectedType(self.schema.table_name.clone(), column_name, type_, DbValue::Indexable(value.clone())))
}
}
} else {
match self.indexes.get(&column_position) {
Some(index) => {
let ids = index.get(value);
Ok(Some(ids))
},
None => {
Ok(None)
}
}
}
} }
} }
@ -516,8 +512,8 @@ impl ColumnIndex {
Self { index } Self { index }
} }
fn get(&self, value: IndexableDbValue) -> HashSet<UUID> { fn get(&self, value: &IndexableDbValue) -> HashSet<UUID> {
match self.index.get(&value) { match self.index.get(value) {
Some(set) => set.clone(), Some(set) => set.clone(),
None => HashSet::new(), None => HashSet::new(),
} }
@ -593,7 +589,6 @@ enum Error {
} }
fn main() { fn main() {
println!("Hello, world!");
} }
@ -826,4 +821,6 @@ mod tests {
assert!(row[1] == name1); assert!(row[1] == name1);
assert!(row[2] == age1); assert!(row[2] == age1);
} }
// TODO: Test CreateIndex
} }