Merge branch 'operation-separation' into 'main'

Make interpreter a library

See merge request x433485/minisql!6
This commit is contained in:
Yuriy Dupyn 2024-01-21 08:38:53 +01:00
commit 29527e92ff
8 changed files with 20 additions and 20 deletions

View file

@ -1,5 +1,5 @@
use crate::internals::row::ColumnPosition; use crate::internals::row::ColumnPosition;
use crate::internals::schema::{ColumnName, TableName}; use crate::schema::{ColumnName, TableName};
use crate::operation::InsertionValues; use crate::operation::InsertionValues;
use crate::type_system::{DbType, Uuid, Value}; use crate::type_system::{DbType, Uuid, Value};

View file

@ -1,4 +1,3 @@
pub mod column_index; pub mod column_index;
pub mod row; pub mod row;
pub mod schema;
pub mod table; pub mod table;

View file

@ -3,7 +3,7 @@ use std::collections::{BTreeMap, HashMap, HashSet};
use crate::error::Error; use crate::error::Error;
use crate::internals::column_index::ColumnIndex; use crate::internals::column_index::ColumnIndex;
use crate::internals::row::{ColumnPosition, Row}; use crate::internals::row::{ColumnPosition, Row};
use crate::internals::schema::{ColumnName, TableSchema, TableName}; use crate::schema::{ColumnName, TableSchema, TableName};
use crate::result::DbResult; use crate::result::DbResult;
use crate::type_system::{IndexableValue, Uuid, Value}; use crate::type_system::{IndexableValue, Uuid, Value};
@ -206,7 +206,7 @@ impl Table {
let column_name: ColumnName = self let column_name: ColumnName = self
.schema .schema
.column_name_from_column_position(column_position)?; .column_name_from_column_position(column_position)?;
let type_ = self.schema.types[column_position]; let type_ = self.schema.column_type(column_position);
Err(Error::ValueDoesNotMatchExpectedType( Err(Error::ValueDoesNotMatchExpectedType(
self.table_name().clone(), self.table_name().clone(),
column_name, column_name,

View file

@ -1,6 +1,6 @@
use crate::error::Error; use crate::error::Error;
use crate::internals::row::{ColumnPosition, Row}; use crate::internals::row::{ColumnPosition, Row};
use crate::internals::schema::{TableName, TableSchema}; use crate::schema::{TableName, TableSchema};
use crate::internals::table::Table; use crate::internals::table::Table;
use crate::operation::{ColumnSelection, Condition, Operation}; use crate::operation::{ColumnSelection, Condition, Operation};
use crate::result::DbResult; use crate::result::DbResult;

7
minisql/src/lib.rs Normal file
View file

@ -0,0 +1,7 @@
pub mod schema;
pub mod interpreter;
pub mod operation;
pub mod type_system;
mod error;
mod internals;
mod result;

View file

@ -1,10 +0,0 @@
mod error;
mod internals;
mod interpreter;
mod operation;
mod result;
mod type_system;
fn main() {
interpreter::example();
}

View file

@ -1,4 +1,4 @@
use crate::internals::schema::{ColumnName, TableName, TableSchema}; use crate::schema::{ColumnName, TableName, TableSchema};
use crate::type_system::Value; use crate::type_system::Value;
// ==============SQL operations================ // ==============SQL operations================

View file

@ -11,16 +11,16 @@ use std::collections::HashMap;
#[derive(Debug)] #[derive(Debug)]
pub struct TableSchema { pub struct TableSchema {
table_name: TableName, // used for descriptive errors table_name: TableName, // used for descriptive errors
pub primary_key: ColumnPosition, primary_key: ColumnPosition,
pub column_name_position_mapping: BiMap<ColumnName, ColumnPosition>, column_name_position_mapping: BiMap<ColumnName, ColumnPosition>,
pub types: Vec<DbType>, types: Vec<DbType>,
} }
pub type TableName = String; pub type TableName = String;
pub type ColumnName = String; pub type ColumnName = String;
impl TableSchema { impl TableSchema {
pub fn new(table_name: TableName, primary_key: ColumnPosition, column_name_position_map: Vec<(ColumnName, ColumnPosition)>, types: Vec<DbType>) -> Self { pub(crate) fn new(table_name: TableName, primary_key: ColumnPosition, column_name_position_map: Vec<(ColumnName, ColumnPosition)>, types: Vec<DbType>) -> Self {
let mut column_name_position_mapping: BiMap<ColumnName, ColumnPosition> = BiMap::new(); let mut column_name_position_mapping: BiMap<ColumnName, ColumnPosition> = BiMap::new();
for (column_name, column_position) in column_name_position_map { for (column_name, column_position) in column_name_position_map {
column_name_position_mapping.insert(column_name, column_position); column_name_position_mapping.insert(column_name, column_position);
@ -32,6 +32,10 @@ impl TableSchema {
&self.table_name &self.table_name
} }
pub fn column_type(&self, column_position: ColumnPosition) -> DbType {
self.types[column_position]
}
fn get_column(&self, column_name: &ColumnName) -> DbResult<(DbType, ColumnPosition)> { fn get_column(&self, column_name: &ColumnName) -> DbResult<(DbType, ColumnPosition)> {
match self.column_name_position_mapping.get_by_left(column_name) { match self.column_name_position_mapping.get_by_left(column_name) {
Some(column_position) => match self.types.get(*column_position) { Some(column_position) => match self.types.get(*column_position) {