feat: connect server to the new interpreter
This commit is contained in:
parent
9b9f9f16f6
commit
f5d45f6a1d
6 changed files with 70 additions and 145 deletions
|
|
@ -1,5 +1,5 @@
|
|||
use crate::syntax::RawQuerySyntax;
|
||||
use minisql::{interpreter::DbSchema, operation::Operation};
|
||||
use minisql::{interpreter2::DbSchema, operation::Operation};
|
||||
use nom::{branch::alt, character::complete::{multispace0, char}, multi::many1, sequence::{delimited, terminated}, IResult};
|
||||
use thiserror::Error;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
use std::collections::{BTreeMap, HashSet};
|
||||
use std::sync::Arc;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::parsing::literal::Literal;
|
||||
|
|
@ -6,7 +7,7 @@ use crate::syntax;
|
|||
use crate::syntax::{ColumnSchema, RawQuerySyntax, RawTableSchema};
|
||||
use minisql::operation;
|
||||
use minisql::{
|
||||
interpreter::DbSchema,
|
||||
interpreter2::DbSchema,
|
||||
operation::Operation,
|
||||
schema::{Column, ColumnName, TableName, TablePosition, TableSchema},
|
||||
type_system::DbType,
|
||||
|
|
@ -63,15 +64,15 @@ pub fn validate_operation(
|
|||
}
|
||||
}
|
||||
|
||||
fn validate_table_exists<'a>(
|
||||
db_schema: &DbSchema<'a>,
|
||||
table_name: &'a TableName,
|
||||
) -> Result<(TablePosition, &'a TableSchema), ValidationError> {
|
||||
fn validate_table_exists(
|
||||
db_schema: &DbSchema,
|
||||
table_name: &TableName,
|
||||
) -> Result<(TablePosition, Arc<TableSchema>), ValidationError> {
|
||||
db_schema
|
||||
.iter()
|
||||
.find(|(tname, _, _)| table_name.eq(tname))
|
||||
.ok_or(ValidationError::TableDoesNotExist(table_name.to_string()))
|
||||
.map(|(_, table_position, table_schema)| (*table_position, *table_schema))
|
||||
.map(|(_, table_position, table_schema)| (*table_position, table_schema.clone()))
|
||||
}
|
||||
|
||||
fn validate_create_table(
|
||||
|
|
@ -167,7 +168,7 @@ fn validate_select(
|
|||
.iter()
|
||||
.filter_map(|column_name| schema.get_column(column_name))
|
||||
.collect();
|
||||
let validated_condition = validate_condition(condition, schema)?;
|
||||
let validated_condition = validate_condition(condition, &schema)?;
|
||||
Ok(Operation::Select(
|
||||
table_position,
|
||||
selection,
|
||||
|
|
@ -178,7 +179,7 @@ fn validate_select(
|
|||
}
|
||||
}
|
||||
syntax::ColumnSelection::All => {
|
||||
let validated_condition = validate_condition(condition, schema)?;
|
||||
let validated_condition = validate_condition(condition, &schema)?;
|
||||
Ok(Operation::Select(
|
||||
table_position,
|
||||
schema.all_selection(),
|
||||
|
|
@ -267,13 +268,13 @@ fn validate_delete(
|
|||
db_schema: &DbSchema,
|
||||
) -> Result<Operation, ValidationError> {
|
||||
let (table_position, schema) = validate_table_exists(db_schema, &table_name)?;
|
||||
let validated_condition = validate_condition(condition, schema)?;
|
||||
let validated_condition = validate_condition(condition, &schema)?;
|
||||
Ok(Operation::Delete(table_position, validated_condition))
|
||||
}
|
||||
|
||||
fn validate_condition(
|
||||
condition: Option<syntax::Condition>,
|
||||
schema: &TableSchema,
|
||||
schema: &Arc<TableSchema>,
|
||||
) -> Result<Option<operation::Condition>, ValidationError> {
|
||||
match condition {
|
||||
Some(condition) => match condition {
|
||||
|
|
@ -338,14 +339,14 @@ where
|
|||
None
|
||||
}
|
||||
|
||||
fn get_table_schema<'a>(
|
||||
db_schema: &DbSchema<'a>,
|
||||
table_name: &'a TableName,
|
||||
) -> Option<&'a TableSchema> {
|
||||
fn get_table_schema(
|
||||
db_schema: &DbSchema,
|
||||
table_name: &TableName,
|
||||
) -> Option<Arc<TableSchema>> {
|
||||
let (_, _, table_schema) = db_schema
|
||||
.iter()
|
||||
.find(|(tname, _, _)| table_name.eq(tname))?;
|
||||
Some(table_schema)
|
||||
Some(table_schema.clone())
|
||||
}
|
||||
|
||||
fn literal_to_value(lit: Literal, hint: &DbType) -> Value {
|
||||
|
|
@ -428,11 +429,11 @@ mod tests {
|
|||
}
|
||||
}
|
||||
|
||||
fn db_schema(users_schema: &TableSchema) -> DbSchema {
|
||||
vec![("users".to_string(), 0, users_schema)]
|
||||
fn db_schema(users_schema: Arc<TableSchema>) -> DbSchema {
|
||||
vec![("users".to_string(), 0, users_schema.clone())]
|
||||
}
|
||||
|
||||
fn empty_db_schema() -> DbSchema<'static> {
|
||||
fn empty_db_schema() -> DbSchema {
|
||||
vec![]
|
||||
}
|
||||
|
||||
|
|
@ -547,7 +548,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_create_already_exists() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = CreateTable(raw_users_schema());
|
||||
let result = validate_operation(syntax, &db_schema);
|
||||
|
|
@ -561,7 +562,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_basic() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
let users_position = 0;
|
||||
let id = 0;
|
||||
let name = 1;
|
||||
|
|
@ -583,7 +584,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_non_existent_table() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax =
|
||||
Select("does_not_exist".to_string(), ColumnSelection::All, None);
|
||||
|
|
@ -594,7 +595,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_eq() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
let id = 0;
|
||||
|
|
@ -622,7 +623,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_eq_columns_selection() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
let name = 1;
|
||||
|
|
@ -652,7 +653,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_eq_columns_selection_nonexistent_column_selected() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = Select(
|
||||
"users".to_string(),
|
||||
|
|
@ -666,7 +667,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_eq_non_existent_column() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = Select(
|
||||
"users".to_string(),
|
||||
|
|
@ -680,7 +681,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_select_eq_type_error() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = Select(
|
||||
"users".to_string(),
|
||||
|
|
@ -695,7 +696,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_insert() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
|
||||
|
|
@ -732,7 +733,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_insert_non_existent_column() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = Insert(
|
||||
"users".to_string(),
|
||||
|
|
@ -750,7 +751,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_insert_ill_typed_column() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = Insert(
|
||||
"users".to_string(),
|
||||
|
|
@ -768,7 +769,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_delete_all() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
|
||||
|
|
@ -786,7 +787,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_delete_eq() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
let age = 2;
|
||||
|
|
@ -816,7 +817,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_create_index() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let users_position = 0;
|
||||
let age = 2;
|
||||
|
|
@ -836,7 +837,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_create_index_nonexistent_column() {
|
||||
let users_schema: TableSchema = users_schema();
|
||||
let db_schema: DbSchema = db_schema(&users_schema);
|
||||
let db_schema: DbSchema = db_schema(Arc::new(users_schema));
|
||||
|
||||
let syntax: RawQuerySyntax = CreateIndex("users".to_string(), "does_not_exist".to_string());
|
||||
let result = validate_operation(syntax, &db_schema);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue