Modeltransformasjoner med ATL
Atlas Transformation Language (ATL) Et transformasjonsspråk for model til model transformasjoner Et delvis deklarativt og delvis imperativt språk Et ATL transformasjons program består av et sett med regler som samen spessifiserer er transformasjon melom to modeller Finnes som eclipse plugin: ATL Development Tools (ADT)
Eksempel mapping - Class2Table Class - Name : String Class2Table{ from c : Class ! Class to t : Relational ! Table( t.name <- c.name)} Mapping Table - Name : String Student
Transformasjons eksempel: Mapping fra klasse modell til relasjons database modell
Transformasjonen Transformasjonen er beskrevet av et sett mapping regler som beskriver hvordan et klassediagram kan gjøres om til en databasemodell Bruker en metamodel som beskriver input modellen, og en som beskriver output modellen Tar en klassemodell som input og lager en databasemodell på grunnlag av denne, i henhold til metamodellen for databasemodellen
Metamodellene:
class.ecore
relational.ecore
Mappingreglene:
Spesifikasjon av input of outpu modeller module class2relational; create OUT : relational from IN : class;
ClassModel2DBModel ClassModelDBModel - name : String - elements: Classifier - tables : Table - types : Type
ClassModel2DBModel rule ClassModel2RelatinalModel{ from cm : class ! ClassModel to rm : relational ! DBModel( name <- cm.name, tables select(e | e.oclIsKindOf(class ! Class)), types select(e | e.oclIsKindOf(class ! DataType)) ) do{ thisModule.dbModel <- rm; }
helper def : dbModel helper def : dbModel : relational ! DBModel = relational ! DBModel;
Class2Table ClassTable - name : String - attributes: Attribute - columns : Column - key : Column
Class2Table rule Class2Table{ from c : class ! Class to t : relational ! Table( name <- c.name, columns select(a | a.multivalued = false)}, key <- k ), k : relational ! Column( name <- c.name+'Id', type <-thisModule.getInteger, keyOf <- t ) }
Helper def : getInteger helper def : getInteger : relational ! Type = class ! DataType.allInstances() -> select(d | d.name = 'Integer') -> first();
DataType2Type DataTypeType - name : String
DataType2Type rule DataType2Type{ from dt : class ! DataType to t : relational ! Type( name <- dt.name ) }
Attribute2Column1 AttributeColumn - name : String - owner : Class - type : DataType - keyOf : Table - type : Type- multivalued = false
Attribute2Column1 rule Attribute2Column1{ from a : class ! Attribute( a.multivalued = false and a.type.oclIsKindOf(class ! DataType) ) to c : relational ! Column( name <- a.name, type <- a.type ) }
Attribute2Column2 AttributeColumn - name : String - owner : Class - type : Class - keyOf : Table - type : Type- multivalued = false
Attribute2Column2 rule Attribute2Column2{ from a : class ! Attribute( a.multivalued = false and a.type.oclIsKindOf( class ! Class) ) to c : relational ! Column( name <- a.name + 'ID', type <- thisModule.getInteger ) }
Attribute2Table1 AttributeTable - name : String - owner : Class - type : DataType - key : Column - type : Type- multivalued = true
Attribute2Table1 rule Attribute2Table1{ from a : class ! Attribute( a.multivalued = true and a.type.oclIsKindOf(class ! DataType)) to t : relational ! Table( name <- a.name, columns <- Set{id, val}, key <- Set{id} ), id : relational ! Column( name <- a.owner.name + 'Id', type <- thisModule.getInteger, keyOf <- t ), val : relational ! Column( name <-a.name, type <- a.type ) do{ thisModule.dbModel.tables <- Set{t}; }
Attribute2Table2 AttributeTable - name : String - owner : Class - type : Class - key : Column - type : Type- multivalued = true
Attribute2Table2 rule Attribute2Table2{ from a : class ! Attribute(a.multivalued = true and a.type.oclIsKindOf(class ! Class) ) to t : relational ! Table( name <- a.owner.name + '_' + a.name, columns <- Set{id, fk}, key <- Set{id, fk} ), id : relational ! Column( name <- a.owner.name + 'Id', type <- thisModule.getInteger, keyOf <- t ), fk : relational ! Column( name <- a.name + 'Id', type <- thisModule.getInteger, keyOf <- t ) do{ thisModule.dbModel.tables <- Set{t}; }
Resultatet:
Input model
Output model