uqa_sql/schema/sequences/
names.rs1use uqa_core::RelationIdentity;
9pub trait StoredSequenceRegistry {
10 fn contains_sequence(&self, relation: &RelationIdentity) -> bool;
11 fn sequence_names(&self) -> Vec<RelationIdentity>;
12}
13pub fn resolve_stored_sequence_reference(
14 catalog: &dyn StoredSequenceRegistry,
15 reference: &str,
16) -> Result<String, String> {
17 let (schema, local_name) = RelationIdentity::parse_reference(reference)
18 .map_err(|error| format!("invalid persisted sequence reference `{reference}`: {error}"))?;
19 if let Some(schema) = schema {
20 let target = RelationIdentity::new(schema, local_name);
21 if catalog.contains_sequence(&target) {
22 return Ok(target.qualified_name());
23 }
24 return Err(format!(
25 "dangling persisted sequence reference `{reference}`"
26 ));
27 }
28 let candidates = catalog
29 .sequence_names()
30 .into_iter()
31 .filter(|candidate| candidate.name == local_name)
32 .map(|candidate| candidate.qualified_name())
33 .collect::<Vec<_>>();
34 match candidates.as_slice() {
35 [target] => Ok(target.clone()),
36 [] => Err(format!(
37 "dangling persisted sequence reference `{reference}`"
38 )),
39 _ => Err(format!(
40 "ambiguous persisted sequence reference `{reference}` matches {}",
41 candidates.join(", ")
42 )),
43 }
44}