Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
- Added `defaultProtocol` configuration option as fallback if no config is provided.
### Changed
- set `odata` as the service protocol if no protocol is set to match the default behavior of `@sap/cds`. Provide `cds.env.openapi.defaultProtocol = "rest"` to restore old behavior.
- ER diagrams are now rendered using the yuml.me v1 API (`app.yuml.me`), avoiding the 'please migrate' image. The diagram and legend are displayed as clickable SVG images.
### Deprecated
### Removed
### Fixed
Expand Down
29 changes: 16 additions & 13 deletions lib/compile/diagram.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,28 @@ class Diagram {
Object.keys(entityContainer).filter(name => isIdentifier(name)).reverse().forEach(name => {
const resource = entityContainer[name];
if (resource.$Type) {
diagram += `${this.#comma}[${name}%20${this.#color.resource}]` // additional space in case entity set and type have same name
diagram += `${this.#comma}[${name}\u200C${this.#color.resource}]` // U+200C (ZWNJ) disambiguates entity set node from same-named entity type node
+ `++-${cardinality(resource)}>[${nameParts(resource.$Type).name}]`;
} else if (resource.$Action) {
diagram += `${this.#comma}[${name}${this.#color.resource}]`;
const overload = this.#meta.modelElement(resource.$Action).find(pOverload => !pOverload.$IsBound);
diagram += this.#overloadDiagram(name, overload);
} else if (resource.$Function) {
diagram += `${this.#comma}[${name}${this.#color.resource}]`;
const overloads = this.#meta.modelElement(resource.$Function);
if (overloads) {
const unbound = overloads.filter(overload => !overload.$IsBound);
// TODO: loop over all overloads, add new source box after first arrow
diagram += this.#overloadDiagram(name, unbound[0]);
}
diagram += `${this.#comma}[${name}${this.#color.resource}]`;
const overload = this.#meta.modelElement(resource.$Action).find(pOverload => !pOverload.$IsBound);
diagram += this.#overloadDiagram(name, overload);
} else if (resource.$Function) {
diagram += `${this.#comma}[${name}${this.#color.resource}]`;
const overloads = this.#meta.modelElement(resource.$Function);
if (overloads) {
const unbound = overloads.filter(overload => !overload.$IsBound);
// TODO: loop over all overloads, add new source box after first arrow
diagram += this.#overloadDiagram(name, unbound[0]);
}
}
});

if (diagram != '') {
diagram = `\n\n## Entity Data Model\n![ER Diagram](https://yuml.me/diagram/class/${diagram})\n\n### Legend\n![Legend](https://yuml.me/diagram/plain;dir:TB;scale:60/class/[External.Type${this.#color.external}],[ComplexType${this.#color.complexType}],[EntityType${this.#color.entityType}],[EntitySet/Singleton/Operation${this.#color.resource}])`;
const legendDsl = `@direction LR\n[External.Type${this.#color.external}]-[ComplexType${this.#color.complexType}]-[EntityType${this.#color.entityType}]-[EntitySet/Singleton/Operation${this.#color.resource}]`;
const erUrl = `https://app.yuml.me/diagram/v1/class/plain/${encodeURIComponent(diagram)}.svg`;
const legendUrl = `https://app.yuml.me/diagram/v1/class/plain/${encodeURIComponent(legendDsl)}.svg`;
diagram = `\n\n### Entity Data Model\n[![ER Diagram](${erUrl})](${erUrl})\n\n#### Legend\n<a href="${legendUrl}"><img src="${legendUrl}" width="450"></a>`;
}

return diagram;
Expand Down
8 changes: 4 additions & 4 deletions test/lib/compile/csdl2openapi.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2404,11 +2404,11 @@ see [Expand](http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-prot
[
"Use the Core.LongDescription or Core.Description annotation on your CDS service to provide a meaningful description.",
"",
"## Entity Data Model",
"![ER Diagram](https://yuml.me/diagram/class/[root{bg:lightslategray}],[root]->[other],[other{bg:lightslategray}],[act{bg:lawngreen}]->[root],[act{bg:lawngreen}]in->[root],[others%20{bg:lawngreen}]++-*>[other],[roots%20{bg:lawngreen}]++-*>[root])",
"### Entity Data Model",
"[![ER Diagram](https://app.yuml.me/diagram/v1/class/plain/%5Broot%7Bbg%3Alightslategray%7D%5D%2C%5Broot%5D-%3E%5Bother%5D%2C%5Bother%7Bbg%3Alightslategray%7D%5D%2C%5Bact%7Bbg%3Alawngreen%7D%5D-%3E%5Broot%5D%2C%5Bact%7Bbg%3Alawngreen%7D%5Din-%3E%5Broot%5D%2C%5Bothers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5Bother%5D%2C%5Broots%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5Broot%5D.svg)](https://app.yuml.me/diagram/v1/class/plain/%5Broot%7Bbg%3Alightslategray%7D%5D%2C%5Broot%5D-%3E%5Bother%5D%2C%5Bother%7Bbg%3Alightslategray%7D%5D%2C%5Bact%7Bbg%3Alawngreen%7D%5D-%3E%5Broot%5D%2C%5Bact%7Bbg%3Alawngreen%7D%5Din-%3E%5Broot%5D%2C%5Bothers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5Bother%5D%2C%5Broots%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5Broot%5D.svg)",
"",
"### Legend",
"![Legend](https://yuml.me/diagram/plain;dir:TB;scale:60/class/[External.Type{bg:whitesmoke}],[ComplexType],[EntityType{bg:lightslategray}],[EntitySet/Singleton/Operation{bg:lawngreen}])",
"#### Legend",
"<a href=\"https://app.yuml.me/diagram/v1/class/plain/%40direction%20LR%0A%5BExternal.Type%7Bbg%3Awhitesmoke%7D%5D-%5BComplexType%5D-%5BEntityType%7Bbg%3Alightslategray%7D%5D-%5BEntitySet%2FSingleton%2FOperation%7Bbg%3Alawngreen%7D%5D.svg\"><img src=\"https://app.yuml.me/diagram/v1/class/plain/%40direction%20LR%0A%5BExternal.Type%7Bbg%3Awhitesmoke%7D%5D-%5BComplexType%5D-%5BEntityType%7Bbg%3Alightslategray%7D%5D-%5BEntitySet%2FSingleton%2FOperation%7Bbg%3Alawngreen%7D%5D.svg\" width=\"450\"></a>",
],
"diagram"
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"openapi": "3.0.2",
"info": {
"title": "Use the title annotation on your CDS service to provide a meaningful title.",
"description": "Use the Core.LongDescription or Core.Description annotation on your CDS service to provide a meaningful description.\n\n## Entity Data Model\n![ER Diagram](https://yuml.me/diagram/class/[Category{bg:lightslategray}],[CustomerDemographic{bg:lightslategray}],[Customer{bg:lightslategray}],[Customer]*-*[CustomerDemographic],[Employee{bg:lightslategray}],[Employee]*-0..1[Employee],[Order_Detail{bg:lightslategray}],[Order_Detail]*-[Order],[Order{bg:lightslategray}],[Order]*-0..1[Customer],[Order]*-0..1[Employee],[Product{bg:lightslategray}],[Product]*-0..1[Category],[Product]-*[Order_Detail],[Region{bg:lightslategray}],[Shipper{bg:lightslategray}],[Shipper]0..1-*[Order],[Supplier{bg:lightslategray}],[Supplier]0..1-*[Product],[Territory{bg:lightslategray}],[Territory]*-[Region],[Territory]*-*[Employee],[Alphabetical_list_of_product{bg:lightslategray}],[Category_Sales_for_1997{bg:lightslategray}],[Current_Product_List{bg:lightslategray}],[Customer_and_Suppliers_by_City{bg:lightslategray}],[Invoice{bg:lightslategray}],[Order_Details_Extended{bg:lightslategray}],[Order_Subtotal{bg:lightslategray}],[Orders_Qry{bg:lightslategray}],[Product_Sales_for_1997{bg:lightslategray}],[Products_Above_Average_Price{bg:lightslategray}],[Products_by_Category{bg:lightslategray}],[Sales_by_Category{bg:lightslategray}],[Sales_Totals_by_Amount{bg:lightslategray}],[Summary_of_Sales_by_Quarter{bg:lightslategray}],[Summary_of_Sales_by_Year{bg:lightslategray}],[Summary_of_Sales_by_Years%20{bg:lawngreen}]++-*>[Summary_of_Sales_by_Year],[Summary_of_Sales_by_Quarters%20{bg:lawngreen}]++-*>[Summary_of_Sales_by_Quarter],[Sales_Totals_by_Amounts%20{bg:lawngreen}]++-*>[Sales_Totals_by_Amount],[Sales_by_Categories%20{bg:lawngreen}]++-*>[Sales_by_Category],[Products_by_Categories%20{bg:lawngreen}]++-*>[Products_by_Category],[Products_Above_Average_Prices%20{bg:lawngreen}]++-*>[Products_Above_Average_Price],[Product_Sales_for_1997%20{bg:lawngreen}]++-*>[Product_Sales_for_1997],[Orders_Qries%20{bg:lawngreen}]++-*>[Orders_Qry],[Order_Subtotals%20{bg:lawngreen}]++-*>[Order_Subtotal],[Order_Details_Extendeds%20{bg:lawngreen}]++-*>[Order_Details_Extended],[Invoices%20{bg:lawngreen}]++-*>[Invoice],[Customer_and_Suppliers_by_Cities%20{bg:lawngreen}]++-*>[Customer_and_Suppliers_by_City],[Current_Product_Lists%20{bg:lawngreen}]++-*>[Current_Product_List],[Category_Sales_for_1997%20{bg:lawngreen}]++-*>[Category_Sales_for_1997],[Alphabetical_list_of_products%20{bg:lawngreen}]++-*>[Alphabetical_list_of_product],[Territories%20{bg:lawngreen}]++-*>[Territory],[Suppliers%20{bg:lawngreen}]++-*>[Supplier],[Shippers%20{bg:lawngreen}]++-*>[Shipper],[Regions%20{bg:lawngreen}]++-*>[Region],[Products%20{bg:lawngreen}]++-*>[Product],[Orders%20{bg:lawngreen}]++-*>[Order],[Order_Details%20{bg:lawngreen}]++-*>[Order_Detail],[Employees%20{bg:lawngreen}]++-*>[Employee],[Customers%20{bg:lawngreen}]++-*>[Customer],[CustomerDemographics%20{bg:lawngreen}]++-*>[CustomerDemographic],[Categories%20{bg:lawngreen}]++-*>[Category])\n\n### Legend\n![Legend](https://yuml.me/diagram/plain;dir:TB;scale:60/class/[External.Type{bg:whitesmoke}],[ComplexType],[EntityType{bg:lightslategray}],[EntitySet/Singleton/Operation{bg:lawngreen}])",
"description": "Use the Core.LongDescription or Core.Description annotation on your CDS service to provide a meaningful description.\n\n### Entity Data Model\n[![ER Diagram](https://app.yuml.me/diagram/v1/class/plain/%5BCategory%7Bbg%3Alightslategray%7D%5D%2C%5BCustomerDemographic%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer%5D*-*%5BCustomerDemographic%5D%2C%5BEmployee%7Bbg%3Alightslategray%7D%5D%2C%5BEmployee%5D*-0..1%5BEmployee%5D%2C%5BOrder_Detail%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Detail%5D*-%5BOrder%5D%2C%5BOrder%7Bbg%3Alightslategray%7D%5D%2C%5BOrder%5D*-0..1%5BCustomer%5D%2C%5BOrder%5D*-0..1%5BEmployee%5D%2C%5BProduct%7Bbg%3Alightslategray%7D%5D%2C%5BProduct%5D*-0..1%5BCategory%5D%2C%5BProduct%5D-*%5BOrder_Detail%5D%2C%5BRegion%7Bbg%3Alightslategray%7D%5D%2C%5BShipper%7Bbg%3Alightslategray%7D%5D%2C%5BShipper%5D0..1-*%5BOrder%5D%2C%5BSupplier%7Bbg%3Alightslategray%7D%5D%2C%5BSupplier%5D0..1-*%5BProduct%5D%2C%5BTerritory%7Bbg%3Alightslategray%7D%5D%2C%5BTerritory%5D*-%5BRegion%5D%2C%5BTerritory%5D*-*%5BEmployee%5D%2C%5BAlphabetical_list_of_product%7Bbg%3Alightslategray%7D%5D%2C%5BCategory_Sales_for_1997%7Bbg%3Alightslategray%7D%5D%2C%5BCurrent_Product_List%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer_and_Suppliers_by_City%7Bbg%3Alightslategray%7D%5D%2C%5BInvoice%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Details_Extended%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Subtotal%7Bbg%3Alightslategray%7D%5D%2C%5BOrders_Qry%7Bbg%3Alightslategray%7D%5D%2C%5BProduct_Sales_for_1997%7Bbg%3Alightslategray%7D%5D%2C%5BProducts_Above_Average_Price%7Bbg%3Alightslategray%7D%5D%2C%5BProducts_by_Category%7Bbg%3Alightslategray%7D%5D%2C%5BSales_by_Category%7Bbg%3Alightslategray%7D%5D%2C%5BSales_Totals_by_Amount%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Quarter%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Year%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Years%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSummary_of_Sales_by_Year%5D%2C%5BSummary_of_Sales_by_Quarters%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSummary_of_Sales_by_Quarter%5D%2C%5BSales_Totals_by_Amounts%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSales_Totals_by_Amount%5D%2C%5BSales_by_Categories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSales_by_Category%5D%2C%5BProducts_by_Categories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProducts_by_Category%5D%2C%5BProducts_Above_Average_Prices%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProducts_Above_Average_Price%5D%2C%5BProduct_Sales_for_1997%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProduct_Sales_for_1997%5D%2C%5BOrders_Qries%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrders_Qry%5D%2C%5BOrder_Subtotals%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Subtotal%5D%2C%5BOrder_Details_Extendeds%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Details_Extended%5D%2C%5BInvoices%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BInvoice%5D%2C%5BCustomer_and_Suppliers_by_Cities%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomer_and_Suppliers_by_City%5D%2C%5BCurrent_Product_Lists%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCurrent_Product_List%5D%2C%5BCategory_Sales_for_1997%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCategory_Sales_for_1997%5D%2C%5BAlphabetical_list_of_products%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BAlphabetical_list_of_product%5D%2C%5BTerritories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BTerritory%5D%2C%5BSuppliers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSupplier%5D%2C%5BShippers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BShipper%5D%2C%5BRegions%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BRegion%5D%2C%5BProducts%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProduct%5D%2C%5BOrders%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder%5D%2C%5BOrder_Details%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Detail%5D%2C%5BEmployees%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BEmployee%5D%2C%5BCustomers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomer%5D%2C%5BCustomerDemographics%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomerDemographic%5D%2C%5BCategories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCategory%5D.svg)](https://app.yuml.me/diagram/v1/class/plain/%5BCategory%7Bbg%3Alightslategray%7D%5D%2C%5BCustomerDemographic%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer%5D*-*%5BCustomerDemographic%5D%2C%5BEmployee%7Bbg%3Alightslategray%7D%5D%2C%5BEmployee%5D*-0..1%5BEmployee%5D%2C%5BOrder_Detail%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Detail%5D*-%5BOrder%5D%2C%5BOrder%7Bbg%3Alightslategray%7D%5D%2C%5BOrder%5D*-0..1%5BCustomer%5D%2C%5BOrder%5D*-0..1%5BEmployee%5D%2C%5BProduct%7Bbg%3Alightslategray%7D%5D%2C%5BProduct%5D*-0..1%5BCategory%5D%2C%5BProduct%5D-*%5BOrder_Detail%5D%2C%5BRegion%7Bbg%3Alightslategray%7D%5D%2C%5BShipper%7Bbg%3Alightslategray%7D%5D%2C%5BShipper%5D0..1-*%5BOrder%5D%2C%5BSupplier%7Bbg%3Alightslategray%7D%5D%2C%5BSupplier%5D0..1-*%5BProduct%5D%2C%5BTerritory%7Bbg%3Alightslategray%7D%5D%2C%5BTerritory%5D*-%5BRegion%5D%2C%5BTerritory%5D*-*%5BEmployee%5D%2C%5BAlphabetical_list_of_product%7Bbg%3Alightslategray%7D%5D%2C%5BCategory_Sales_for_1997%7Bbg%3Alightslategray%7D%5D%2C%5BCurrent_Product_List%7Bbg%3Alightslategray%7D%5D%2C%5BCustomer_and_Suppliers_by_City%7Bbg%3Alightslategray%7D%5D%2C%5BInvoice%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Details_Extended%7Bbg%3Alightslategray%7D%5D%2C%5BOrder_Subtotal%7Bbg%3Alightslategray%7D%5D%2C%5BOrders_Qry%7Bbg%3Alightslategray%7D%5D%2C%5BProduct_Sales_for_1997%7Bbg%3Alightslategray%7D%5D%2C%5BProducts_Above_Average_Price%7Bbg%3Alightslategray%7D%5D%2C%5BProducts_by_Category%7Bbg%3Alightslategray%7D%5D%2C%5BSales_by_Category%7Bbg%3Alightslategray%7D%5D%2C%5BSales_Totals_by_Amount%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Quarter%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Year%7Bbg%3Alightslategray%7D%5D%2C%5BSummary_of_Sales_by_Years%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSummary_of_Sales_by_Year%5D%2C%5BSummary_of_Sales_by_Quarters%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSummary_of_Sales_by_Quarter%5D%2C%5BSales_Totals_by_Amounts%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSales_Totals_by_Amount%5D%2C%5BSales_by_Categories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSales_by_Category%5D%2C%5BProducts_by_Categories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProducts_by_Category%5D%2C%5BProducts_Above_Average_Prices%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProducts_Above_Average_Price%5D%2C%5BProduct_Sales_for_1997%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProduct_Sales_for_1997%5D%2C%5BOrders_Qries%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrders_Qry%5D%2C%5BOrder_Subtotals%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Subtotal%5D%2C%5BOrder_Details_Extendeds%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Details_Extended%5D%2C%5BInvoices%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BInvoice%5D%2C%5BCustomer_and_Suppliers_by_Cities%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomer_and_Suppliers_by_City%5D%2C%5BCurrent_Product_Lists%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCurrent_Product_List%5D%2C%5BCategory_Sales_for_1997%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCategory_Sales_for_1997%5D%2C%5BAlphabetical_list_of_products%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BAlphabetical_list_of_product%5D%2C%5BTerritories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BTerritory%5D%2C%5BSuppliers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BSupplier%5D%2C%5BShippers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BShipper%5D%2C%5BRegions%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BRegion%5D%2C%5BProducts%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BProduct%5D%2C%5BOrders%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder%5D%2C%5BOrder_Details%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BOrder_Detail%5D%2C%5BEmployees%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BEmployee%5D%2C%5BCustomers%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomer%5D%2C%5BCustomerDemographics%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCustomerDemographic%5D%2C%5BCategories%E2%80%8C%7Bbg%3Alawngreen%7D%5D%2B%2B-*%3E%5BCategory%5D.svg)\n\n#### Legend\n<a href=\"https://app.yuml.me/diagram/v1/class/plain/%40direction%20LR%0A%5BExternal.Type%7Bbg%3Awhitesmoke%7D%5D-%5BComplexType%5D-%5BEntityType%7Bbg%3Alightslategray%7D%5D-%5BEntitySet%2FSingleton%2FOperation%7Bbg%3Alawngreen%7D%5D.svg\"><img src=\"https://app.yuml.me/diagram/v1/class/plain/%40direction%20LR%0A%5BExternal.Type%7Bbg%3Awhitesmoke%7D%5D-%5BComplexType%5D-%5BEntityType%7Bbg%3Alightslategray%7D%5D-%5BEntitySet%2FSingleton%2FOperation%7Bbg%3Alawngreen%7D%5D.svg\" width=\"450\"></a>",
"version": ""
},
"x-sap-api-type": "ODATAV4",
Expand Down
Loading
Loading