Logical OR


union(left: Relation, right: Relation) -> Relation


union(project(suppliers, [:city]), project(parts, [:city]))


Computes the relation as the set union of left and right.

The left and right relations must be union-compatible, meaning that they must have same heading (type inheritance is partly supported through ruby's own type system, so that the actual behavior is slighlty more permissive).

Implementation notes

Unlike SQL, this operator ALWAYS remove duplicates. There is no way, in Alf, to compute bags of tuples and therefore no way to express something such as SQL's UNION ALL.

The optimizer is not smart enough so far to discover when operands are actually disjoint and duplicate removal not needed (e.g. the SQL compiler never generates UNION ALL). Any patch improving this is welcome!

Similarly, it is sometimes idiomatic in Alf to use union as a logical OR, as illustrated below. So far, the optimizer/compiler is not smart enough to translate the former in the latter (which is likely to have a better query plan, especially when using faithful SQL compilation and usual SQL DBMSs). Any patch is welcome here too!

  restrict(suppliers, city: 'Paris'),
  restrict(suppliers, city: 'London'))

is equivalent to

restrict(suppliers, eq(:city, 'Paris') | eq(:city, 'London'))