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