Minus

Logical AND NOT

Signature

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

Examples

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

Description

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

The left and right relations must be minus-compatible, which 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 EXCEPT ALL.

It is sometimes idiomatic in Alf to use intersect as a logical AND NOT, 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 plan when using faithful SQL compilation and available SQL DBMSs). Any patch is welcome here too!

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

is equivalent to

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