Почему этот помощник ATL не так? - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в 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   
    )
}

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Мой учитель помог мне с этим.
Проблема была в помощнике.
Делая это:

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

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

С этим помощником Iбрал коллекцию коллекций, поэтому с помощью 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();
0 голосов
/ 21 мая 2018

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

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

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

...