QVT之The Relations Language(Part 一)
The Relations Language(一)
1、转换和模型类型
一个例子是:
transformation umlRdbms(uml:SimpleUML, rdbms:SimpleRDBMS){...}
此声明名字为“transformation”,有两个类型的候选模型:“uml”和“rdbms”。名为“uml”的模型声明SimpleUML包作为它的元模型,“rdbms”模型声明SimpleRDBMS包为它的的元模型。调用一个转换的目的:1)检查两个模型是否一致;2)修改一个模型增强一致性。(可以这样理解:1)源模型存在,目标模型为空,检查两个模型不一致,则增加目标模型以增强一致性;2)源模型存在,目标模型存在,检查两个模型不一致,则修改目标模型以增强一致性(单向转换);3)源模型为空,目标模型存在,检查两个模型不一致,则删除目标模型以增强一致性(单向转换)。)
转换执行的方向是通过选择一个候选模型作为目标模型。目标模型可能是空,也可能含有与转换有关的已存在的模型元素。
2、Relations和Domains
一个转换中的Relations声明必须被候选模型中元素满足的限制。一个relation中包含了两个或多个domains以及一对when和where谓词,确定了候选模型元素之间必须持有的关系。when字句确定了关系有效的条件,where字句确定了关系中所有模型元素必须满足的条件。例子如下:
relation PackageToSchema /* map each package to a schema */ { domain uml p:Package {name=pn} domain rdbms s:Schema {name=pn} }
上面例子中的两个domain将会分别匹配“uml”和“rdbms”模型中的元素。每一个domain确定了一个简单的模式——一个有名字的包,一个有名字的模式,两个“name”属性绑定了相同的变量“pn”,暗示了他们应该有相同的值。至于domain中具体可以包含哪些内容请参考QVT1.1规范中7.2节。
relation ClassToTable /* map each persistent class to a table */ { domain uml c:Class{ namespace = p:Package {}, kind='Persistent', name=cn } domain rdbms t:Table{ schema = s:Schema {}, name=cn, column = cl:Column {name=cn+'_tid',type='NUMBER'}, primaryKey = k:PrimaryKey {name=cn+'_pk',column=cl} } when { PackageToSchema(p, s); } where { AttributeToColumn(c, t); } }
除了relation调用表达式之外when和where字句也可以包含一些OCL表达式。
一个转换包含两种relation:top-level和非top-level。一个转换执行时要求所有它的top-level relations被执行。而非top-level relations仅仅当被其他的relation的where字句直接或间接的调用。举例如下:
transformation umlRdbms (uml : SimpleUML, rdbms : SimpleRDBMS) {
top relation PackageToSchema {…}
top relation ClassToTable {…}
relation AttributeToColumn {…}
}
关系是否被执行是由目标domain决定的。标记有两种checkonly和enforce。
relation PackageToSchema /* map each package to a schema */ { checkonly domain uml p:Package {name=pn} enforce domain rdbms s:Schema {name=pn} }
如果我们朝着uml方向执行,并且在rdbms中存在一个schema但在uml中没有一个相应的具有相同名字的包,那么仅仅只会报告一个不一致。因为uml被标记为checkonly,所以仅仅只是被检查。
然而如果我们朝着rdbms方向执行转换umlRdbms,对于uml模型中的每一个包relation首先检查在rdbms模型中是否存在一个据哟相同名字的schema。如果不存在,将会用给定的名字创建一个新的schema。考虑到上述场景的一个变化,如果我们朝着rdbms方向执行,并且uml中没有一个相应的具有相同名字的包,那么那个schema将会从rdbms模型中删除,以增强一致性在enforce domain中。简单的讲就是uml模型中有而rdbms中没有,则在rdbms中创建相应schema;uml模型中没有而rdbms中有,则删除rdbms中相应的schema。
这些规则只依赖于目标domain.