我是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
)
}
抱歉我的英语不好。
答案 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来打破它。