Skip to content

Commit 0e3f702

Browse files
committed
Use TempDB instead of context
1 parent 78e3a59 commit 0e3f702

File tree

13 files changed

+64
-89
lines changed

13 files changed

+64
-89
lines changed

Diff for: src/executor/alter_row/delete.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl Glue {
3636
.clone()
3737
.map(|selection| {
3838
PlannedRecipe::new(
39-
MetaRecipe::new(selection)?.simplify_by_context(&*self.get_context()?)?,
39+
MetaRecipe::new(selection)?.simplify_by_tempdb(&self.tempdb)?,
4040
&columns,
4141
)
4242
})

Diff for: src/executor/alter_row/update.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl Glue {
4949
.clone()
5050
.map(|selection| {
5151
PlannedRecipe::new(
52-
MetaRecipe::new(selection)?.simplify_by_context(&*self.get_context()?)?,
52+
MetaRecipe::new(selection)?.simplify_by_tempdb(&self.tempdb)?,
5353
&columns,
5454
)
5555
})
@@ -69,7 +69,7 @@ impl Glue {
6969
.position(|column| column == &column_compare)
7070
.ok_or(ExecuteError::ColumnNotFound)?;
7171
let recipe = PlannedRecipe::new(
72-
MetaRecipe::new(value.clone())?.simplify_by_context(&*self.get_context()?)?,
72+
MetaRecipe::new(value.clone())?.simplify_by_tempdb(&self.tempdb)?,
7373
&columns,
7474
)?;
7575
Ok((index, recipe))

Diff for: src/executor/query/get_columns.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ use {
1212

1313
impl Glue {
1414
pub async fn get_columns(&self, table: ComplexTableName) -> Result<Vec<ColumnInfo>> {
15-
let context_tables = {
16-
let context = self.get_context().unwrap();
17-
context.tables.clone()
18-
};
19-
if let Some((context_table_labels, ..)) = context_tables.get(&table.name) {
15+
if let Some((context_table_labels, ..)) = self.tempdb.get_table(&table.name) {
2016
Ok(context_table_labels
2117
.iter()
2218
.map(|name| ColumnInfo {

Diff for: src/executor/query/get_rows.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ impl Glue {
1111
database: &Option<String>,
1212
index_filter: &Option<IndexFilter>,
1313
) -> Result<Vec<Vec<Value>>> {
14-
let context_tables = {
15-
let context = self.get_context().unwrap();
16-
context.tables.clone()
17-
};
18-
if let Some((.., context_table_rows)) = context_tables.get(table) {
14+
if let Some((.., context_table_rows)) = self.tempdb.get_table(table) {
1915
Ok(context_table_rows.clone())
2016
} else {
2117
let rows = self.get_view_rows(table, database).await?;

Diff for: src/executor/query/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@ impl Glue {
5353
let limit: Option<usize> = limit
5454
.map(|expression| {
5555
MetaRecipe::new(expression)?
56-
.simplify_by_context(&*self.get_context()?)?
56+
.simplify_by_tempdb(&self.tempdb)?
5757
.confirm_or_err(QueryError::MissingComponentsForLimit.into())?
5858
.cast()
5959
})
6060
.transpose()?;
6161
let offset: Option<usize> = offset
6262
.map(|offset| {
6363
MetaRecipe::new(offset.value)?
64-
.simplify_by_context(&*self.get_context()?)?
64+
.simplify_by_tempdb(&self.tempdb)?
6565
.confirm_or_err(QueryError::MissingComponentsForOffset.into())?
6666
.cast()
6767
})
@@ -84,7 +84,7 @@ impl Glue {
8484
} = alias;
8585
let name = name.value;
8686
let data = self.query(query).await?;
87-
self.get_mut_context()?.set_table(name, data);
87+
self.tempdb.set_table(name, data);
8888
}
8989
}
9090

Diff for: src/executor/query/select/join/manual.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use {
22
super::{JoinError, JoinType},
33
crate::{
44
executor::{types::ComplexTableName, MetaRecipe},
5-
Context, Result,
5+
Result, TempDB,
66
},
77
sqlparser::ast::{Join as AstJoin, JoinConstraint, JoinOperator, TableFactor},
88
};
@@ -15,10 +15,10 @@ pub struct JoinManual {
1515
}
1616

1717
impl JoinManual {
18-
pub fn new(join: AstJoin, context: &Context) -> Result<Self> {
18+
pub fn new(join: AstJoin, tempdb: &TempDB) -> Result<Self> {
1919
let table = join.relation.try_into()?;
2020
let (join_type, constraint) = Self::convert_join(join.join_operator)?;
21-
let constraint = constraint.simplify_by_context(context)?;
21+
let constraint = constraint.simplify_by_tempdb(tempdb)?;
2222
Ok(Self {
2323
table,
2424
join_type,

Diff for: src/executor/query/select/manual/mod.rs

+5-12
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,16 @@ impl Manual {
5656
} = select;
5757

5858
let constraint = selection
59-
.map(|selection| {
60-
MetaRecipe::new(selection)?.simplify_by_context(&glue.get_context().unwrap())
61-
})
59+
.map(|selection| MetaRecipe::new(selection)?.simplify_by_tempdb(&glue.tempdb))
6260
.unwrap_or(Ok(MetaRecipe::TRUE))?;
6361

6462
let group_constraint = having
65-
.map(|having| {
66-
MetaRecipe::new(having)?.simplify_by_context(&glue.get_context().unwrap())
67-
})
63+
.map(|having| MetaRecipe::new(having)?.simplify_by_tempdb(&glue.tempdb))
6864
.unwrap_or(Ok(MetaRecipe::TRUE))?;
6965

7066
let groups = group_by
7167
.into_iter()
72-
.map(|expression| {
73-
MetaRecipe::new(expression)?.simplify_by_context(&glue.get_context().unwrap())
74-
})
68+
.map(|expression| MetaRecipe::new(expression)?.simplify_by_tempdb(&glue.tempdb))
7569
.collect::<Result<Vec<MetaRecipe>>>()?;
7670

7771
let (select_items, _subqueries): (Vec<SelectItem>, Vec<Vec<JoinManual>>) = projection
@@ -88,7 +82,7 @@ impl Manual {
8882
let mut joins = from
8983
.joins
9084
.into_iter()
91-
.map(|join| JoinManual::new(join, &glue.get_context().unwrap()))
85+
.map(|join| JoinManual::new(join, &glue.tempdb))
9286
.collect::<Result<Vec<JoinManual>>>()?;
9387
joins.push(main);
9488
Ok(joins)
@@ -136,8 +130,7 @@ fn convert_select_item(
136130
SelectItemAst::ExprWithAlias { expr, alias } => (expr, Some(alias.value)),
137131
_ => unreachable!(),
138132
};
139-
let recipe =
140-
MetaRecipe::new(expression)?.simplify_by_context(&glue.get_context().unwrap())?;
133+
let recipe = MetaRecipe::new(expression)?.simplify_by_tempdb(&glue.tempdb)?;
141134
let subqueries = recipe.meta.subqueries.clone();
142135
(SelectItem::Recipe(recipe, alias), subqueries)
143136
}

Diff for: src/executor/query/set_expr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl Glue {
3232
.into_iter()
3333
.map(|cell| {
3434
MetaRecipe::new(cell)?
35-
.simplify_by_context(&*self.get_context()?)?
35+
.simplify_by_tempdb(&self.tempdb)?
3636
.confirm_or_err(QueryError::MissingComponentsForValues.into())
3737
})
3838
.collect::<Result<Vec<Value>>>()

Diff for: src/executor/recipe/new.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use {
22
super::{Ingredient, Method, Recipe, RecipeError, TryIntoMethod},
33
crate::{
44
executor::{query::JoinManual, types::ObjectName},
5-
Context, Resolve, Result, SimplifyBy, Value,
5+
Resolve, Result, SimplifyBy, TempDB, Value,
66
},
77
sqlparser::ast::{Expr, FunctionArg, FunctionArgExpr, Ident},
88
std::convert::TryFrom,
@@ -19,7 +19,7 @@ impl MetaRecipe {
1919
let (recipe, meta) = Recipe::new_with_meta(expression)?;
2020
Ok(Self { recipe, meta })
2121
}
22-
pub fn simplify_by_context(self, context: &Context) -> Result<Self> {
22+
pub fn simplify_by_tempdb(self, tempdb: &TempDB) -> Result<Self> {
2323
let meta_objects = self.meta.objects.clone();
2424
let (meta_objects, row) = meta_objects
2525
.into_iter()
@@ -28,7 +28,7 @@ impl MetaRecipe {
2828
.clone()
2929
.and_then(|object_name| {
3030
if object_name.len() == 1 {
31-
context.variables.get(&object_name[0]).map(Clone::clone)
31+
tempdb.get_variable(&object_name[0]).map(Clone::clone)
3232
} else {
3333
None
3434
}

Diff for: src/executor/set_variable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl Glue {
1515
SetVariableValue::Literal(literal) => literal.try_into()?,
1616
};
1717
let name = variable.value.clone();
18-
self.get_mut_context()?.set_variable(name, value);
18+
self.tempdb.set_variable(name, value);
1919
Ok(())
2020
}
2121
}

Diff for: src/glue/database.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use {
2-
crate::{Context, Database, DatabaseInner, Glue, InterfaceError, Result},
2+
crate::{Database, DatabaseInner, Glue, InterfaceError, Result},
33
std::sync::MutexGuard,
44
};
55

@@ -17,16 +17,6 @@ impl Glue {
1717
.ok_or(InterfaceError::DatabaseNotFound.into())
1818
.map(Database::get_mut)
1919
}
20-
pub fn get_context(&self) -> Result<MutexGuard<Context>> {
21-
self.context
22-
.try_lock()
23-
.map_err(|_| InterfaceError::ContextUnavailable.into())
24-
}
25-
pub fn get_mut_context(&mut self) -> Result<&mut Context> {
26-
self.context
27-
.get_mut()
28-
.map_err(|_| InterfaceError::ContextUnavailable.into())
29-
}
3020
pub fn get_database_list(&self) -> Vec<&String> {
3121
self.databases.keys().collect()
3222
}

Diff for: src/glue/mod.rs

+7-42
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,22 @@
1-
use std::sync::Mutex;
2-
3-
use crate::ExecuteError;
41
use {
52
crate::{
6-
parse, parse_single, CSVSettings, Connection, Database, Payload, Query, Result, Value,
7-
WIPError,
3+
parse, parse_single, CSVSettings, Connection, Database, ExecuteError, Payload, Query,
4+
Result, Value, WIPError,
85
},
96
futures::executor::block_on,
107
sqlparser::ast::{
118
Expr, Ident, ObjectName, Query as AstQuery, SetExpr, Statement, Value as AstValue, Values,
129
},
13-
std::{collections::HashMap, fmt::Debug},
10+
std::collections::HashMap,
1411
};
1512

1613
mod database;
1714
mod error;
1815
mod payload;
1916
mod select;
17+
mod tempdb;
2018

21-
pub use error::InterfaceError;
22-
23-
pub(crate) type Variables = HashMap<String, Value>;
24-
25-
#[derive(Default, Debug, Clone)]
26-
pub struct Context {
27-
pub variables: Variables,
28-
pub tables: HashMap<String, (Vec<String>, Vec<Vec<Value>>)>,
29-
}
30-
impl Context {
31-
pub fn set_variable(&mut self, name: String, value: Value) {
32-
self.variables.insert(name, value);
33-
}
34-
pub fn set_table(&mut self, name: String, data: (Vec<String>, Vec<Vec<Value>>)) {
35-
self.tables.insert(name, data);
36-
}
37-
}
19+
pub use {error::InterfaceError, tempdb::TempDB};
3820

3921
/// # Glue
4022
/// Glue is *the* interface for interacting with MultiSQL; a Glue instance comprises any number of stores, each with their own identifier.
@@ -50,7 +32,7 @@ impl Context {
5032
pub struct Glue {
5133
pub primary: String,
5234
databases: HashMap<String, Database>,
53-
context: Mutex<Context>,
35+
pub tempdb: TempDB,
5436
}
5537

5638
/// ## Creation of new interfaces
@@ -64,11 +46,10 @@ impl Glue {
6446
/// Creates a [Glue] instance with access to all provided storages.
6547
/// Argument is: [Vec]<(Identifier, [Database])>
6648
pub fn new_multi(databases: HashMap<String, Database>) -> Self {
67-
let context = Mutex::new(Context::default());
6849
let primary = databases.keys().next().cloned().unwrap_or_default();
6950
Self {
7051
databases,
71-
context,
52+
tempdb: TempDB::default(),
7253
primary,
7354
}
7455
}
@@ -167,22 +148,6 @@ impl Glue {
167148
}
168149
}
169150

170-
/// Internal: Modify
171-
impl Glue {
172-
/*pub(crate) fn take_context(&mut self) -> Result<Context> {
173-
self.context
174-
.take()
175-
.ok_or(InterfaceError::ContextUnavailable.into())
176-
}
177-
pub(crate) fn replace_context(&mut self, context: Context) {
178-
self.context.replace(context);
179-
}*/
180-
#[allow(dead_code)]
181-
fn set_context(&mut self, context: Context) {
182-
self.context = Mutex::new(context);
183-
}
184-
}
185-
186151
impl Glue {
187152
pub fn into_connections(self) -> Vec<(String, Connection)> {
188153
self.databases

Diff for: src/glue/tempdb.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use {crate::Value, std::collections::HashMap};
2+
3+
#[derive(Clone)]
4+
pub struct TempDB {
5+
variables: HashMap<String, Value>,
6+
tables: HashMap<String, (Vec<String>, Vec<Vec<Value>>)>,
7+
}
8+
9+
impl Default for TempDB {
10+
fn default() -> Self {
11+
TempDB {
12+
variables: HashMap::new(),
13+
tables: HashMap::new(),
14+
}
15+
}
16+
}
17+
18+
impl TempDB {
19+
pub fn get_variable(&self, name: &str) -> Option<&Value> {
20+
self.variables.get(name)
21+
}
22+
pub fn set_variable(&mut self, name: String, value: Value) -> Option<Value> {
23+
self.variables.insert(name, value)
24+
}
25+
pub fn get_table(&self, name: &str) -> Option<&(Vec<String>, Vec<Vec<Value>>)> {
26+
self.tables.get(name)
27+
}
28+
pub fn set_table(
29+
&mut self,
30+
name: String,
31+
data: (Vec<String>, Vec<Vec<Value>>),
32+
) -> Option<(Vec<String>, Vec<Vec<Value>>)> {
33+
self.tables.insert(name, data)
34+
}
35+
}

0 commit comments

Comments
 (0)