如何使用混合分类器编写递归 OCL 查询?

How to write a recursive OCL query with mixed classifiers?

我有一个 EMF 元模型,如下所述:

class Application
  - runsOn: Host [0..*]

interface Host

class VirtualMachine implements Host
  - runsOn: Host [0..*]

class PhysicalMachine implements Host

我想使用 OCL 回答的问题是: 找到给定 Application 实际运行(直接或传递)的所有 PhysicalMachines。请注意,以下所有路径都可能出现在实例模型中:

- Application runsOn PhysicalServer
- Application runsOn VirtualMachine runsOn PhysicalServer
- Application runsOn VirtualMachine runsOn VirtualMachine runsOn PhysicalServer
- ...

我想这可以用 OCL 的 closure 运算符以某种方式表达,但我不太清楚正确的语法。

经过大量修改,我想我找到了答案。

self.runsOn->asSet()
    ->closure(host: Host | 
        if host.oclIsKindOf(VirtualMachine) then 
            host.oclAsType(VirtualMachine).runsOn 
        else
            host->asSet() 
        endif
    )

这似乎有效。以上查询如有错误或低效请指正。

编辑: 感谢下面 Ed Willink 的评论,我已将上述查询简化为:

self.runsOn->closure(host: Host | host->selectByKind(VirtualMachine).runsOn)