package org.obeonetwork.dsl.database.design.services; import org.eclipse.emf.ecore.util.EcoreUtil; import org.obeonetwork.dsl.database.Column; import org.obeonetwork.dsl.database.DatabaseFactory; import org.obeonetwork.dsl.database.ForeignKey; import org.obeonetwork.dsl.database.ForeignKeyElement; import org.obeonetwork.dsl.database.Table; public class DatabaseServices { public ForeignKey createForeignKey(Table source, Table target) { ForeignKey fk = DatabaseFactory.eINSTANCE.createForeignKey(); source.getForeignKeys().add(fk); fk.setTarget(target); // Initialize with columns if (target.getPrimaryKey() != null) { for (Column pkColumn : target.getPrimaryKey().getColumns()) { Column fkColumn = getOrCreateColumn(source, pkColumn); if (pkColumn != null && fkColumn != null) { ForeignKeyElement fke = DatabaseFactory.eINSTANCE.createForeignKeyElement(); fke.setPkColumn(pkColumn); fke.setFkColumn(fkColumn); fk.getElements().add(fke); } } } return fk; } private Column getOrCreateColumn(Table table, Column referenceColumn) { // Check if a column with the same name already exists if (referenceColumn.getName() != null) { for (Column column : table.getColumns()) { if (referenceColumn.getName().equalsIgnoreCase(column.getName())) { return column; } } } // No column found, we have to create a new one Column newColumn = DatabaseFactory.eINSTANCE.createColumn(); table.getColumns().add(newColumn); newColumn.setName(referenceColumn.getName()); newColumn.setType(EcoreUtil.copy(referenceColumn.getType())); return newColumn; } }