From 794ecdba0819077774ed7c858cceff6ef625f840 Mon Sep 17 00:00:00 2001 From: 1ilit Date: Tue, 19 Sep 2023 15:51:14 +0300 Subject: [PATCH] Handle issues in the diagram --- src/components/issues.jsx | 34 +++++++++++++++++++++------- src/utils/index.js | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/components/issues.jsx b/src/components/issues.jsx index e76fddf..6033e9d 100644 --- a/src/components/issues.jsx +++ b/src/components/issues.jsx @@ -1,9 +1,28 @@ -import React, { useContext } from "react"; +import React, { useContext, useState, useEffect } from "react"; import { Collapse } from "@douyinfe/semi-ui"; -import { SettingsContext } from "../pages/editor"; +import { SettingsContext, TableContext } from "../pages/editor"; +import { validateDiagram, arrayIsEqual } from "../utils"; export default function Issues() { const { settings } = useContext(SettingsContext); + const { tables, relationships } = useContext(TableContext); + const [issues, setIssues] = useState([]); + + useEffect(() => { + const findIssues = async () => { + const newIssues = validateDiagram({ + tables: tables, + relationships: relationships, + }); + + if (!arrayIsEqual(newIssues, issues)) { + setIssues(newIssues); + } + }; + + findIssues(); + }, [tables, relationships, issues]); + return ( ) : (
-
Issue 1
-
Issue 2
-
Issue 3
-
Issue 4
-
Issue 5
-
Issue 6
+ {issues.map((e, i) => ( +
+ {e} +
+ ))}
)} diff --git a/src/utils/index.js b/src/utils/index.js index c513c89..c44debc 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -111,6 +111,51 @@ function jsonToSQL(obj) { .join("\n")}`; } +function arrayIsEqual(arr1, arr2) { + return JSON.stringify(arr1) === JSON.stringify(arr2); +} + +function validateDiagram(diagram) { + const issues = []; + const duplicateTableNames = {}; + + diagram.tables.forEach((table) => { + if (duplicateTableNames[table.name]) { + issues.push(`Duplicate table name: "${table.name}"`); + } else { + duplicateTableNames[table.name] = true; + } + }); + + const visitedTables = new Set(); + + function checkCircularRelationships(tableId, visited = []) { + if (visited.includes(tableId)) { + issues.push( + `Circular relationship involving table: "${diagram.tables[tableId].name}"` + ); + return; + } + + visited.push(tableId); + visitedTables.add(tableId); + + diagram.relationships.forEach((relationship) => { + if (relationship.startTableId === tableId) { + checkCircularRelationships(relationship.endTableId, [...visited]); + } + }); + } + + diagram.tables.forEach((table) => { + if (!visitedTables.has(table.id)) { + checkCircularRelationships(table.id); + } + }); + + return issues; +} + export { enterFullscreen, exitFullscreen, @@ -118,4 +163,6 @@ export { ddbDiagramIsValid, dataURItoBlob, jsonToSQL, + validateDiagram, + arrayIsEqual, };