athena_rs 3.23.0

Hyper performant polyglot Database driver
Documentation
//! Missing-column delta policy for `/debug/schema`.
//!
//! This module owns collecting expected columns that are absent from observed
//! columns while preserving deterministic expected-column input order.

use std::collections::BTreeSet;

/// Collects expected columns that are missing from observed schema state.
pub(super) fn collect_missing_columns(
    expected_columns: &[String],
    observed_set: &BTreeSet<String>,
) -> Vec<String> {
    expected_columns
        .iter()
        .filter(|column| !observed_set.contains((*column).as_str()))
        .cloned()
        .collect()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    /// Preserves expected-column order when reporting missing columns.
    fn collect_missing_columns_preserves_expected_order() {
        let expected = vec![
            "request_id".to_string(),
            "route_path".to_string(),
            "status_code".to_string(),
        ];
        let observed_set: BTreeSet<String> = ["request_id".to_string(), "status_code".to_string()]
            .into_iter()
            .collect();

        let missing = collect_missing_columns(&expected, &observed_set);

        assert_eq!(missing, vec!["route_path".to_string()]);
    }

    #[test]
    /// Treats duplicate expected values as present when observed set contains key.
    fn collect_missing_columns_treats_duplicate_expected_values_as_present() {
        let expected = vec![
            "request_id".to_string(),
            "request_id".to_string(),
            "status_code".to_string(),
        ];
        let observed_set: BTreeSet<String> = ["request_id".to_string(), "status_code".to_string()]
            .into_iter()
            .collect();

        let missing = collect_missing_columns(&expected, &observed_set);

        assert!(missing.is_empty());
    }
}