如何使用混合分类器编写递归 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
实际运行(直接或传递)的所有 PhysicalMachine
s。请注意,以下所有路径都可能出现在实例模型中:
- 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)
我有一个 EMF 元模型,如下所述:
class Application
- runsOn: Host [0..*]
interface Host
class VirtualMachine implements Host
- runsOn: Host [0..*]
class PhysicalMachine implements Host
我想使用 OCL 回答的问题是: 找到给定 Application
实际运行(直接或传递)的所有 PhysicalMachine
s。请注意,以下所有路径都可能出现在实例模型中:
- 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)