Включить многие ко многим (количество элементов) в преобразовании ATL model2model

Я пытаюсь выполнить преобразование M2M с помощью ATL. Итак, я преобразовываю исходную модель (1) в целевую модель (2), я очень новичок в ATL и не могу найти никакой документации о том, как включить преобразования «многие ко многим». Что я пытаюсь сделать, так это: преобразовать (1) исходную модель с классом с именем operation, который ссылается на другой параметр с именем класса, ссылка с именем OperationInput и ее кардинальность (0..n) в (2) целевая модель с функция с именем класса, которая ссылается на другой класс с именем Param, ссылка называется functionInput и имеет мощность (0..n). Итак, я написал следующее преобразование ATL:

rule operation2Function {
    from
        s: Source!operation         
    to
    
        t: Target!Function 
        (
            
            functionInput<-s.operationInput)
}

Однако, похоже, это не сработало, потому что количество элементов равно многим ко многим, поэтому я попробовал следующий код:

rule operation2Function {
    from
        s: Source!operation         
    to
    
        t: Target!Function 
        (
            
            functionInput<-Source!operation.allInstances() ->select(e | e.oclIsTypeOf(Source!operation)->collect(e| e.operationInput),
)
}

Я по-прежнему не получаю надлежащего результата, хотя я инициализировал экземпляр исходной метамодели.

Я был бы признателен за вашу помощь в том, как включить преобразования «многие ко многим» ((0..n) или (1..n)) .


person nour    schedule 01.03.2021    source источник


Ответы (1)


ATL — это язык декларативного преобразования, поэтому вам лучше просто указать, что должно произойти, но не как, поэтому вместо императивного туннелирования, чтобы справиться с множеством параметров функции, просто напишите отдельное правило, которое связывает 1 параметр с 1 вводом операции в контексте функции, содержащей параметр, и операции, содержащей ввод операции.

Если вы действительно хотите преобразовать императивно, вы можете предпочесть QVTo.

(allInstances() почти всегда является неправильным решением. В лучшем случае неэффективным, в худшем случае способным использовать много неправильных вкладов.)

person Ed Willink    schedule 01.03.2021