Previous section   Next section

Defining a Computed Property

Defining a Computed Property

In Caché, you can define computed properties, whose values are computed via ObjectScript, possibly based on other properties. The generic phrase computed properties (or computed fields) includes both of the following variations:
  • Always computed — The value of this property is calculated when it is accessed. It is never stored in the database.
  • Triggered computed — The value of this property is recalculated when triggered (details given below).
    If the property is defined in a persistent class, its value is stored in the database.
In both cases, the recalculation is performed whether you use object access or an SQL query.
There are five property keywords (SqlComputed, SqlComputeCode, SqlComputeOnChange, Transient, Calculated) that control if and how a property is computed. The following table summarizes the possibilities:
    SqlComputed is true (and SqlComputeCode is defined) SqlComputed is false
Calculated is true Transient is either true or false Property is always computed Property is not computed
Calculated is false Transient is true
Transient is false Property is triggered computed (SqlComputeOnChange can also be specified in this case)
To define a computed property, do the following:
  • Include the SqlComputed keyword in the property definition. (That is, specify the SqlComputed keyword as true.)
  • Include the SqlComputeCode keyword in the property definition. For the value of this keyword, specify (in curly braces) a line of ObjectScript code that sets the value of the property, according to rules given in “SqlComputeCode” in the reference “Property Keywords” in Caché Class Definition Reference. For example:
    Property FullName As %String [ SqlComputeCode = {set {*}={FirstName}_" "_{LastName}}, SqlComputed ];
    
  • If you want to make the property always computed, specify the Calculated keyword as true in the property definition.
    Or, if you want to make the property triggered computed, do not include the Calculated and Transient keywords in the property definition. (That is, make sure both keywords are false.)
  • If the property is triggered computed, optionally specify SqlComputeOnChange.
    This keyword can specify one or more properties. When any of these properties change in value, the triggered property is recomputed. Note that you must use the property names rather than the names given by SqlFieldName, which is discussed later in this chapter). For example (with artificial line breaks):
    Property messageId As %Integer [ 
    SqlComputeCode = { set {*}=$Select({Status}="":0,1:$List($List($Extract({Status},3,$Length({Status}))))) }, 
    SqlComputed, SqlComputeOnChange = Status ];
    
    For another example (with artificial line breaks):
    Property Test2 As %String [ SqlComputeCode = { set {*}={Refprop1}_{Refprop2}}, SqlComputed, 
    SqlComputeOnChange = (Refprop1, Refprop2) ];
    
    The value of SqlComputeOnChange can also include the values %%INSERT or %%UPDATE; for details, see SqlComputeOnChange.
If you intend to index this field, use deterministic code, rather than nondeterministic code. Caché cannot maintain an index on the results of nondeterministic code because it is not possible to reliably remove stale index key values. (Deterministic code returns the same value every time when passed the same arguments. So for example, code that returns $h is nondeterministic, because $h is modified outside of the control of the function.)
Also see the Calculated keyword in the Caché Class Definition Reference. And see “Controlling the SQL Projection of Computed Properties,” later in this chapter.
Previous section   Next section