You are viewing the documentation for Blueriq 16. Documentation for other versions is available in our documentation directory.
Learn more about the functions ISNULL, ISUNKNOWN, IFUNKNOWN, IS A, TYPE OF, ISACTIVE, GUID.
Overview
Function | Description |
---|---|
ISNULL | Checks whether a value is unknown. |
ISUNKNOWN | Replaces a value if that value is unknown. |
IFUNKNOWN | Alternative notation of the ISUNKNOWN function, which increases readability especially for long expressions. |
IS A | Checks the entity type of an instance. |
TYPE OF | Determines the entity type of an instance. |
ISACTIVE | Determines if an instance of a specific entity type is currently active. |
GUID | Generates a globally unique identifier which can later be used to uniquely mark and recognize a desired element. |
Functions
ISNULL
Checks whether a value is unknown.
Syntax
ISNULL ( expression )
- expression - Expression that is checked.
Return type
- boolean - TRUE of the attribute is unknown, FALSE otherwise
Examples
Suppose the following data model.
Person.name | Person.SequenceNumber |
---|---|
“Bob” | 654 |
“Jane” | ? |
Active Person | Expression | Result | Type |
---|---|---|---|
Bob | ISNULL ( Person.SequenceNumber ) | FALSE | boolean |
Jane | ISNULL ( Person.SequenceNumber ) | TRUE | boolean |
ISUNKNOWN
Replaces a value if that value is unknown.
Syntax
ISUNKNOWN ( expression , value )
- expression- Expression of which the value has to be returned if that value is known.
- value - Value to return if the expression value is unknown.
Return type
- any type, equals the expression type
Examples
Suppose the following data model.
Person.name | Person.SequenceNumber |
---|---|
“Bob” | 654 |
“Jane” | ? |
“Mary” | 667 |
“Rick” | ? |
“Ron” | ? |
“Jenny” | 765 |
? | 111 |
Active Person | Expression | Result | Type |
---|---|---|---|
Jane - ? | ISUNKNOWN ( Person.SequenceNumber , 999 ) | 999 | Integer |
Mary - 667 | ISUNKNOWN ( Person.SequenceNumber , 999 ) | 667 | Integer |
? - 111 | ISUNKNOWN ( Person.Name , "customer" ) | "customer" | String |
Both parameters of the ISUNKNOWN
function must be of the same datatype. If they differ in datatype, you get this validation error in studio:
Could not find function: ISUNKNOWN matching arguments System.Collections.ArrayList
IFUNKNOWN
Alternative notation of the ISUNKNOWN function, which increases readability especially for long expressions. This function replaces a value if that value is unknown.
The IFUNKNOWN function takes precedence over any other binary operator (except for the "NOT" operator). For example, this means that the expression A.B AND C.D IFUNKNOWN FALSE will be interpreted as A.B AND (C.D IFUNKNOWN FALSE). You can use parentheses to influence this behavior, e.g. by writing (A.B AND C.D) IFUNKNOWN FALSE. For the "NOT" operator the following expression "X AND NOT B IFUNKNOWN FALSE", can also be read as "X AND ((NOT B) IFUNKNOWN FALSE)"
Syntax
expression IFUNKNOWN value
Inputs
expression- Expression of which the value has to be returned if that value is known.
value - Value to return if the expression value is unknown.
Return type
any type, equals the expression type
Examples
Suppose the following data model.
Person.name | Person.SequenceNumber | Person.HasDrivingLicense |
---|---|---|
“Bob” | 654 | true |
“Jane” | ? | true |
“Mary” | 667 | false |
“Rick” | ? | ? |
“Ron” | ? | false |
“Jenny” | 765 | true |
? | 111 | true |
Active Person | Expression | Result | Type |
---|---|---|---|
Jane - ? - true | Person.SequenceNumber IFUNKNOWN 999 | 999 | Integer |
Mary - 667 - false | Person.SequenceNumber IFUNKNOWN 999 | 667 | Integer |
? - 111 - true | Person.Name IFUNKNOWN "customer" | "customer" | String |
"Rick" - ? - ? | NOT Person.HasDrivingLicense IFUNKNOWN false | false | Boolean |
Both parameters of the IFUNKNOWN
function must be of the same datatype. If they differ in datatype, you get this validation error:
Could not find function: IFUNKNOWN matching arguments System.Collections.ArrayList
IS A
Checks the entity type of an instance. The function returns TRUE if the selected instance is of the specified entity.
Syntax
instance IS A entity_name
- instance - Instance to check.
- entity_name - Name of the entity as string.
Return type
- Boolean
Examples
Suppose a domain model in which there is a singleton entity Residence
that has a multivalued relation hasRooms
with Room
. Room
is the base entity for singleton Kitchen
and not singletons Bedroom
and Bathroom
.
If you want to determine the number of bedrooms is the residence:
COUNT ( COLLECT Room FROM Residence.hasRooms WHERE ( Room IS A “Bedroom” ) )
If you want to determine the number of bathrooms is the residence:
COUNT ( COLLECT Room FROM Residence.hasRooms WHERE ( Room IS A “Bathroom” ) )
TYPE OF
Determines the entity type of an instance. The function returns the name of the entity.
Syntax
TYPE OF base_entity
Input
- base_entity - Name of the instance's base entity.
Return type
- string
Examples
Suppose a domain model in which there is a singleton entity Residence
that has a multivalued relation hasRooms
with Room
. Room
is the base entity for singleton Kitchen
and not singletons Bedroom
and Bathroom
.
- for the
Kitchen
instance the expression( TYPE OF Room ) = “Kitchen”
- for the
Bedroom
instances the expression( TYPE OF Room ) = “Bedroom”
ISACTIVE
Determines if an instance of a specific entity type is currently active.
ISACTIVE instances [WHERE condition]
Inputs
- instances - instances to search
- condition - optional condition to limit the collection of instances to check
Return type
boolean - TRUE if one of the instances is active, FALSE otherwise
Singletons are always active, so ISACTIVE
<singleton> will always return TRUE
Examples
Suppose the following data model.
instance_id | Person.name | Person.Age |
---|---|---|
Person_1 | “Bob” | 14 |
Person_2 | “Jane” | 25 |
Person_3 | “Mary” | 30 |
Active Person | Expression | Result | Type | Note |
---|---|---|---|---|
None | ISACTIVE Person | FALSE | boolean | |
Person_1 | ISACTIVE Person | TRUE | boolean | |
Person_1 | ISACTIVE Person WHERE Person.Age >= 18 | FALSE | boolean | |
None | ISACTIVE system | TRUE | boolean | |
None | Person.Age >= 18 | Error | No Person is active | |
None | ( ISACTIVE Person ) AND Person.Age >= 18 | FALSE | boolean | The expression is evaluated left-to-right and fails on ( ISACTIVE Person ) instead of giving an error |
GUID
Generates a globally unique identifier which can later be used to uniquely mark and recognize a desired element. The GUIDs are represented as 32 hexadecimal digits, displayed in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters.
Syntax
GUID()
Return type
String - the generated GUID
Examples
Expression | Result |
---|---|
GUID() | 4a18d6a7-03c1-47f9-b6aa-eae7d746050e |
GUID() | 91d37298-23ec-4bd4-8523-9c7e7745cb9d |
3 Comments
Ronald Peterson
Jul 11, 2018What is the best use of the GUID function? Should I make an attribute userset with the result?
Unknown User (m.schadd)
Feb 15, 2021Ronald Peterson Well that depends. The trueth maintenance mechanism will not create a new guid unless something else in the expression changes (e.g., system.currentPage + GUID(), which is discouraged). So as long as your session is alive, the guid stays the same. In case that you send the guid to an external service, the external service can store and use the guid. In case you want to store the guid value in an aggregate, then you might want to make it user-set. As only user-set values are stored in an aggregate, you would get a new guid when reading the aggregate. In case this is not desired, you should make the attribute user set first (using the Service call type: AQ_Instance_Update). This is similar to the consideration when using NOW or TODAY.
Pieter Lubbers
Aug 08, 2018Can you confirm that the ISACTIVE function works the same as a reusable expression? That is: without context.
I tried the following function (in a repeat box on a container) without success:
COLLECT A FROM ALL A WHERE( ISACTIVE( B ) AND A.isTrue)
The error states: ALIAS must be specified for each/exists/isactive expressions when the from type is not of entity time.
I recall that the following reusable expression doesn't work with the same error:
{RE} = A.isTRUE
COLLECT A FROM ALL A WHERE( A.Number = COLLECT B FROM ALL B WHERE( {RE} AND B.Number = A.Number)
Or more simply:
{RE} = ISACTIVE(A) → Works
{RE} = ISACTIVE(A) AND TRUE → Error