use super::response_contracts::SchemaConstraint;
use super::service::SchemaConstraintRecord;
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::*;
#[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"]);
}
}