Skip to main content

uqa_sql/catalog/stored_view/
references.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Rewrite bound relation identities while preserving each stored view's public metadata.
8use 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}