加速 Collection,共 Collection 秒

Acceleo Collection of Collections

我已经定义了这个查询

[query public genCascadePath(aCSharpResourceModel : CSharpResourceModel) : Sequence(Sequence(CSharpResourceModel)) =
    aCSharpResourceModel.hasRelatedCSharpRMManager->collect(rmm | rmm.hasRelatedCSharpRModel->asSequence()->prepend(aCSharpResourceModel))
/]

我实际做的是:

  1. 从 "aCSharpModel"

  2. 中获取一个序列
  3. 对于这个序列中的每一个元素,我都将其定义为一个序列,并在前面加上另一个元素(collect里面的rmm.hasRelatedCSharpRModel是无关紧要的,只是一对一的关系)

所以我需要这样的东西:

{element} -> {{element , element1},{element, element2}}

但是当我尝试访问模板结果中的每个内部序列时,例如:

[for (path :Sequence(CSharpResourceModel) | aCSharpResourceModelManager.hasRelatedCSharpRModel.genCascadePath())  separator(' -> \n')]
[/for]

我收到一个错误:

org.eclipse.acceleo.engine.AcceleoEvaluationException: Invalid type for iteration at line 18 in Module TODODbResourceRepositoryCSharpFile for block for (genCascadePath(aCSharpResourceModelManager.hasRelatedCSharpRModel)) separator(' -> '). org.eclipse.emf.ecore.impl.DynamicEObjectImpl was not an instanceof Sequence(CSharpResourceModel).

如果我尝试执行相同的 for 循环,但迭代器类型为 CSharpResourceModel 而不是 Sequence(CSharpResourceModel),它不会产生错误,但它将我的查询结果视为单个序列,就像一个扁平的序列。

问题是我需要有我在开始时描述的行为。

我怎样才能做到这一点?

谢谢。

在 OCL 中,"collect" 会使结果变平。如果您不想要扁平化的结果,则应使用 "collectNested" 操作。有关详细信息,请参阅 Acceleo documentation