2017-12-15 6 views
0

가 나는 EMF의 메타 모델을 가지고 : 주어진 Application 실제로 (직접 또는 이적으로) 실행되는 모든 PhysicalMachine의를 찾을 수 :혼합 된 분류자를 사용하여 재귀 OCL 쿼리를 작성하는 방법은 무엇입니까? 아래에 설명 된대로

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

interface Host 

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

class PhysicalMachine implements Host 

문제는 내가 OCL는 사용하여 응답 할. 다음 경로의 모든 인스턴스 모델에서 발생할 수 있습니다 :

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

나는이 어떻게 든 OCL의 closure 연산자를 사용하여 표현 될 수도 있지만 매우 올바른 구문을 알아낼 수 없습니다 상상.

답변

1

많은 조작을 한 후에 나는 대답을 찾은 것 같습니다.

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

이것은 나타납니다. 위의 쿼리가 잘못되었거나 비효율적 인 경우 저를 수정하십시오.

편집 :가 위의 쿼리를 단순화 이하 에드 Willink에 의해 코멘트에 감사 :

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

외부 - <자산() 적용 이후 아마 중복 : runOn 아마 유일하다. –

+1

응용 프로그램 : runsOn은 아마도 고유하기 때문에 외부 - asSet()은 아마도 중복됩니다. asSet() 내부는 이미 누적 된 호스트에 대한 재귀를 초대하기 때문에 비효율적입니다. 한 번 방문 만 확인하면 클로저가 무한대가되지 않도록 보장합니다. {} 세트가 더 좋을 것입니다. 어휘 효율성이 뛰어나면 on-> closure (host | host-> selectByKind (VirtualMachine) .runsOn)가 더 간단합니다. –

+0

포인터 주셔서 감사합니다, 많이 감사드립니다! – Alan47

관련 문제