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 |