COLLECT FROM NAMED [WHERE]
Version of the COLLECT FROM [WHERE] function for complex nested selections with an alias.
Syntax COLLECT entity | attribute FROM collection NAMED alias [ WHERE ( expression ) ] |
Inputsentity or attribute - Entity or attribute to collect. This should contain the alias, e.g. alias.Name. collection - A collection of entity instances. alias - A name for the collection. expression - Boolean expression that represents the criterion the instance has to meet.
Return type Examples
Suppose the following model with only instances of entity Person . Person.hasChildren is a relation from Person to Person.
Person instance | Person.Name | Person.Age | Person.hasChildren |
---|
Person_1 | “Kim” | 16 |
| Person_2 | “Rick” | 38 | Person_3, Person_5 | Person_3 | “Bob” | 8 |
| Person_4 | “Julia” | 42 | Person_1 | Person_5 | “Sam” | 3 |
| Person_6 | “Joan” | 34 | Person_3, Person_5 |
To retrieve all the parent names, we use this expression: COLLECT Parent.name
FROM
COLLECT Person
FROM ALL Person
WHERE ( Person.hasChildren != ? ) NAMED Parent |
This expression results in “Rick”, “Julia” and “Joan”. To retrieve all children names, we use this expression: COLLECT Child
FROM (
COLLECT Person.hasChildren
FROM ALL Person
WHERE ( Person.hasChildren != ? ) ) NAMED Child |
This expression results in a collection of three instances of Person (i.e Person_1 , Person_3 and Person_5 , with names Kim, Bob and Sam). To retrieve all children younger than 15, we use this expression: COLLECT Child
FROM (
COLLECT Person.hasChildren
FROM ALL Person
WHERE ( Person.hasChildren != ? ) ) NAMED Child
WHERE ( Child.Age < 15 ) |
This expression results in a collection of two instances of Person (i.e Person_3 and Person_5 , with names Bob and Sam). To retrieve the children’s names with a parent older than 40 years: COLLECT Child.Name
FROM (
COLLECT Person.hasChildren
FROM ALL Person
WHERE ( Person.hasChildren != ? AND Person.Age > 40 ) ) NAMED Child |
This expression results in a collection with only the name “Kim”. You can make it as complex as you like, for example: COLLECT Child.Name
FROM (
COLLECT Parent.hasChildren
FROM (
COLLECT Person
FROM ALL Person
WHERE ( Person.hasChildren != ? ) ) NAMED Parent
WHERE ( Parent.Age > 40 )
) NAMED Child
WHERE ( Child.Age < 18 ) |
This expression results also in a collection with only the name “Kim”. In some occasions, a local variable could be a good alternative for using an alias. E.g. if you want a collection of all persons except the person that is currently active, this would be simple and transparent: thisPerson := Person ;
COLLECT Person
FROM ALL Person
WHERE ( Person != thisPerson ) |
|

|