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

问题描述 投票:0回答:1

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

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

interface Host

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

class PhysicalMachine implements Host

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

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

我想这可能会以某种方式使用OCL的closure运算符来表达,但我无法弄清楚正确的语法。

emf ocl
1个回答
1
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.