diff --git a/Cargo.lock b/Cargo.lock index bb1218e..a9a9cdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,6 +288,7 @@ dependencies = [ "bimap", "proto", "serde", + "storage_engine", "thiserror", "tokio", ] diff --git a/minisql/Cargo.toml b/minisql/Cargo.toml index 56ffcc1..7fdf355 100644 --- a/minisql/Cargo.toml +++ b/minisql/Cargo.toml @@ -14,3 +14,4 @@ serde = { version = "1.0.196", features = ["derive"] } tokio = { version = "1.34.0", features = ["full"] } thiserror = "1.0.50" proto = { path = "../proto" } +storage_engine = { path = "../storage_engine" } diff --git a/minisql/src/interpreter2.rs b/minisql/src/interpreter2.rs index 9b40b68..120c113 100644 --- a/minisql/src/interpreter2.rs +++ b/minisql/src/interpreter2.rs @@ -1,3 +1,79 @@ +use crate::operation::{ColumnSelection, Condition, Operation}; +use crate::restricted_row::RestrictedRow; +use crate::result::DbResult; +use crate::schema::{Column, TableName, TablePosition, TableSchema}; +use crate::type_system::Value; +use bimap::BiMap; +use serde::{Deserialize, Serialize}; + +use storage_engine::store::{Store}; + +// ==============Interpreter================ +#[derive(Debug)] +pub struct State { + table_name_position_mapping: BiMap, + tables: Tables, +} + +pub type Tables = Vec; + +#[derive(Debug)] +pub struct Table { + schema: TableSchema, + store: Store +} + +pub type DbSchema<'a> = Vec<(TableName, TablePosition, &'a TableSchema)>; +// To satisfy clippy. +impl Default for State { + fn default() -> Self { + Self::new() + } +} + +impl State { + pub fn new() -> Self { + Self { + table_name_position_mapping: BiMap::new(), + tables: vec![], + } + } + + pub fn db_schema(&self) -> DbSchema { + // let mut schema: DbSchema = Vec::new(); + // for (table_name, &table_position) in &self.table_name_position_mapping { + // let table_schema = self.tables[table_position].schema(); + // schema.push((table_name.clone(), table_position, table_schema)); + // } + // schema + + todo!() + } + + pub async fn interpret(&mut self, operation: Operation) -> DbResult<()> { + use Operation::*; + + match operation { + Select(table_position, column_selection, maybe_condition) => { + todo!() + } + Insert(table_position, values) => { + todo!() + } + Delete(table_position, maybe_condition) => { + todo!() + } + CreateTable(table_schema) => { + todo!() + } + CreateIndex(table_position, column) => { + todo!() + } + } + } +} + + #[cfg(test)] @@ -8,3 +84,4 @@ mod tests { async fn new_state() { } } + diff --git a/storage_engine/src/cursor.rs b/storage_engine/src/cursor.rs index 3f68560..80d8de8 100644 --- a/storage_engine/src/cursor.rs +++ b/storage_engine/src/cursor.rs @@ -10,7 +10,7 @@ use bincode::{Decode, Encode}; use crate::segments::entry::EntryDetailed; use crate::segments::entry_header::EntryHeader; use crate::segments::store_header::StoreHeader; -use crate::storage_engine::{Store, FilePosition, Column, Result, ROWS_FILE_NAME, GARBAGE_COLLECTION_INTERMEDIATE_ROWS_FILE_NAME}; +use crate::store::{Store, FilePosition, Column, Result, ROWS_FILE_NAME, GARBAGE_COLLECTION_INTERMEDIATE_ROWS_FILE_NAME}; use crate::index::Index; use crate::cursor_capabilities::primitive::{CursorCanRead, CursorCanWrite}; use crate::cursor_capabilities::header_access::{CursorCanReadHeader, CursorCanWriteHeader}; diff --git a/storage_engine/src/cursor_capabilities/header_access.rs b/storage_engine/src/cursor_capabilities/header_access.rs index 57ccabb..96bdbea 100644 --- a/storage_engine/src/cursor_capabilities/header_access.rs +++ b/storage_engine/src/cursor_capabilities/header_access.rs @@ -9,7 +9,7 @@ use crate::error::{Error, DecodeErrorKind}; use crate::segments::entry::{Entry, EntryDetailed}; use crate::segments::entry_header::EntryHeaderWithDataSize; use crate::segments::store_header::StoreHeader; -use crate::storage_engine::{FilePosition, Column, Result}; +use crate::store::{FilePosition, Column, Result}; use crate::cursor_capabilities::primitive::{CursorCanRead, CursorCanWrite}; #[async_trait] diff --git a/storage_engine/src/cursor_capabilities/index_access.rs b/storage_engine/src/cursor_capabilities/index_access.rs index d9d7fc3..1eca46c 100644 --- a/storage_engine/src/cursor_capabilities/index_access.rs +++ b/storage_engine/src/cursor_capabilities/index_access.rs @@ -7,7 +7,7 @@ use bincode::{Decode, Encode}; use crate::error::Error; use crate::segments::entry::{Entry, EntryDetailed}; -use crate::storage_engine::{FilePosition, Column, Result}; +use crate::store::{FilePosition, Column, Result}; use crate::index::Index; use crate::cursor_capabilities::header_access::{CursorCanReadHeader, CursorCanWriteHeader}; diff --git a/storage_engine/src/cursor_capabilities/primitive.rs b/storage_engine/src/cursor_capabilities/primitive.rs index d11b79b..82fb23d 100644 --- a/storage_engine/src/cursor_capabilities/primitive.rs +++ b/storage_engine/src/cursor_capabilities/primitive.rs @@ -2,7 +2,7 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt, AsyncSeekExt, SeekFrom}; use tokio::fs::File; use async_trait::async_trait; -use crate::storage_engine::{FilePosition, Result}; +use crate::store::{FilePosition, Result}; #[async_trait] pub(crate) trait CursorCanRead { diff --git a/storage_engine/src/error.rs b/storage_engine/src/error.rs index 47bf5cc..7b21fdb 100644 --- a/storage_engine/src/error.rs +++ b/storage_engine/src/error.rs @@ -1,4 +1,4 @@ -use crate::storage_engine::Column; +use crate::store::Column; #[derive(Debug)] pub enum Error { diff --git a/storage_engine/src/lib.rs b/storage_engine/src/lib.rs index e7920dd..00ff87c 100644 --- a/storage_engine/src/lib.rs +++ b/storage_engine/src/lib.rs @@ -1,7 +1,7 @@ -pub mod storage_engine; +pub mod store; mod binary_coding; -mod error; +pub mod error; mod index; -mod cursor; -mod segments; -mod cursor_capabilities; +pub mod cursor; +pub mod segments; +pub mod cursor_capabilities; diff --git a/storage_engine/src/segments/entry.rs b/storage_engine/src/segments/entry.rs index b42c490..64f6381 100644 --- a/storage_engine/src/segments/entry.rs +++ b/storage_engine/src/segments/entry.rs @@ -1,7 +1,7 @@ use bincode::{Decode, Encode}; use crate::binary_coding::{encode_sequence, encode_sequence_with_sizes, decode_sequence}; -use crate::storage_engine::{Result, FilePosition}; +use crate::store::{Result, FilePosition}; use crate::error::{Error, DecodeErrorKind}; use crate::segments::entry_header::{EntryHeader, EntryHeaderWithDataSize}; diff --git a/storage_engine/src/segments/entry_header.rs b/storage_engine/src/segments/entry_header.rs index cee5496..c0dc11e 100644 --- a/storage_engine/src/segments/entry_header.rs +++ b/storage_engine/src/segments/entry_header.rs @@ -1,5 +1,5 @@ use crate::binary_coding::{decode, encode, decode_sequence}; -use crate::storage_engine::{Result, Column}; +use crate::store::{Result, Column}; use crate::error::{Error, DecodeErrorKind}; use std::mem::size_of; diff --git a/storage_engine/src/segments/store_header.rs b/storage_engine/src/segments/store_header.rs index 890b198..8582402 100644 --- a/storage_engine/src/segments/store_header.rs +++ b/storage_engine/src/segments/store_header.rs @@ -1,5 +1,5 @@ use crate::binary_coding::{encode, encode_sequence, decode, decode_sequence}; -use crate::storage_engine::{Result, Column}; +use crate::store::{Result, Column}; use crate::error::{Error, DecodeErrorKind}; use std::mem::size_of; diff --git a/storage_engine/src/storage_engine.rs b/storage_engine/src/store.rs similarity index 100% rename from storage_engine/src/storage_engine.rs rename to storage_engine/src/store.rs