Expression functions
Expression functions
This page is generated from the test data (EXPRESSION_TABLES and QUANTIFIER_TABLES in @meshfw/runtime/testing); a test fails when it is out of date. It is the written definition of ADR-0012, option A: Mesh defines each function, follows SQL’s three-valued logic where the databases agree, and the in-memory form and every SQL evaluator must give these answers. How the rules are applied is in Expressions.
null is both NULL and an unknown boolean. D(n) is the instant n milliseconds after the epoch. T stands for one class of number, string, boolean, date or enum, the same on both sides.
Anything not listed here (string ordering, truthiness, ==, string concatenation, string methods) is not translated: it stays plain TypeScript with JavaScript’s rules, and the build warns.
a === b (eq)
Signature: (T, T) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
1 |
true |
1 |
2 |
false |
0 |
-0 |
true |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
"a" |
"a" |
true |
"a" |
"A" |
false |
"" |
null |
null |
"a" |
"a " |
false |
true |
true |
true |
true |
false |
false |
false |
null |
null |
"open" |
"open" |
true |
"open" |
"done" |
false |
"open" |
null |
null |
D(5) |
D(5) |
true |
D(5) |
D(6) |
false |
D(5) |
null |
null |
a !== b (ne)
Signature: (T, T) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
1 |
false |
1 |
2 |
true |
0 |
-0 |
false |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
"a" |
"a" |
false |
"a" |
"A" |
true |
"" |
null |
null |
"a" |
"a " |
true |
true |
true |
false |
true |
false |
true |
false |
null |
null |
"open" |
"open" |
false |
"open" |
"done" |
true |
"open" |
null |
null |
D(5) |
D(5) |
false |
D(5) |
D(6) |
true |
D(5) |
null |
null |
a === null (isNull)
Signature: (any) -> boolean. Null behaviour: never unknown.
| Argument 1 | Result |
|---|---|
null |
true |
0 |
false |
"" |
false |
false |
false |
D(0) |
false |
"open" |
false |
a !== null (isNotNull)
Signature: (any) -> boolean. Null behaviour: never unknown.
| Argument 1 | Result |
|---|---|
null |
false |
0 |
true |
"" |
true |
false |
true |
D(0) |
true |
"open" |
true |
a < b (lt)
Signature: (number | date, same) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
true |
2 |
2 |
false |
3 |
2 |
false |
-1 |
0 |
true |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
D(5) |
D(6) |
true |
D(6) |
D(6) |
false |
D(6) |
null |
null |
a <= b (lte)
Signature: (number | date, same) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
true |
2 |
2 |
true |
3 |
2 |
false |
-1 |
0 |
true |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
D(5) |
D(6) |
true |
D(6) |
D(6) |
true |
D(6) |
null |
null |
a > b (gt)
Signature: (number | date, same) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
false |
2 |
2 |
false |
3 |
2 |
true |
-1 |
0 |
false |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
D(5) |
D(6) |
false |
D(6) |
D(6) |
false |
D(6) |
null |
null |
a >= b (gte)
Signature: (number | date, same) -> boolean. Null behaviour: any operand null: unknown.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
false |
2 |
2 |
true |
3 |
2 |
true |
-1 |
0 |
false |
1 |
null |
null |
null |
1 |
null |
null |
null |
null |
D(5) |
D(6) |
false |
D(6) |
D(6) |
true |
D(6) |
null |
null |
a && b (and)
Signature: (boolean, boolean) -> boolean. Null behaviour: Kleene.
| Argument 1 | Argument 2 | Result |
|---|---|---|
true |
true |
true |
true |
false |
false |
true |
null |
null |
false |
true |
false |
false |
false |
false |
false |
null |
false |
null |
true |
null |
null |
false |
false |
null |
null |
null |
a || b (or)
Signature: (boolean, boolean) -> boolean. Null behaviour: Kleene.
| Argument 1 | Argument 2 | Result |
|---|---|---|
true |
true |
true |
true |
false |
true |
true |
null |
true |
false |
true |
true |
false |
false |
false |
false |
null |
null |
null |
true |
true |
null |
false |
null |
null |
null |
null |
!a (not)
Signature: (boolean) -> boolean. Null behaviour: null stays unknown.
| Argument 1 | Result |
|---|---|
true |
false |
false |
true |
null |
null |
a + b (add)
Signature: (number, number) -> number. Null behaviour: any operand null: null.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
3 |
0.5 |
0.25 |
0.75 |
-1 |
1 |
0 |
1 |
null |
null |
null |
null |
null |
a - b (sub)
Signature: (number, number) -> number. Null behaviour: any operand null: null.
| Argument 1 | Argument 2 | Result |
|---|---|---|
5 |
3 |
2 |
3 |
5 |
-2 |
null |
3 |
null |
a * b (mul)
Signature: (number, number) -> number. Null behaviour: any operand null: null.
| Argument 1 | Argument 2 | Result |
|---|---|---|
4 |
2.5 |
10 |
0 |
null |
null |
a / b (a float or decimal operand) (div)
Signature: (number, number) -> number. Null behaviour: exact division; any operand null, or a zero divisor: null.
| Argument 1 | Argument 2 | Result |
|---|---|---|
7 |
2 |
3.5 |
-7 |
2 |
-3.5 |
1 |
0 |
null |
0 |
0 |
null |
null |
2 |
null |
2 |
null |
null |
a / b (both integers) (idiv)
Signature: (integer, integer) -> integer. Null behaviour: truncates toward zero; any operand null, or a zero divisor: null.
| Argument 1 | Argument 2 | Result |
|---|---|---|
7 |
2 |
3 |
-7 |
2 |
-3 |
7 |
-2 |
-3 |
-7 |
-2 |
3 |
6 |
3 |
2 |
0 |
5 |
0 |
1 |
0 |
null |
0 |
0 |
null |
null |
2 |
null |
2 |
null |
null |
-a (neg)
Signature: (number) -> number. Null behaviour: null: null.
| Argument 1 | Result |
|---|---|
3 |
-3 |
0 |
0 |
null |
null |
a.length (length)
Signature: (string | list) -> number. Null behaviour: null string: null; a list is never null.
| Argument 1 | Result |
|---|---|
"" |
0 |
"abc" |
3 |
"\u{e9}" |
1 |
"e\u{301}" |
2 |
"\u{1f600}" |
1 |
null |
null |
[] |
0 |
[{…}, {…}] |
2 |
now() (now)
Signature: () -> date. Null behaviour: never null; one instant per scope.
| Clock | Result |
|---|---|
D(1700000123456) |
D(1700000123456) |
today() (today)
Signature: () -> date. Null behaviour: never null; now() at 00:00 UTC.
| Clock | Result |
|---|---|
D(1700000123456) |
D(1699920000000) |
a ?? b (coalesce)
Signature: (T, T) -> T. Null behaviour: a unless a is null, else b.
| Argument 1 | Argument 2 | Result |
|---|---|---|
1 |
2 |
1 |
null |
2 |
2 |
null |
null |
null |
0 |
5 |
0 |
"" |
"x" |
"" |
false |
true |
false |
null |
false |
false |
D(1) |
D(2) |
D(1) |
c ? a : b (cond)
Signature: (boolean, T, T) -> T. Null behaviour: unknown test: the else branch.
| Argument 1 | Argument 2 | Argument 3 | Result |
|---|---|---|---|
true |
1 |
2 |
1 |
false |
1 |
2 |
2 |
null |
1 |
2 |
2 |
true |
null |
2 |
null |
false |
1 |
null |
null |
Quantifiers over a loaded has-many
some, every, find and filter take a list and a predicate. The column lists the predicate’s result for each element, in order (T true, F false, N unknown); the elements are numbered from 0. An unknown predicate never makes some true and always makes every false; M10 translates every(p) as NOT EXISTS (… WHERE p IS NOT TRUE). A list that was not loaded throws FrameworkError.
some
| Predicate results | Result |
|---|---|
[] |
false |
[T, F] |
true |
[F, F] |
false |
[N, F] |
false |
[N, T] |
true |
every
| Predicate results | Result |
|---|---|
[] |
true |
[T, T] |
true |
[T, F] |
false |
[T, N] |
false |
[N] |
false |
find
| Predicate results | Result |
|---|---|
[] |
null |
[F, T, T] |
1 |
[N, F] |
null |
filter
| Predicate results | Result |
|---|---|
[T, F, N, T] |
[0, 3] |
[] |
[] |