Skip to content

Commit 9e0a2b4

Browse files
authored
Move variables_table to Env (#262)
### What Since the table reference that binds the variables table cannot change in the course of query translation we move this to `Env` instead of `State`.
1 parent 3765c1a commit 9e0a2b4

File tree

5 files changed

+26
-20
lines changed

5 files changed

+26
-20
lines changed

crates/query-engine/translation/src/translation/helpers.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ pub struct Env<'a> {
1414
metadata: &'a metadata::Metadata,
1515
relationships: BTreeMap<String, models::Relationship>,
1616
mutations_version: &'a Option<metadata::mutations::MutationsVersion>,
17+
variables_table: Option<sql::ast::TableReference>,
1718
}
1819

1920
#[derive(Debug)]
2021
/// Stateful information changed throughout the translation process.
2122
pub struct State {
2223
native_queries: NativeQueries,
2324
global_table_index: TableAliasIndex,
24-
variables_table: Option<sql::ast::TableReference>,
2525
}
2626

2727
#[derive(Debug)]
@@ -94,11 +94,13 @@ impl<'a> Env<'a> {
9494
metadata: &'a metadata::Metadata,
9595
relationships: BTreeMap<String, models::Relationship>,
9696
mutations_version: &'a Option<metadata::mutations::MutationsVersion>,
97+
variables_table: Option<sql::ast::TableReference>,
9798
) -> Env<'a> {
9899
Env {
99100
metadata,
100101
relationships,
101102
mutations_version,
103+
variables_table,
102104
}
103105
}
104106
/// Lookup a collection's information in the metadata.
@@ -182,6 +184,15 @@ impl<'a> Env<'a> {
182184
type_name: scalar_type.clone(),
183185
})
184186
}
187+
188+
/// Try to get the variables table reference. This will fail if no variables were passed
189+
/// as part of the query request.
190+
pub fn get_variables_table(&self) -> Result<sql::ast::TableReference, Error> {
191+
match &self.variables_table {
192+
None => Err(Error::UnexpectedVariable),
193+
Some(t) => Ok(t.clone()),
194+
}
195+
}
185196
}
186197

187198
impl CollectionInfo {
@@ -219,7 +230,6 @@ impl Default for State {
219230
State {
220231
native_queries: NativeQueries::new(),
221232
global_table_index: TableAliasIndex(0),
222-
variables_table: None,
223233
}
224234
}
225235
}
@@ -242,7 +252,6 @@ impl State {
242252
let variables_table_alias = self.make_table_alias("%variables_table".to_string());
243253
let table_reference =
244254
sql::ast::TableReference::AliasedTable(variables_table_alias.clone());
245-
self.variables_table = Some(table_reference.clone());
246255
Some((
247256
sql::helpers::from_variables(variables_table_alias),
248257
table_reference,
@@ -251,15 +260,6 @@ impl State {
251260
}
252261
}
253262

254-
/// Try to get the variables table reference. This will fail if no variables were passed
255-
/// as part of the query request.
256-
pub fn get_variables_table(&self) -> Result<sql::ast::TableReference, Error> {
257-
match &self.variables_table {
258-
None => Err(Error::UnexpectedVariable),
259-
Some(t) => Ok(t.clone()),
260-
}
261-
}
262-
263263
/// Introduce a new native query to the generated sql.
264264
pub fn insert_native_query(
265265
&mut self,

crates/query-engine/translation/src/translation/mutation/translate.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub fn translate(
1919
collection_relationships: BTreeMap<String, models::Relationship>,
2020
mutations_version: &Option<metadata::mutations::MutationsVersion>,
2121
) -> Result<sql::execution_plan::Mutation, Error> {
22-
let env = Env::new(metadata, collection_relationships, mutations_version);
22+
let env = Env::new(metadata, collection_relationships, mutations_version, None);
2323

2424
match operation {
2525
models::MutationOperation::Procedure {
@@ -237,7 +237,7 @@ fn translate_native_query(
237237

238238
// add the procedure native query definition is a with clause.
239239
select.with = sql::ast::With {
240-
common_table_expressions: crate::translation::query::native_queries::translate(state)?,
240+
common_table_expressions: crate::translation::query::native_queries::translate(env, state)?,
241241
};
242242

243243
// normalize ast

crates/query-engine/translation/src/translation/query/filtering.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ fn translate_comparison_value(
380380
)),
381381
models::ComparisonValue::Variable { name: var } => Ok((
382382
values::translate_variable(
383-
state.get_variables_table()?,
383+
env.get_variables_table()?,
384384
var.clone(),
385385
&database::Type::ScalarType(typ.clone()),
386386
),

crates/query-engine/translation/src/translation/query/mod.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,15 @@ pub fn translate(
2121
isolation_level: sql::ast::transaction::IsolationLevel,
2222
query_request: models::QueryRequest,
2323
) -> Result<sql::execution_plan::ExecutionPlan<sql::execution_plan::Query>, Error> {
24-
let env = Env::new(metadata, query_request.collection_relationships, &None);
2524
let mut state = State::new();
2625
let variables_from = state.make_variables_table(&query_request.variables);
26+
let variables_table_ref = variables_from.clone().map(|(_, table_ref)| table_ref);
27+
let env = Env::new(
28+
metadata,
29+
query_request.collection_relationships,
30+
&None,
31+
variables_table_ref,
32+
);
2733
let (current_table, from_clause) = root::make_from_clause_and_reference(
2834
&query_request.collection,
2935
&query_request.arguments,
@@ -59,7 +65,7 @@ pub fn translate(
5965
state.make_table_alias("universe_agg".to_string()),
6066
// native queries if there are any
6167
sql::ast::With {
62-
common_table_expressions: native_queries::translate(state)?,
68+
common_table_expressions: native_queries::translate(&env, state)?,
6369
},
6470
select_set,
6571
);

crates/query-engine/translation/src/translation/query/native_queries.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ use ndc_sdk::models;
44

55
use super::values;
66
use crate::translation::error::Error;
7-
use crate::translation::helpers::State;
7+
use crate::translation::helpers::{Env, State};
88
use query_engine_metadata::metadata;
99
use query_engine_sql::sql;
1010

1111
/// Translate native queries collected in State by the translation proccess into CTEs.
12-
pub fn translate(state: State) -> Result<Vec<sql::ast::CommonTableExpression>, Error> {
12+
pub fn translate(env: &Env, state: State) -> Result<Vec<sql::ast::CommonTableExpression>, Error> {
1313
let mut ctes = vec![];
14-
let variables_table = state.get_variables_table();
14+
let variables_table = env.get_variables_table();
1515
let native_queries = state.get_native_queries();
1616

1717
// for each found table expression

0 commit comments

Comments
 (0)