uqa_sql/catalog/stored_view/
references.rs1use super::StoredView;
9use crate::binding::view_dependencies::bind_query_plan_relations;
10use std::collections::BTreeMap;
11use uqa_core::RelationIdentity;
12
13pub fn rewritten_relation_references(
14 views: &BTreeMap<RelationIdentity, StoredView>,
15 replacements: &BTreeMap<RelationIdentity, RelationIdentity>,
16) -> Result<Vec<(RelationIdentity, StoredView)>, String> {
17 let mut updates = Vec::new();
18 for (view_relation, stored) in views {
19 let mut candidate = stored.clone();
20 let mut changed = false;
21 bind_query_plan_relations(
22 &mut candidate.query,
23 &std::collections::BTreeSet::new(),
24 &mut |reference| -> Result<String, String> {
25 let identity = RelationIdentity::from_legacy_name(reference)?;
26 if let Some(replacement) = replacements.get(&identity) {
27 changed = true;
28 Ok(replacement.qualified_name())
29 } else {
30 Ok(reference.to_string())
31 }
32 },
33 )?;
34 if changed {
35 updates.push((view_relation.clone(), candidate));
36 }
37 }
38 Ok(updates)
39}