| set(a) | K(a) contains keys(T(a)) |
| cp(a) | Union all I(e) for all e in C(a) |
| magic(a) | K(a) + {for k in K(a): k - cp(a)} |
| jk(a, b) | {for ka in K(a), for kb in K(b): ka + kb} |
| const(a) | there is no (v, lvl) in V(a) where lvl = 0 |
| ext-V(a) | {for (v, lvl) in V(a) where lvl != 0: (v, lvl - 1)} |
| ext-C(a) | {for (e, v) in C(a) where min({for (x, lvl) in V(v): lvl}) > depth(v) - depth(a)} |
| Class | Expression | T | V | I | C | K |
|---|---|---|---|---|---|---|
| Variable | a | T(env(a).a) | {(a, level(env(a)))} | env(a).a | {} | {if collection(env(a).a): K(T) else {}} |
| Get | a.b | T(T(a).b) | V(a) | {if (set(a) && (unique(T(a).b) || reference(~(T(a).b)))): I(a)} | C(a) | {if (set(a) && unique(T(a).b)): K(T), if (K(a) contains {}): {}} |
| Define | name = expr | T(expr)[1..1] name; | V(expr) | I(expr) | C(expr) | {if (set(expr)): {name} else {}} |
| Filter | filter(expr, cond) | T(expr) | V(expr) + ext-V(cond) | I(expr) | C(expr) + ext-C(cond) | magic(expr) |
| AbstractJoin | join(left, right, cond) | T(left) + T(right) | V(left) + V(right) + ext-V(cond) | I(left) + I(right) | {if inner || cross: C(left) + C(right) + ext-C(cond), if left outer: C(left), if right outer: C(right)} | magic(jk(left, right)) |
| And | a and b | Boolean | V(a) + V(b) | N/A | C(a) + C(b) | N/A |
| Or | a or b | Boolean | V(a) + V(b) | N/A | C(a) * C(b) | N/A |
| Equals | a == b | Boolean | V(a) + V(b) | N/A | {if const(a): b, if const(b): a} | N/A |
| Not | not a | Boolean | V(a) | N/A | {} | N/A |
| Exists | exists(expr) | Boolean | V(expr) | N/A | C(expr) | N/A |