Expressions
Expressions are used in dispatch displays, charts and tables. In the dispatch context they access data attributes through the values
object.
Expression can include function and any other path values.
Example, calculate BMI from metric weight and height.
values.weight / (values.height) ^ 2
Data
Pick and apply are passed objects that can be accessed from the expression.
Pick is passed:
1. values
- dispatch data
2. dispatch
- other attributes on the dispatch
Apply is passed:
1. ls
- an array of values that are the result of pick
Syntax
Operator | Name | Syntax | Associativity | Example | Result |
---|---|---|---|---|---|
(, ) |
Grouping | (x) |
None | 2 * (3 + 4) |
14 |
[, ] |
Matrix, Index | [...] |
None | [[1,2],[3,4]] |
[[1,2],[3,4]] |
{, } |
Object | {...} |
None | {a: 1, b: 2} |
{a: 1, b: 2} |
, |
Parameter separator | x, y |
L🡒R | max(2, 1, 5) |
5 |
. |
Property accessor | obj.prop |
L🡒R | obj={a: 12}; obj.a |
12 |
; |
Statement separator | x; y |
L🡒R | a=2; b=3; a*b |
[6] |
; |
Row separator | [x; y] |
L🡒R | [1,2;3,4] |
[[1,2],[3,4]] |
\n |
Statement separator | x \n y |
L🡒R | a=2 \n b=3 \n a*b |
[2,3,6] |
+ |
Add | x + y |
L🡒R | 4 + 5 |
9 |
+ |
Unary plus | +y |
L🡐R | +4 |
4 |
- |
Subtract | x - y |
L🡒R | 7 - 3 |
4 |
- |
Unary minus | -y |
L🡐R | -4 |
-4 |
* |
Multiply | x * y |
L🡒R | 2 * 3 |
6 |
.* |
Element-wise multiply | x .* y |
L🡒R | [1,2,3] .* [1,2,3] |
[1,4,9] |
/ |
Divide | x / y |
L🡒R | 6 / 2 |
3 |
./ |
Element-wise divide | x ./ y |
L🡒R | [9,6,4] ./ [3,2,2] |
[3,3,2] |
% , mod |
Modulus | x % y |
L🡒R | 8 % 3 |
2 |
^ |
Power | x ^ y |
L🡐R | 2 ^ 3 |
8 |
.^ |
Element-wise power | x .^ y |
L🡐R | [2,3] .^ [3,3] |
[8,27] |
' |
Transpose | y' |
L🡒R | [[1,2],[3,4]]' |
[[1,3],[2,4]] |
! |
Factorial | y! |
L🡒R | 5! |
120 |
& |
Bitwise and | x & y |
L🡒R | 5 & 3 |
1 |
~ |
Bitwise not | ~x |
L🡐R | ~2 |
-3 |
\| |
Bitwise or | x \| y |
L🡒R | 5 \| 3 |
7 |
^\| |
Bitwise xor | x ^\| y |
L🡒R | 5 ^\| 2 |
7 |
<< |
Left shift | x << y |
L🡒R | 4 << 1 |
8 |
>> |
Right arithmetic shift | x >> y |
L🡒R | 8 >> 1 |
4 |
>>> |
Right logical shift | x >>> y |
L🡒R | -8 >>> 1 |
2147483644 |
and |
Logical and | x and y |
L🡒R | true and false |
false |
not |
Logical not | not y |
L🡐R | not true |
false |
or |
Logical or | x or y |
L🡒R | true or false |
true |
xor |
Logical xor | x xor y |
L🡒R | true xor true |
false |
= |
Assignment | x = y |
L🡐R | a = 5 |
5 |
? : |
Conditional expression | x ? y : z |
L🡐R | 15 > 100 ? 1 : -1 |
-1 |
: |
Range | x : y |
L🡐R | 1:4 |
[1,2,3,4] |
to , in |
Unit conversion | x to y |
L🡒R | 2 inch to cm |
5.08 cm |
== |
Equal | x == y |
L🡒R | 2 == 4 - 2 |
true |
!= |
Unequal | x != y |
L🡒R | 2 != 3 |
true |
< |
Smaller | x < y |
L🡒R | 2 < 3 |
true |
> |
Larger | x > y |
L🡒R | 2 > 3 |
false |
<= |
Smallereq | x <= y |
L🡒R | 4 <= 3 |
false |
>= |
Largereq | x >= y |
L🡒R | 2 + 4 >= 6 |
true |
Functions
Both pick and apply support functions. These can be part of the
mad(..)
- Median absolute deviationmax(..)
- Maximum valuemean(..)
- Mean valuemedian(..)
- Median valuemin(..)
- Minimum valuemode(..)
- Modeprod(..)
- Productstd(..)
- Standard deviationsum(..)
- Compute the sumvariance(..)
- Provide a Maximum valuetime(metric)
- Compute the delta in a time range metrictimeStart(metric)
- Provide the start time of a time range metrictimeEnd(metric)
- Provide the end time of a time range metricat(ls, n)
- Access a specific value in the list; 0 is the first, -1 the last.isDefined(n)
- check if a variable has a value and return values based on thattoNumber(n, str, left, right)
- turn a string into a value with the expression n === str ? left : rightifNull(n, default=0)
- if N is not defined then replace with defaultifNaN(n, default=0)
- if N is not number than replace with a default valuesymbol(...)
- Returns the referenced attribute as a symbol
Some examples
Example 1
pick = 1
apply = sum(ls)
The value 1 would be generated for each dispatch and ls would be [1, 1, 1, ..] with a 1 for each dispatch.
Example 2
pick = values.size * 2
apply = mean(ls)
Sized times two would be generated for each dispatch, based on the data, and then that array of values would be passed to mean. The result would be the mean of size * 2 for every dispatch in the series.
Example 3
pick = values.status == values.goal ? 3 : values.status == 0 ? 1 : values.status > 0 ? 2 : nil
apply = mean(ls)
In this example we have three outcomes: 3 if we hit the goal, 1 if status is zero and 2 if between the goal and zero. This is then passed to mean though presumably this would
This can then use conditional formatting to display different symbols, for example:
"rules": [
{
"rule": "values.result == 3",
"value": "◎"
},
{
"rule": "values.result == 2",
"value": "◯"
},
{
"rule": "values.result == 1",
"value": "✕"
}
]