uqa_sql/catalog/index/
stored.rs1use super::IndexDefinition;
9use crate::{
10 ast::{CreateIndex, IndexKey},
11 schema::dependencies::schema_expr_references_column,
12};
13
14pub fn declaration(
16 row: &uqa_core::catalog_index::CatalogIndexRow,
17) -> Result<CreateIndex, serde_json::Error> {
18 let definition = index_definition(row.definition_json.as_deref())?;
19 let options: std::collections::BTreeMap<String, String> =
20 serde_json::from_str(&row.parameters_json)?;
21 Ok(CreateIndex {
22 name: Some(row.relation.name.clone()),
23 table: row.table_name.clone(),
24 access_method: row.index_type.clone(),
25 columns: serde_json::from_str(&row.columns_json)?,
26 included_columns: definition.included_columns,
27 column_order: definition.column_order,
28 predicate: definition.predicate,
29 unique: definition.unique,
30 nulls_not_distinct: definition.nulls_not_distinct,
31 if_not_exists: false,
32 options: options.into_iter().collect(),
33 option_namespaces: Vec::new(),
34 })
35}
36pub fn index_definition(definition: Option<&str>) -> Result<IndexDefinition, serde_json::Error> {
37 definition.map_or_else(|| Ok(IndexDefinition::default()), serde_json::from_str)
38}
39pub fn references_column(
40 keys: &str,
41 definition: Option<&str>,
42 column: &str,
43) -> Result<bool, serde_json::Error> {
44 let keys: Vec<IndexKey> = serde_json::from_str(keys)?;
45 Ok(keys
46 .iter()
47 .any(|key| schema_expr_references_column(&key.expression(), column))
48 || index_definition(definition)?
49 .included_columns
50 .iter()
51 .any(|name| name == column)
52 || index_definition(definition)?
53 .predicate
54 .as_deref()
55 .is_some_and(|expression| schema_expr_references_column(expression, column)))
56}