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))