mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-09-01 10:25:13 +00:00
Deduce cardinality from fields (#557)
This commit is contained in:
@@ -549,6 +549,25 @@ export default function Canvas() {
|
|||||||
setLinking(true);
|
setLinking(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getCardinality = (startField, endField) => {
|
||||||
|
const startIsUnique = startField.unique || startField.primary;
|
||||||
|
const endIsUnique = endField.unique || endField.primary;
|
||||||
|
|
||||||
|
if (startIsUnique && endIsUnique) {
|
||||||
|
return Cardinality.ONE_TO_ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startIsUnique && !endIsUnique) {
|
||||||
|
return Cardinality.ONE_TO_MANY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!startIsUnique && endIsUnique) {
|
||||||
|
return Cardinality.MANY_TO_ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Cardinality.ONE_TO_ONE;
|
||||||
|
};
|
||||||
|
|
||||||
const handleLinking = () => {
|
const handleLinking = () => {
|
||||||
if (hoveredTable.tableId === null) return;
|
if (hoveredTable.tableId === null) return;
|
||||||
if (hoveredTable.fieldId === null) return;
|
if (hoveredTable.fieldId === null) return;
|
||||||
@@ -556,17 +575,15 @@ export default function Canvas() {
|
|||||||
const { fields: startTableFields, name: startTableName } = tables.find(
|
const { fields: startTableFields, name: startTableName } = tables.find(
|
||||||
(t) => t.id === linkingLine.startTableId,
|
(t) => t.id === linkingLine.startTableId,
|
||||||
);
|
);
|
||||||
const { type: startType, name: startFieldName } = startTableFields.find(
|
const startField = startTableFields.find(
|
||||||
(f) => f.id === linkingLine.startFieldId,
|
(f) => f.id === linkingLine.startFieldId,
|
||||||
);
|
);
|
||||||
const { fields: endTableFields, name: endTableName } = tables.find(
|
const { fields: endTableFields, name: endTableName } = tables.find(
|
||||||
(t) => t.id === hoveredTable.tableId,
|
(t) => t.id === hoveredTable.tableId,
|
||||||
);
|
);
|
||||||
const { type: endType } = endTableFields.find(
|
const endField = endTableFields.find((f) => f.id === hoveredTable.fieldId);
|
||||||
(f) => f.id === hoveredTable.fieldId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!areFieldsCompatible(database, startType, endType)) {
|
if (!areFieldsCompatible(database, startField.type, endField.type)) {
|
||||||
Toast.info(t("cannot_connect"));
|
Toast.info(t("cannot_connect"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -576,14 +593,16 @@ export default function Canvas() {
|
|||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const cardinality = getCardinality(startField, endField);
|
||||||
|
|
||||||
const newRelationship = {
|
const newRelationship = {
|
||||||
...linkingLine,
|
...linkingLine,
|
||||||
|
cardinality,
|
||||||
endTableId: hoveredTable.tableId,
|
endTableId: hoveredTable.tableId,
|
||||||
endFieldId: hoveredTable.fieldId,
|
endFieldId: hoveredTable.fieldId,
|
||||||
cardinality: Cardinality.ONE_TO_ONE,
|
|
||||||
updateConstraint: Constraint.NONE,
|
updateConstraint: Constraint.NONE,
|
||||||
deleteConstraint: Constraint.NONE,
|
deleteConstraint: Constraint.NONE,
|
||||||
name: `fk_${startTableName}_${startFieldName}_${endTableName}`,
|
name: `fk_${startTableName}_${startField.name}_${endTableName}`,
|
||||||
id: relationships.length,
|
id: relationships.length,
|
||||||
};
|
};
|
||||||
delete newRelationship.startX;
|
delete newRelationship.startX;
|
||||||
|
Reference in New Issue
Block a user