athena_rs 3.22.1

Hyper performant polyglot Database driver
Documentation
//! Schema-constraint payload grouping helpers.
//!
//! This module owns grouping policy for sorted unique-constraint rows into
//! `/schema/constraints` payload entries.

use super::response_contracts::SchemaConstraint;
use super::service::SchemaConstraintRecord;

/// Groups sorted unique-constraint rows into `/schema/constraints` payload rows.
pub(super) fn group_schema_constraints(rows: Vec<SchemaConstraintRecord>) -> Vec<SchemaConstraint> {
    let mut constraints: Vec<SchemaConstraint> = Vec::new();
    for row in rows {
        if constraints
            .last()
            .map(|entry| entry.constraint_name != row.constraint_name)
            .unwrap_or(true)
        {
            constraints.push(SchemaConstraint {
                constraint_name: row.constraint_name.clone(),
                columns: Vec::new(),
            });
        }
        if let Some(current) = constraints.last_mut() {
            current.columns.push(row.column_name);
        }
    }
    constraints
}

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

    /// Ensures sequential rows for one constraint are grouped into one payload entry.
    #[test]
    fn constraints_group_rows_by_constraint_name() {
        let rows = vec![
            SchemaConstraintRecord {
                constraint_name: "users_email_key".to_string(),
                column_name: "email".to_string(),
            },
            SchemaConstraintRecord {
                constraint_name: "users_org_email_key".to_string(),
                column_name: "organization_id".to_string(),
            },
            SchemaConstraintRecord {
                constraint_name: "users_org_email_key".to_string(),
                column_name: "email".to_string(),
            },
        ];

        let grouped = group_schema_constraints(rows);
        assert_eq!(grouped.len(), 2);
        assert_eq!(grouped[0].constraint_name, "users_email_key");
        assert_eq!(grouped[0].columns, vec!["email"]);
        assert_eq!(grouped[1].constraint_name, "users_org_email_key");
        assert_eq!(grouped[1].columns, vec!["organization_id", "email"]);
    }
}