diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index 8f6193f96..6c89ea66d 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -369,4 +369,94 @@ ORDER ||--|{ LINE-ITEM : contains ); }); }); + + describe('Aggregation Relationships', () => { + it('should render basic aggregation relationships', () => { + imgSnapshotTest( + ` + erDiagram + DEPARTMENT <> EMPLOYEE : contains + PROJECT <>.. TASK : manages + TEAM <> MEMBER : consists_of + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with entity attributes', () => { + imgSnapshotTest( + ` + erDiagram + DEPARTMENT <> EMPLOYEE : contains + DEPARTMENT { + int id PK + string name + string location + } + EMPLOYEE { + int id PK + string name + int department_id FK + } + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with quoted labels', () => { + imgSnapshotTest( + ` + erDiagram + UNIVERSITY <> COLLEGE : "has multiple" + COLLEGE <> DEPARTMENT : "contains" + DEPARTMENT <> FACULTY : "employs" + `, + { logLevel: 1 } + ); + }); + + it('should render mixed relationship types', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ ORDER_ITEM : contains + PRODUCT <> ORDER_ITEM : "aggregated in" + WAREHOUSE <>.. PRODUCT : "stores" + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with entity aliases', () => { + imgSnapshotTest( + ` + erDiagram + d[DEPARTMENT] + e[EMPLOYEE] + p[PROJECT] + t[TASK] + + d <> e : contains + p <>.. t : manages + + `, + { logLevel: 1 } + ); + }); + + it('should render complex aggregation scenarios', () => { + imgSnapshotTest( + ` + erDiagram + COMPANY <> DEPARTMENT : owns + DEPARTMENT <> EMPLOYEE : contains + EMPLOYEE <> PROJECT : works_on + PROJECT <> TASK : consists_of + TASK <> SUBTASK : includes + `, + { logLevel: 1 } + ); + }); + }); }); diff --git a/demos/er.html b/demos/er.html index b6c503c2e..74aae1b89 100644 --- a/demos/er.html +++ b/demos/er.html @@ -169,6 +169,164 @@
+ +

Aggregation Examples

+ +

Basic Aggregation (Solid Line)

+
+    erDiagram
+      DEPARTMENT <> EMPLOYEE : contains
+      DEPARTMENT {
+          int id PK
+          string name
+          string location
+      }
+      EMPLOYEE {
+          int id PK
+          string name
+          int department_id FK
+      }
+    
+
+ +

Dashed Aggregation

+
+    erDiagram
+      PROJECT <>.. TASK : manages
+      PROJECT {
+          int id PK
+          string name
+          string description
+      }
+      TASK {
+          int id PK
+          string title
+          int project_id FK
+      }
+    
+
+ +

Aggregation with Different Cardinalities

+
+    erDiagram
+      COMPANY <> DEPARTMENT : owns
+      DEPARTMENT <> EMPLOYEE : contains
+      EMPLOYEE <> PROJECT : works_on
+      PROJECT <> TASK : consists_of
+      
+      COMPANY {
+          int id PK
+          string name
+      }
+      DEPARTMENT {
+          int id PK
+          string name
+          int company_id FK
+      }
+      EMPLOYEE {
+          int id PK
+          string name
+          int department_id FK
+      }
+      PROJECT {
+          int id PK
+          string name
+          int employee_id FK
+      }
+      TASK {
+          int id PK
+          string title
+          int project_id FK
+      }
+    
+
+ +

Two-way Aggregation

+
+    erDiagram
+      TEAM <> MEMBER : consists_of
+      TEAM {
+          int id PK
+          string name
+      }
+      MEMBER {
+          int id PK
+          string name
+          int team_id FK
+      }
+    
+
+ +

Complex Aggregation with Labels

+
+    erDiagram
+      UNIVERSITY <> COLLEGE : "has multiple"
+      COLLEGE <> DEPARTMENT : "contains"
+      DEPARTMENT <> FACULTY : "employs"
+      FACULTY <> STUDENT : "teaches"
+      
+      UNIVERSITY {
+          int id PK
+          string name
+      }
+      COLLEGE {
+          int id PK
+          string name
+          int university_id FK
+      }
+      DEPARTMENT {
+          int id PK
+          string name
+          int college_id FK
+      }
+      FACULTY {
+          int id PK
+          string name
+          int department_id FK
+      }
+      STUDENT {
+          int id PK
+          string name
+          int faculty_id FK
+      }
+    
+
+ +

Mixed Relationship Types

+
+    erDiagram
+      CUSTOMER ||--o{ ORDER : places
+      ORDER ||--|{ ORDER_ITEM : contains
+      PRODUCT <> ORDER_ITEM : "aggregated in"
+      WAREHOUSE <>.. PRODUCT : "stores"
+      
+      CUSTOMER {
+          int id PK
+          string name
+      }
+      ORDER {
+          int id PK
+          int customer_id FK
+          date order_date
+      }
+      ORDER_ITEM {
+          int id PK
+          int order_id FK
+          int product_id FK
+          int quantity
+      }
+      PRODUCT {
+          int id PK
+          string name
+          int warehouse_id FK
+      }
+      WAREHOUSE {
+          int id PK
+          string name
+      }
+    
+
+