Почему этот помощник ATL неверен?

Я новичок в ATL и OCL и пытаюсь преобразовать эту метамодель: введите здесь описание изображения

в это: введите здесь описание изображения

Помощник предназначен для выполнения всех тестов, созданных администратором пользователя, и после этого суммирует идентификаторы действий этого теста.
Я сделал этот помощник:

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   
    )
}

Извините за мой плохой английский.


ocl
person Mikel Molinuevo    schedule 21.05.2018    source источник
comment
Вы читали описание тега 'atl'?   -  person Jacek Cz    schedule 21.05.2018
comment
Я прочитал это сейчас, извините, я думал, что это было о языке преобразования ATL. Я изменю это.   -  person Mikel Molinuevo    schedule 21.05.2018


Ответы (2)


В этом мне помог мой учитель.
Проблема была в хелпере.
Что делать:

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

Я пытался получить идентификатор коллекции коллекций типа Action вместо идентификатора каждого объекта.

С помощью этого помощника я собирал коллекцию коллекций, поэтому с помощью flattener эта коллекция коллекций стала коллекцией действий.

Правильно написанный хелпер выглядит так:

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

Ваше выражение выглядит правдоподобно, но без вашей метамодели трудно увидеть, где ATL недовольна использованием свойства Collection. Если Test::md является коллекцией, выражение будет просто глупым, хотя и не по указанной причине.

Если всплывающий текст ATL не помогает вам понять ваши типы, вы можете ввести то же выражение в консоль Xtext OCL и осторожно навести указатель мыши на «.» и "md", чтобы получить точный анализ типа.

Но будьте осторожны, ATL имеет независимо разработанный встроенный OCL, который не так богат, как Eclipse OCL. Возможно, ваше выражение слишком сложно для ATL; попробуйте разбить его с помощью let's.

person Ed Willink    schedule 21.05.2018
comment
Метамодели находятся в ссылке. Test::md предназначен для проверки того, равен ли атрибут пользователя из метаданных «admin». - person Mikel Molinuevo; 21.05.2018
comment
У меня нет инструментов, которые могут загружать метамодели из файлов изображений. Заархивированный проект удобнее. - person Ed Willink; 21.05.2018
comment
я нашел ошибку - person Mikel Molinuevo; 21.05.2018