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.

原文地址:https://www.cnblogs.com/tianzibobo/p/2972778.html