Selet responses + table creation
This commit is contained in:
parent
2dd0555174
commit
002ac4c648
1 changed files with 27 additions and 21 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue