Selet responses + table creation

This commit is contained in:
Yuriy Dupyn 2024-02-05 19:37:10 +01:00
parent 2dd0555174
commit 002ac4c648

View file

@ -105,28 +105,31 @@ impl State {
self.tables.push(table); self.tables.push(table);
} }
async fn select_all_rows<Writer: ResponseWriter>(table: &Table, mut cursor: ReadCursor<'_, Value>, response_writer: &mut Writer, column_selection: ColumnSelection) -> DbResult<()> { async fn select_all_rows<Writer: ResponseWriter>(table: &Table, mut cursor: ReadCursor<'_, Value>, response_writer: &mut Writer, column_selection: ColumnSelection) -> DbResult<usize> {
let mut count = 0;
while let Some(entry) = cursor.next_alive().await.map_err(|e| RuntimeError::StorageEngineError(table.table_name().to_string(), e))? { while let Some(entry) = cursor.next_alive().await.map_err(|e| RuntimeError::StorageEngineError(table.table_name().to_string(), e))? {
count += 1;
let row: Row = From::from(entry); let row: Row = From::from(entry);
let restricted_row = row.restrict_columns(&column_selection); let restricted_row = row.restrict_columns(&column_selection);
response_writer.write_table_row(&restricted_row).await.map_err(|e| RuntimeError::AnyhowError(e))?; response_writer.write_table_row(&restricted_row).await.map_err(|e| RuntimeError::AnyhowError(e))?;
} }
// TODO: You need to write COmmand complete
Ok(()) Ok(count)
} }
async fn select_eq<Writer: ResponseWriter>(table: &Table, mut cursor: ReadCursor<'_, Value>, response_writer: &mut Writer, column_selection: ColumnSelection, column: Column, value: Value) -> DbResult<()> { async fn select_eq<Writer: ResponseWriter>(table: &Table, mut cursor: ReadCursor<'_, Value>, response_writer: &mut Writer, column_selection: ColumnSelection, column: Column, value: Value) -> DbResult<usize> {
let entries = cursor.select_entries_where_eq(column as storage_engine::store::Column, &value).await.map_err(|e| RuntimeError::StorageEngineError(table.table_name().to_string(), e))?; let entries = cursor.select_entries_where_eq(column as storage_engine::store::Column, &value).await.map_err(|e| RuntimeError::StorageEngineError(table.table_name().to_string(), e))?;
let count = entries.len();
for entry in entries { for entry in entries {
let row: Row = From::from(entry); let row: Row = From::from(entry);
let restricted_row = row.restrict_columns(&column_selection); let restricted_row = row.restrict_columns(&column_selection);
response_writer.write_table_row(&restricted_row).await.map_err(|e| RuntimeError::AnyhowError(e))?; response_writer.write_table_row(&restricted_row).await.map_err(|e| RuntimeError::AnyhowError(e))?;
} }
// TODO: You need to write COmmand complete
Ok(()) Ok(count)
} }
pub async fn interpret<Writer: ResponseWriter>(&mut self, response_writer: &mut Writer, operation: Operation) -> DbResult<()> { pub async fn interpret<Writer: ResponseWriter>(&mut self, db_path: &Path, response_writer: &mut Writer, operation: Operation) -> DbResult<()> {
use Operation::*; use Operation::*;
match operation { match operation {
@ -135,15 +138,11 @@ impl State {
let cursor = table.read().await?; let cursor = table.read().await?;
response_writer.write_table_header(&table.schema, &column_selection).await.map_err(|e| RuntimeError::AnyhowError(e))?; response_writer.write_table_header(&table.schema, &column_selection).await.map_err(|e| RuntimeError::AnyhowError(e))?;
match maybe_condition { let count = match maybe_condition {
None => { None => Self::select_all_rows(&table, cursor, response_writer, column_selection).await?,
Self::select_all_rows(&table, cursor, response_writer, column_selection).await Some(Condition::Eq(eq_column, value)) => Self::select_eq(&table, cursor, response_writer, column_selection, eq_column, value).await?
} };
response_writer.write_command_complete(CompleteStatus::Select(count)).await.map_err(|e| RuntimeError::AnyhowError(e))
Some(Condition::Eq(eq_column, value)) => {
Self::select_eq(&table, cursor, response_writer, column_selection, eq_column, value).await
}
}
} }
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);
@ -156,9 +155,6 @@ impl State {
todo!() todo!()
} }
CreateTable(table_schema) => { CreateTable(table_schema) => {
// TODO: This needs to be given from a config
let db_path = "test_db";
let table = Table::new(table_schema, Path::new(db_path)).await?; let table = Table::new(table_schema, Path::new(db_path)).await?;
self.attach_table(table).await; self.attach_table(table).await;
response_writer.write_command_complete(CompleteStatus::CreateTable).await.map_err(|e| RuntimeError::AnyhowError(e)) response_writer.write_command_complete(CompleteStatus::CreateTable).await.map_err(|e| RuntimeError::AnyhowError(e))
@ -181,6 +177,16 @@ mod tests {
use crate::type_system::{DbType, IndexableValue, Value}; use crate::type_system::{DbType, IndexableValue, Value};
use std::collections::HashSet; use std::collections::HashSet;
impl Drop for State {
fn drop(&mut self) {
println!("CLEANING UP INTERPRETER STATE");
// TODO
// let table_folder = self.header.table_folder.clone();
// Seems no one has figured out how to do AsyncDrop yet.
// std::fs::remove_dir_all(table_folder).unwrap();
}
}
fn users_schema() -> TableSchema { fn users_schema() -> TableSchema {
TableSchema::new( TableSchema::new(
"users".to_string(), "users".to_string(),
@ -190,8 +196,8 @@ mod tests {
) )
} }
#[test] #[tokio::test]
fn test_table_creation() { async fn test_table_creation() {
let mut state = State::new(); let mut state = State::new();
let users_schema = users_schema(); let users_schema = users_schema();
let users = users_schema.table_name().clone(); let users = users_schema.table_name().clone();