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