Projection - Operation Add Supporting Attribute
Overview
AddSupportingAttribute is a projection operation that adds a user-specified supporting attribute to the final resolved entity. As the name suggests, the newly created supporting attribute will be added in support of another attribute. The information about which the attribute’s in support of attribute is specified in the argument of the trait is.addedInSupportOf
.
It is also important to notice that the supporting attribute created will be virtual and it will have the “is.virtual.attribute” applied to it. When working with data, be aware that virtual attributes might never have corresponding data values in an entity's partition or might only have data values if special measures are taken to manifest them.
A new directive virtual
was introduced to facilitate the modeling of scenarios in which the virtual attributes are not wanted. It is a good practice to add a condition “virtual” when dealing with the add supporting attribute operation so they can be filtered out if not needed.
Note: you can access the API reference for this operation on this link.
Note: The argument value of the
is.addedInSupportOf
is currently set to point to the last attribute that came from the source of the projections. This behavior mimics how resolution guidance works but it is likely to be refined in the upcoming releases.
Examples
The examples below refer to the Person
entity as defined here.
{
"entityName": "Person",
"hasAttributes": [
{
"name": "name",
"dataType": "string"
},
{
"name": "dateOfBirth",
"dataType": "integer"
},
{
"name": "address",
"dataType": "string"
},
{
"name": "phoneNumber",
"dataType": "string"
},
{
"name": "email",
"dataType": "string"
}
]
}
Using the AddSupportingAttribute operation on a data typed attribute
In some scenarios a data typed attribute can hold a list of constant values to which the attribute value is constrained. Let us first have a look at the attribute definition below.
{
"name": "priorityCode",
"purpose": "hasA",
"dataType": {
"dataTypeReference": "listLookup",
"appliedTraits": [
{
"traitReference": "does.haveDefault",
"arguments": [
{
"entityReference": {
"explanation": "The constantValues below correspond to the attributes of the 'listLookupValues' entityShape which are: {languageTag, displayText, attributeValue, displayOrder}",
"entityShape": "listLookupValues",
"constantValues": [
[
"en",
"Low",
"0",
"0"
],
[
"en",
"Normal",
"1",
"1"
],
[
"en",
"High",
"2",
"2"
]
]
}
}
]
}
]
},
"projection": {
"operations": [
{
"$type": "addSupportingAttribute",
"supportingAttribute": {
"explanation": "This attribute 'priorityCode_display' is added to the entity to provide the localized display text for the value of the listLookup attribute 'priorityCode'",
"name": "priorityCode_display",
"purpose": "hasA",
"dataType": "localizedDisplayText",
"isReadOnly": true
}
}
]
}
}
On the example above, the priorityCode
attribute is constrained to a set of possible values specified by the listLookup
data type. Each entry on the listLookup table follows the structure {languageTag, displayText, attributeValue, displayOrder}
. The priorityCode attribute holds the attributeValue
but it might be also useful to have the displayText
saved somewhere. For this purpose we can add a support attribute. In this case, we are adding the priorityCode_display
to hold the display text.
The resulting resolved priorityCode data typed attribute is:
Data typed attribute |
---|
priorityCode |
priorityCode_display |
Using the AddSupportingAttribute operation on an entity attribute
We can use the AddSupportingAttribute operation to create a supporting attribute.
{
"name": "PersonInfo",
"entity": {
"source": "Person",
"operations": [
{
"$type": "addSupportingAttribute",
"supportingAttribute": {
"name": " age ",
"dataType": "integer"
}
}
]
}
}
The resulting resolved PersonInfo entity typed attribute is:
PersonInfo |
---|
name |
dateOfBirth |
address |
phoneNumber |
age |
Using the AddSupportingAttribute operation when extending an entity
If we have an entity that extends another entity, we can use AddCountAttribute to create a supporting attribute. Given an entity, NewPerson, that extends from the Person entity:
{
"entityName": "Child",
"extendsEntity": {
"source": "Person",
"operations": [
{
"$type": "addSupportingAttribute",
"supportingAttribute": {
"name": " age",
"dataType": "integer"
}
}
]
},
"hasAttributes": []
}
The resulting resolved Child entity is:
Child |
---|
name |
dateOfBirth |
address |
phoneNumber |
age |