refactor: relationship model to column lists for compound FK (ADR-0043)

Move the FK column fields String->Vec<String> through all six
layers (AddRelationship/SqlForeignKey AST, RelationshipSchema,
metadata, project.yaml, ReadForeignKey, RelationshipEnd). Metadata
stores comma-joined lists in the existing TEXT cells; project.yaml
endpoints now columns: [a, b] (house style). Executor logic is
multi-column ready: resolve_fk_parent_columns (full-PK F-A +
auto-expand F-D), per-pair type-compat, schema_to_ddl multi-column
emission, pragma FK read grouped by id, auto-name + --create-fk
per-column, multi-column teaching echo. Single-column behaviour
preserved (one-element vecs); all 2181 tests green. The grammar to
parse multi-column input lands next.
This commit is contained in:
claude@clouddev1
2026-06-09 18:25:40 +00:00
parent b688592b4c
commit b14f0199e9
23 changed files with 721 additions and 507 deletions
+8 -8
View File
@@ -420,9 +420,9 @@ fn add_relationship_flow_shows_parent_side_with_inbound_section() {
&Command::AddRelationship {
name: None,
parent_table: "Customers".to_string(),
parent_column: "Id".to_string(),
parent_columns: vec!["Id".to_string()],
child_table: "Orders".to_string(),
child_column: "CustId".to_string(),
child_columns: vec!["CustId".to_string()],
on_delete: ReferentialAction::Cascade,
on_update: ReferentialAction::NoAction,
create_fk: false,
@@ -449,8 +449,8 @@ fn add_relationship_flow_shows_parent_side_with_inbound_section() {
inbound_relationships: vec![RelationshipEnd {
name: "Customers_Id_to_Orders_CustId".to_string(),
other_table: "Orders".to_string(),
other_column: "CustId".to_string(),
local_column: "Id".to_string(),
other_columns: vec!["CustId".to_string()],
local_columns: vec!["Id".to_string()],
on_delete: ReferentialAction::Cascade,
on_update: ReferentialAction::NoAction,
}],
@@ -462,9 +462,9 @@ fn add_relationship_flow_shows_parent_side_with_inbound_section() {
command: Command::AddRelationship {
name: None,
parent_table: "Customers".to_string(),
parent_column: "Id".to_string(),
parent_columns: vec!["Id".to_string()],
child_table: "Orders".to_string(),
child_column: "CustId".to_string(),
child_columns: vec!["CustId".to_string()],
on_delete: ReferentialAction::Cascade,
on_update: ReferentialAction::NoAction,
create_fk: false,
@@ -504,8 +504,8 @@ fn add_relationship_flow_shows_inbound_section_on_parent() {
inbound_relationships: vec![RelationshipEnd {
name: "Customers_Id_to_Orders_CustId".to_string(),
other_table: "Orders".to_string(),
other_column: "CustId".to_string(),
local_column: "Id".to_string(),
other_columns: vec!["CustId".to_string()],
local_columns: vec!["Id".to_string()],
on_delete: ReferentialAction::Cascade,
on_update: ReferentialAction::NoAction,
}],