athena_rs 3.26.1

Hyper performant polyglot Database driver
Documentation
//! Schema overview table/column nesting helpers.
//!
//! This module converts flat relation/column service rows into nested
//! `/schema` table-with-columns response rows.

use std::collections::BTreeMap;

use super::response_contracts::{SchemaColumn, SchemaTableWithColumns};
use super::service::{SchemaColumnRecord, SchemaRelationRecord};

/// Converts flat relation/column rows into nested `/schema` table-with-columns rows.
pub(super) fn build_schema_overview_tables(
    relations: Vec<SchemaRelationRecord>,
    columns: Vec<SchemaColumnRecord>,
) -> Vec<SchemaTableWithColumns> {
    let mut columns_by_table: BTreeMap<String, Vec<SchemaColumn>> = BTreeMap::new();
    for column in columns {
        columns_by_table
            .entry(column.table_name)
            .or_default()
            .push(SchemaColumn {
                column_name: column.column_name,
                data_type: column.data_type,
                column_default: column.column_default,
                is_nullable: column.is_nullable,
            });
    }

    relations
        .into_iter()
        .filter(|relation| relation.relation_type.eq_ignore_ascii_case("BASE TABLE"))
        .map(|relation| SchemaTableWithColumns {
            table_name: relation.table_name.clone(),
            columns: columns_by_table
                .remove(&relation.table_name)
                .unwrap_or_default(),
        })
        .collect()
}