blob: 3a436f3c5efe135908d0ec9b445c0cc023d47383 [file] [log] [blame]
transformation Simpleuml_To_Rdb;
modeltype A uses 'http://www.eclipse.org/qvt/1.0.0/Operational/examples/simpleuml';
modeltype B uses 'http://www.eclipse.org/qvt/1.0.0/Operational/examples/rdb';
mapping main(in model: simpleuml::Model) : rdb::Model {
name := model.name;
schemas := package2schemas(model);
}
query package2schemas(in root: simpleuml::Package) : OrderedSet(rdb::Schema) {
package2schema(root)->
union(root.getSubpackages()->collect(p | package2schemas(p))->asOrderedSet())->asOrderedSet()
}
mapping package2schema(in pack: simpleuml::Package) : rdb::Schema
when { pack.hasPersistentClasses() }
{
name := pack.name;
elements := pack.ownedElements->select(oclIsKindOf(simpleuml::Class))->
collect(c | c.oclAsType(simpleuml::Class).persistentClass2table())->asOrderedSet()
}
mapping simpleuml::Class::persistentClass2table() : rdb::Table
when { self.isPersistent() }
{
name := self.name;
columns := class2columns(self);
primaryKey := self.class2primaryKey();
foreignKeys := class2foreignKeys(self);
}
mapping simpleuml::Class::class2primaryKey() : rdb::constraints::PrimaryKey {
name := 'PK'.concat(self.name);
includedColumns := self.resolveIn(simpleuml::Class::persistentClass2table, rdb::Table)->any(true).getPrimaryKeyColumns()
}
query class2foreignKeys(in cls: simpleuml::Class) : OrderedSet(rdb::constraints::ForeignKey) {
cls.attributes->collect(resolveIn(simpleuml::Property::relationshipAttribute2foreignKey, rdb::constraints::ForeignKey))->
asOrderedSet()
}
query class2columns(in cls: simpleuml::Class) : OrderedSet(rdb::TableColumn) {
dataType2columns(cls)->
union(generalizations2columns(cls))->asOrderedSet()
}
query dataType2columns(in dt: simpleuml::DataType) : OrderedSet(rdb::TableColumn) {
primitiveAttributes2columns(dt)->
union(enumerationAttributes2columns(dt))->
union(relationshipAttributes2columns(dt))->
union(assosiationAttributes2columns(dt))->asOrderedSet()
}
query dataType2primaryKeyColumns(in dt: simpleuml::DataType, in prefix : String, in leaveIsPrimaryKey : Boolean) : OrderedSet(rdb::TableColumn) {
dataType2columns(dt)->select(isPrimaryKey)->
collect(c | object rdb::TableColumn {
name := prefix.concat('_').concat(c.name);
domain := c.domain;
type := c.type;
isPrimaryKey := leaveIsPrimaryKey
})->asOrderedSet()
}
query primitiveAttributes2columns(in dt: simpleuml::DataType) : OrderedSet(rdb::TableColumn) {
dt.attributes->collect(a | primitiveAttribute2column(a))->asOrderedSet()
}
mapping primitiveAttribute2column(in prop: simpleuml::Property) : rdb::TableColumn
when { prop.isPrimitive() }
{
isPrimaryKey := prop.isPrimaryKey();
name := prop.name;
type := object rdb::datatypes::PrimitiveDataType { name := prop.type.name; };
}
query enumerationAttributes2columns(in dt: simpleuml::DataType) : OrderedSet(rdb::TableColumn) {
dt.attributes->collect(a | enumerationAttribute2column(a))->asOrderedSet()
}
mapping enumerationAttribute2column(in prop: simpleuml::Property) : rdb::TableColumn
when { prop.isEnumeration() }
{
isPrimaryKey := prop.isPrimaryKey();
name := prop.name;
type := object rdb::datatypes::PrimitiveDataType { name := 'Integer'; };
}
query relationshipAttributes2columns(in dt: simpleuml::DataType) : OrderedSet(rdb::TableColumn) {
dt.attributes->collect(a | a.relationshipAttribute2foreignKey())->
collect(includedColumns)->asOrderedSet();
}
mapping simpleuml::Property::relationshipAttribute2foreignKey() : rdb::constraints::ForeignKey
when { self.isRelationship() }
{
name := 'FK'.concat(self.name);
includedColumns := dataType2primaryKeyColumns(self.type.asDataType(), self.name, self.isIdentifying());
referredUC := self.type.late resolveoneIn(simpleuml::Class::class2primaryKey, rdb::constraints::PrimaryKey);
}
query assosiationAttributes2columns(in dt: simpleuml::DataType) : OrderedSet(rdb::TableColumn) {
dt.attributes->select(isAssosiation())->
collect(p | dataType2columns(p.type.asDataType()))->asOrderedSet()
}
query generalizations2columns(in cls: simpleuml::Class) : OrderedSet(rdb::TableColumn) {
cls.generalizations->collect(g | class2columns(g.general))->asOrderedSet()
}
query simpleuml::Package::getSubpackages() : OrderedSet(simpleuml::Package) {
self.ownedElements->collect(oclAsType(simpleuml::Package))->asOrderedSet()
}
query simpleuml::Type::asDataType() : simpleuml::DataType {
self.oclAsType(simpleuml::DataType)
}
query simpleuml::Property::isPrimaryKey() : Boolean {
self.stereotype->includes('primaryKey')
}
query simpleuml::Property::isIdentifying() : Boolean {
self.stereotype->includes('identifying')
}
query simpleuml::Property::isPrimitive() : Boolean {
self.type.oclIsKindOf(simpleuml::PrimitiveType)
}
query simpleuml::Property::isEnumeration() : Boolean {
self.type.oclIsKindOf(simpleuml::Enumeration)
}
query simpleuml::Property::isRelationship() : Boolean {
self.type.oclIsKindOf(simpleuml::DataType) and self.type.isPersistent()
}
query simpleuml::Property::isAssosiation() : Boolean {
self.type.oclIsKindOf(simpleuml::DataType) and not self.type.isPersistent()
}
query rdb::Table::getPrimaryKeyColumns() : OrderedSet(rdb::TableColumn) {
self.columns->select(isPrimaryKey)
}
query simpleuml::ModelElement::isPersistent() : Boolean {
self.stereotype->includes('persistent')
}
query simpleuml::Package::hasPersistentClasses() : Boolean {
-- ownedElements->exists(e | e.oclIsKindOf(simpleuml::Class)
-- and e.oclAsType(simpleuml::Class).isPersistent())
self.ownedElements->select(oclIsKindOf(simpleuml::Class))->
select(c | c.oclAsType(simpleuml::Class).isPersistent())->size() > 0
}