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、其他的表达式中不会有自由变量出现(所有出现的变量应该都已限制在前面的表达式中)。