Intersect

Logical AND

Signature

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

Examples

intersect(
  restrict(suppliers, eq(:city, 'Paris')),
  restrict(suppliers, gt(:status, 10)))

Description

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

The left and right relations must be intersect-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 INTERSECT ALL.

It is sometimes idiomatic in Alf to use intersect as a logical AND, as illustrated below. So far, the optimizer/compiler is not smart enough to translate the former into the latter (which is likely to have a better query when using faithful SQL compilation and available SQL DBMSs). Any patch is welcome here too!

intersect(
  restrict(suppliers, eq(:city, 'Paris')),
  restrict(suppliers, gt(:status, 10)))

is equivalent to

restrict(suppliers, eq(:city, 'Paris') & gt(:status, 10))