From d0ea99d294134a3f9134d112542a784ef5d840f7 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sat, 1 Mar 2025 22:14:16 +0400 Subject: [PATCH] Parse relationships --- src/utils/importFrom/dbml.js | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/utils/importFrom/dbml.js b/src/utils/importFrom/dbml.js index 9eb662b..899dfeb 100644 --- a/src/utils/importFrom/dbml.js +++ b/src/utils/importFrom/dbml.js @@ -1,5 +1,6 @@ import { Parser } from "@dbml/core"; import { arrangeTables } from "../arrangeTables"; +import { Cardinality, Constraint } from "../../data/constants"; const parser = new Parser(); @@ -52,6 +53,63 @@ export function fromDBML(src) { tables.push(parsedTable); } + for (const ref of schema.refs) { + const startTable = ref.endpoints[0].tableName; + const endTable = ref.endpoints[1].tableName; + const startField = ref.endpoints[0].fieldNames[0]; + const endField = ref.endpoints[1].fieldNames[0]; + + const startTableId = tables.findIndex((t) => t.name === startTable); + if (startTableId === -1) continue; + + const endTableId = tables.findIndex((t) => t.name === endTable); + if (endTableId === -1) continue; + + const endFieldId = tables[endTableId].fields.findIndex( + (f) => f.name === endField, + ); + if (endFieldId === -1) continue; + + const startFieldId = tables[startTableId].fields.findIndex( + (f) => f.name === startField, + ); + if (startFieldId === -1) continue; + + const relationship = {}; + + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; + relationship.startTableId = startTableId; + relationship.endTableId = endTableId; + relationship.endFieldId = endFieldId; + relationship.startFieldId = startFieldId; + relationship.id = relationships.length; + + relationship.updateConstraint = ref.onDelete + ? ref.onDelete[0].toUpperCase() + ref.onDelete.substring(1) + : Constraint.NONE; + relationship.deleteConstraint = ref.onUpdate + ? ref.onUpdate[0].toUpperCase() + ref.onUpdate.substring(1) + : Constraint.NONE; + + const startRelation = ref.endpoints[0].relation; + const endRelation = ref.endpoints[1].relation; + + if (startRelation === "*" && endRelation === "1") { + relationship.cardinality = Cardinality.MANY_TO_ONE; + } + + if (startRelation === "1" && endRelation === "*") { + relationship.cardinality = Cardinality.ONE_TO_MANY; + } + + if (startRelation === "1" && endRelation === "1") { + relationship.cardinality = Cardinality.ONE_TO_ONE; + } + + relationships.push(relationship); + } + for (const schemaEnum of schema.enums) { const parsedEnum = {};