This is big news! Now OCL has a closure operation (thanks to Martin for alerting me ). This means that now in OCL you could write something like parents->closure(children) to compute the set of parents.children, parents.children.children, parents.children.children.children etc.
I’ve been missing this feature for a long time since I found similar situations very often and I was tired of specifying recursive OCL operations to simulate the closure myself.
From the OCL standard 2.3 Beta 2 : Closure operation uses the same syntax as the select and reject iterators and is written as one of
- source>closure( v : Type | expression-with-v )
- source>closure( v | expression-with-v )
- source>closure( expression )
The returned collection of the closure iteration is an accumulation of the source, and the collections resulting from the recursive invocation of expression-with-v in which v is associated exactly once with each distinct element of the returned collection. The iteration terminates when expression-with-v returns empty collections or collections containing only already accumulated elements. The collection type of the result collection is the unique form (Set or OrderedSet) of the original source collection. If the source collection is ordered, the result is in depth first preorder.
So, what’s your opinion? Are you happy with this new feature? Were you missing it?
FNR Pearl Chair. Head of the Software Engineering RDI Unit at LIST. Affiliate Professor at University of Luxembourg. More about me.
Soon we will reach Smalltalk… 🙂
The single-most useful addition to OCL in years. Long overdue, to…
What a really nice operation !!! … I am working with Acceleo in transforming classes to tables and the closure operation will be very usefull for make my templates and querys more elegant 😉
Almost a decade later I found out about this operation and its purpose. Thank you!