Skip to main content

uqa_sql/catalog/index/
stored.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Decode stored index metadata and inspect column references in key, included-column, then predicate order.
8use super::IndexDefinition;
9use crate::{ast::IndexKey, schema::dependencies::schema_expr_references_column};
10pub fn index_definition(definition: Option<&str>) -> Result<IndexDefinition, serde_json::Error> {
11    definition.map_or_else(|| Ok(IndexDefinition::default()), serde_json::from_str)
12}
13pub fn references_column(
14    keys: &str,
15    definition: Option<&str>,
16    column: &str,
17) -> Result<bool, serde_json::Error> {
18    let keys: Vec<IndexKey> = serde_json::from_str(keys)?;
19    Ok(keys
20        .iter()
21        .any(|key| schema_expr_references_column(&key.expression(), column))
22        || index_definition(definition)?
23            .included_columns
24            .iter()
25            .any(|name| name == column)
26        || index_definition(definition)?
27            .predicate
28            .as_deref()
29            .is_some_and(|expression| schema_expr_references_column(expression, column)))
30}