为什么这个ATL助手错了?

时间:2018-05-21 08:18:15

标签: ocl

我是ATL和OCL的新手,我试图改造这个元模型: enter image description here

进入这一个: enter image description here

帮助程序用于执行用户admin创建的所有测试,并在该总和之后执行该测试的Actions的id。 我已经完成了这个帮助:

helper def: actionsId: Integer = Test!Test.allInstances()->select(i | i.md.user='admin')->collect(n | n.act.id.toInteger())->sum();

但是当我进行转换时,我遇到了这个错误:

  

org.eclipse.m2m.atl.engine.emfvm.VMException:集合没有属性,请使用 - > collect()

此错误位于帮助程序的collect(n | n.act.id.toInteger())部分。

我的其余代码是:

rule Testset2Testcase{
    from s: Test!Test
    to r: Testcase!Testcase(
        ident <- thisModule.actionId.toString(),
        date <- s.md.date,
        act <- thisModule.resolveTemp(s.act,'a')
    )
    do{
        'Bukatuta'.println();   
    }
}

rule Action2Activity{
    from s: Test!Action
    to a: Testcase!Activity(
        ident <- s.id   
    )
}

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:1)

我的老师帮助了我。
问题在于助手。
这样做:

helper def: actionsId: Integer = Test!Test.allInstances()->select(i | i.md.user='admin')->collect(n | n.act.id.toInteger())->sum();

我试图获取Action类型集合的id,而不是获取每个对象的id。

有了这个帮助,我正在收集一些集合,所以使用flattener这个集合集合变成了一系列Actions。

以正确方式编写的帮助器如下所示:

helper def: actionsId: Integer = Test!Test.allInstances()->select(i | i.md.user='admin')->collect(n | n.act)->flatten()->collect(x | x.id.toInteger())->sum();

答案 1 :(得分:0)

您的表达看似合理,但如果没有您的元模型,很难看出ATL对使用Collection属性感到不满意。如果Test :: md是一个集合,那么表达式就是愚蠢的,尽管不是出于给定的原因。

如果ATL的hovertext无法帮助您理解您的类型,您可以在OCL Xtext控制台中输入相同的表达式并小心地将鼠标悬停在“。”上。和“md”得到准确的类型分析。

但要注意,ATL有一个独立开发的嵌入式OCL,它不像Eclipse OCL那样丰富。也许你的表达对于ATL来说过于复杂;尝试用let来打破它。