103 lines
2.7 KiB
JavaScript
103 lines
2.7 KiB
JavaScript
|
import { Cardinality } from "../../data/constants";
|
||
|
import { parseDefault } from "../exportSQL/shared";
|
||
|
|
||
|
function hasColumnSettings(field) {
|
||
|
return (
|
||
|
field.primary ||
|
||
|
field.notNull ||
|
||
|
field.increment ||
|
||
|
field.unique ||
|
||
|
(field.comment && field.comment.trim() != "") ||
|
||
|
(field.default && field.default.trim() != "")
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function columnDefault(field, database) {
|
||
|
if (!field.default || field.default.trim() === "") {
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
return `default: ${parseDefault(field, database)}`;
|
||
|
}
|
||
|
|
||
|
function columnComment(field) {
|
||
|
if (!field.comment || field.comment.trim() === "") {
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
return `note: '${field.comment}'`;
|
||
|
}
|
||
|
|
||
|
function columnSettings(field, database) {
|
||
|
if (!hasColumnSettings(field)) {
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
return ` [ ${field.primary ? "pk " : ""}${
|
||
|
field.increment ? "increment " : ""
|
||
|
}${field.notNull ? "not null " : ""}${
|
||
|
field.unique ? "unique " : ""
|
||
|
}${columnDefault(field, database)}${columnComment(field, database)}]`;
|
||
|
}
|
||
|
|
||
|
function cardinality(rel) {
|
||
|
switch (rel.cardinality) {
|
||
|
case Cardinality.ONE_TO_ONE:
|
||
|
return "-";
|
||
|
case Cardinality.ONE_TO_MANY:
|
||
|
return "<";
|
||
|
case Cardinality.MANY_TO_ONE:
|
||
|
return ">";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function toDBML(diagram) {
|
||
|
return `${diagram.enums
|
||
|
.map(
|
||
|
(en) =>
|
||
|
`enum ${en.name} {\n${en.values.map((v) => `\t${v}`).join("\n")}\n}\n\n`,
|
||
|
)
|
||
|
.join("\n\n")}${diagram.tables
|
||
|
.map(
|
||
|
(table) =>
|
||
|
`Table ${table.name} {\n${table.fields
|
||
|
.map(
|
||
|
(field) =>
|
||
|
`\t${field.name} ${field.type.toLowerCase()}${columnSettings(
|
||
|
field,
|
||
|
diagram.database,
|
||
|
)}`,
|
||
|
)
|
||
|
.join("\n")}${
|
||
|
table.indices.length > 0
|
||
|
? "\n\n\tindexes {\n" +
|
||
|
table.indices
|
||
|
.map(
|
||
|
(index) =>
|
||
|
`\t\t(${index.fields.join(", ")}) [ name: '${
|
||
|
index.name
|
||
|
}'${index.unique ? " unique" : ""} ]`,
|
||
|
)
|
||
|
.join("\n") +
|
||
|
"\n\t}"
|
||
|
: ""
|
||
|
}${
|
||
|
table.comment && table.comment.trim() !== ""
|
||
|
? `\n\n\tNote: '${table.comment}'`
|
||
|
: ""
|
||
|
}\n}`,
|
||
|
)
|
||
|
.join("\n\n")}\n\n${diagram.relationships
|
||
|
.map(
|
||
|
(rel) =>
|
||
|
`Ref ${rel.name} {\n\t${
|
||
|
diagram.tables[rel.startTableId].name
|
||
|
}.${diagram.tables[rel.startTableId].fields[rel.startFieldId].name} ${cardinality(
|
||
|
rel,
|
||
|
)} ${diagram.tables[rel.endTableId].name}.${
|
||
|
diagram.tables[rel.endTableId].fields[rel.endFieldId].name
|
||
|
} [ delete: ${rel.deleteConstraint.toLowerCase()}, on update: ${rel.updateConstraint.toLowerCase()} ]\n}`,
|
||
|
)
|
||
|
.join("\n\n")}`;
|
||
|
}
|