use of org.obeonetwork.dsl.database.Table in project InformationSystem by ObeoNetwork.
the class EntityToMLD method handleForeignKey.
private void handleForeignKey(Reference reference) {
Table targetTable = getFromOutputTraceabilityMap(EntityUtils.getContainingEntity(reference), DatabasePackage.Literals.TABLE);
Entity targetEntity = EntityUtils.getReferencedEntity(reference);
if (targetEntity == null) {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "No entity referenced by " + EntityUtils.getContainingEntity(reference).getName() + "." + reference.getName()));
return;
}
Table sourceTable = getFromOutputTraceabilityMap(targetEntity, DatabasePackage.Literals.TABLE);
if (sourceTable == null) {
// Table was not found among the newly created tables
// try to retrieve it from additional resources
String targetEntityKey = LabelProvider.getTableKeyForEntity(targetEntity);
EObject targetObject = getAdditionalResourcesMap().get(targetEntityKey);
if (targetObject instanceof Table) {
sourceTable = (Table) targetObject;
} else {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Cannot resolve table: " + targetEntityKey + " for Reference!"));
return;
}
}
if (shouldCreateJoinTable(reference)) {
createJoinTable(reference, sourceTable, targetTable);
} else {
boolean nullable = getNullableValueForFK(reference);
if (shouldCreateFKInSource(reference)) {
createForeignKey(reference, targetTable, sourceTable, nullable);
} else if (shouldCreateFKInTarget(reference)) {
createForeignKey(reference, sourceTable, targetTable, nullable);
}
}
}
use of org.obeonetwork.dsl.database.Table in project InformationSystem by ObeoNetwork.
the class MLDToEntity method getOppositeFKOnJoinTable.
private ForeignKey getOppositeFKOnJoinTable(ForeignKey foreignKey) {
Table sourceTable = foreignKey.getSourceTable();
if (isJoinTable(sourceTable)) {
ForeignKey fk1 = sourceTable.getForeignKeys().get(0);
ForeignKey fk2 = sourceTable.getForeignKeys().get(1);
if (foreignKey.equals(fk1)) {
return fk2;
} else if (foreignKey.equals(fk2)) {
return fk1;
}
}
return null;
}
use of org.obeonetwork.dsl.database.Table in project InformationSystem by ObeoNetwork.
the class MpdToMldBidiRules method createOrUpdateSequences.
/**
* Create needed new sequences or update existing ones
* @param sourceTableContainer
* @return list of sequences processed so that all other sequences (now useless) could be removed
*/
/**
* @param sourceTableContainer
* @return
*/
private Collection<Sequence> createOrUpdateSequences(TableContainer sourceTableContainer) {
Collection<Sequence> sequences = new ArrayList<Sequence>();
// for each non-composite PK we create a sequence and associate it with the PK column
for (AbstractTable sourceAbstractTable : sourceTableContainer.getTables()) {
if (sourceAbstractTable instanceof Table) {
Table sourceTable = (Table) sourceAbstractTable;
// Get associated table
Table targetTable = getFromOutputTraceabilityMap(sourceTable, DatabasePackage.Literals.TABLE);
if (targetTable != null) {
PrimaryKey pk = targetTable.getPrimaryKey();
// Only for non-composite PK
if (pk != null && pk.getColumns().size() == 1) {
Column targetColumn = pk.getColumns().get(0);
// Retrieve the potentially existing sequence
Sequence existingSequence = targetColumn.getSequence();
String sequenceName = targetTable.getName() + "_SEQ";
if (existingSequence != null) {
// Update name
existingSequence.setName(sequenceName);
// Ensure the sequence is in the right container
if (!targetTable.getOwner().getSequences().contains(existingSequence)) {
targetTable.getOwner().getSequences().add(existingSequence);
}
sequences.add(existingSequence);
} else {
// Create a new sequence
Sequence newSequence = DatabaseFactory.eINSTANCE.createSequence();
newSequence.setName(sequenceName);
newSequence.setIncrement(new BigInteger("1"));
newSequence.setStart(new BigInteger("1"));
newSequence.setComments(String.format(SEQUENCE_INITIAL_COMMENTS, targetTable.getName()));
targetTable.getOwner().getSequences().add(newSequence);
// Retrieve the associated column and associate it with the sequence
targetColumn.setSequence(newSequence);
sequences.add(newSequence);
}
}
}
}
}
if (sourceTableContainer instanceof DataBase) {
DataBase sourceDataBase = (DataBase) sourceTableContainer;
for (Schema sourceSchema : sourceDataBase.getSchemas()) {
sequences.addAll(createOrUpdateSequences(sourceSchema));
}
}
return sequences;
}
use of org.obeonetwork.dsl.database.Table in project InformationSystem by ObeoNetwork.
the class MpdToMldBidiRules method createFK.
private void createFK(ForeignKey sourceFK, Table targetTable) {
if (sourceFK.getTarget() == null) {
return;
}
ForeignKey targetFK = getFromInputTraceabilityMap(sourceFK, DatabasePackage.Literals.FOREIGN_KEY);
if (targetFK != null) {
// Reuse existing FK
} else {
// We have to create a new FK
targetFK = DatabaseFactory.eINSTANCE.createForeignKey();
targetTable.getForeignKeys().add(targetFK);
}
addToOutputTraceability(sourceFK, targetFK);
targetFK.setName(sourceFK.getName());
targetFK.setComments(sourceFK.getComments());
// Try to retrieve the table referenced by the FK
Table fkTargetTable = getFromOutputTraceabilityMap(sourceFK.getTargetTable(), DatabasePackage.Literals.TABLE);
if (fkTargetTable == null) {
// We look into the additional resources
String fkTargetTableKey = ModelUtils.getKey(sourceFK.getTarget());
fkTargetTable = (Table) getAdditionalResourcesMap().get(fkTargetTableKey);
}
if (fkTargetTable == null) {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Cannot resolve table: " + sourceFK.getTargetTable().getName() + " for ForeignKey: " + sourceFK.getName() + "!"));
}
targetFK.setTarget(fkTargetTable);
for (ForeignKeyElement sourceFkElement : sourceFK.getElements()) {
createFKElement(sourceFkElement, targetFK);
}
}
use of org.obeonetwork.dsl.database.Table in project InformationSystem by ObeoNetwork.
the class MpdToMldBidiRules method createForeignKeys.
private void createForeignKeys(TableContainer sourceTableContainer) {
// create all foreignkeys
for (AbstractTable sourceAbstractTable : sourceTableContainer.getTables()) {
if (sourceAbstractTable instanceof Table) {
Table sourceTable = (Table) sourceAbstractTable;
Table targetTable = getFromOutputTraceabilityMap(sourceTable, DatabasePackage.Literals.TABLE);
for (ForeignKey foreignKey : sourceTable.getForeignKeys()) {
createFK(foreignKey, targetTable);
}
}
}
if (sourceTableContainer instanceof DataBase) {
DataBase sourceDataBase = (DataBase) sourceTableContainer;
for (Schema sourceSchema : sourceDataBase.getSchemas()) {
createForeignKeys(sourceSchema);
}
}
}
Aggregations