Skip to content

Commit 36f389a

Browse files
committed
[SAFRAN-1206] Delete dandling IndexElement and ForeignKeyElement when column is deleted
1 parent 9597f27 commit 36f389a

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

designs/database/plugins/org.obeonetwork.dsl.database.design/description/database.odesign

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,7 @@
173173
<elementView name="elementView"/>
174174
<containerView name="containerView"/>
175175
<initialOperation>
176-
<firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element">
177-
<subModelOperations xsi:type="tool_1:RemoveElement"/>
178-
</firstModelOperations>
176+
<firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="aql:element.deleteDatabaseElement()"/>
179177
</initialOperation>
180178
</ownedTools>
181179
<ownedTools xsi:type="tool:ContainerDropDescription" name="DPV_DND_TableContainer_contents" precondition="aql:let partialView = not newViewContainer.eContainerOrSelf(diagram::DSemanticDiagram).synchronized in (not partialView and Sequence{database::Table, database::View, database::Schema}->intersection(element.eClass().eAllSuperTypes->including(element.eClass()))->notEmpty()) or (partialView and element.eContainer()=newContainer) endlet" dragSource="PROJECT_EXPLORER">

designs/database/plugins/org.obeonetwork.dsl.database.design/src/org/obeonetwork/dsl/database/design/services/DatabaseServices.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
import java.util.Set;
2525

2626
import org.eclipse.emf.ecore.EObject;
27+
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
28+
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
29+
import org.eclipse.sirius.business.api.helper.SiriusUtil;
30+
import org.eclipse.sirius.business.api.session.Session;
2731
import org.eclipse.sirius.diagram.AbstractDNode;
2832
import org.eclipse.sirius.diagram.DDiagram;
2933
import org.eclipse.sirius.diagram.DDiagramElement;
@@ -34,6 +38,7 @@
3438
import org.obeonetwork.dsl.database.Column;
3539
import org.obeonetwork.dsl.database.DataBase;
3640
import org.obeonetwork.dsl.database.DatabaseFactory;
41+
import org.obeonetwork.dsl.database.DatabasePackage;
3742
import org.obeonetwork.dsl.database.ForeignKey;
3843
import org.obeonetwork.dsl.database.ForeignKeyElement;
3944
import org.obeonetwork.dsl.database.Sequence;
@@ -44,6 +49,7 @@
4449
import org.obeonetwork.dsl.database.ViewElement;
4550
import org.obeonetwork.dsl.database.ViewTable;
4651
import org.obeonetwork.dsl.database.spec.ViewSpec;
52+
import org.obeonetwork.dsl.database.util.DatabaseSwitch;
4753
import org.obeonetwork.dsl.database.view.parser.ColObject;
4854
import org.obeonetwork.dsl.database.view.parser.ViewContentProvider;
4955
import org.obeonetwork.dsl.technicalid.util.CopierUtils;
@@ -539,4 +545,45 @@ && findColumn(c) == null)
539545
return message.toString();
540546
}
541547

548+
public void deleteDatabaseElement(EObject databaseElement) {
549+
new DatabaseSwitch<Boolean>() {
550+
551+
@Override
552+
public Boolean caseTable(Table table) {
553+
Session session = Session.of(table).get();
554+
ECrossReferenceAdapter crossReferencer = session.getSemanticCrossReferencer();
555+
Collection<Setting> inverseReferences = crossReferencer.getInverseReferences(table, true);
556+
for (Setting setting : inverseReferences) {
557+
if (DatabasePackage.Literals.FOREIGN_KEY__TARGET == setting.getEStructuralFeature()) {
558+
SiriusUtil.delete(setting.getEObject());
559+
}
560+
}
561+
SiriusUtil.delete(table);
562+
return true;
563+
}
564+
565+
@Override
566+
public Boolean caseColumn(Column column) {
567+
Session session = Session.of(column).get();
568+
ECrossReferenceAdapter crossReferencer = session.getSemanticCrossReferencer();
569+
Collection<Setting> inverseReferences = crossReferencer.getInverseReferences(column, true);
570+
for (Setting setting : inverseReferences) {
571+
if (DatabasePackage.Literals.INDEX_ELEMENT__COLUMN == setting.getEStructuralFeature() ||
572+
DatabasePackage.Literals.FOREIGN_KEY_ELEMENT__FK_COLUMN == setting.getEStructuralFeature() ||
573+
DatabasePackage.Literals.FOREIGN_KEY_ELEMENT__PK_COLUMN == setting.getEStructuralFeature()) {
574+
SiriusUtil.delete(setting.getEObject());
575+
}
576+
}
577+
SiriusUtil.delete(column);
578+
return true;
579+
}
580+
581+
@Override
582+
public Boolean defaultCase(EObject object) {
583+
SiriusUtil.delete(object);
584+
return true;
585+
}
586+
587+
}.doSwitch(databaseElement);
588+
}
542589
}

0 commit comments

Comments
 (0)