QVT之The Relations Language(Part 二)

The Relations Language(二)

3、模式匹配

用一个例子来讨论与domain相关联的模式匹配,被称为对象模板表达式(object template expressions)。

c:Class {

namespace = p:Package {},

kind='Persistent',

name=cn

}

一个模板表达式匹配导致了候选模型中模型元素到domain中所声明变量的绑定。一个模板表达式匹配可以在一些domain变量已经绑定了模型元素的情况下执行。在这种情况下,模板表达式匹配只为未绑定的domain变量寻找绑定。

4、Key和用模式创建对象

前面提到过,模板表达式可以当做模板来创建目标模型中的一个对象。当对于一个给定的源domain模式的有效匹配时,目标domain模式中不存在一个有效的匹配,最后会用目标domain的模板表达式当做模板来创建目标模型中的对象。

t:Table {

schema = s:Schema {},

name = cn,

column = cl:Column {name=cn+'_tid', type='NUMBER'},

primaryKey = k:PrimaryKey {name=cn+'_pk', column=cl}

}

然而,当创建对象时,我们需要保证要创建的对象已经存在时不能重复创建。引入Key的概念,Key定义了一组属性唯一的标识了一个模型中类的对象实例。一个类也可以由多个Key。

例如对于前面提到过的关系ClassToTable,我们也许希望在simpleRDBMS模型中一个table被两个属性唯一的标识——它的name以及所属的schema。我们可以这样声明:key Table {schema, name};

在对象创建时,如果一个对象模板表达式中的属性匹配了相关联类中的一个key,然后用key来定位模型中匹配的对象。仅仅当不存在匹配的对象时才会创建新的对象。

5、对表达式的限制

为了保证可执行性(即存在一个受约束的算法朝着一个给定的目标模型执行relation),在relation中出现的表达式需要满足以下条件:

1)when字句,源domain,where字句中的表达式需要满足以下形式:

a、<object>.<property> = <variable>

b、<object>.<property> = <expression>

c、其他的表达式中不会有自由变量出现(所有出现的变量应该都已限制在前面的表达式中)。

2、目标domain中的表达式需要满足以下形式:

a、<object>.<property> = <expression>

b、其他的表达式中不会有自由变量出现(所有出现的变量应该都已限制在前面的表达式中)。

posted @ 2013-03-22 21:21  天子波波  阅读(257)  评论(0编辑  收藏  举报