zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    export ,export default 和 import 区别 以及用法
    koa2 安装环境
    Webstorm在MAC下的安装方法
    Mac 下搭建vue开发环境
    Mac系统下安装Vue-cli详细步骤
    npm 安装vue 报错Failed at the chromedriver@2.34.0 install script 'node install.js'
    #001 WebStrom SVN使用技巧
    #006 dependencies和devDependencies的区别
    #001 GIT创建分支
    #003 React 组件 继承 自定义的组件
  • 原文地址:https://www.cnblogs.com/tianzibobo/p/2972778.html
Copyright © 2011-2022 走看看