Sha256: 24cbc5644317327fc27074bafb869044561ba5afbb734e371431817e68205a9d

Contents?: true

Size: 1.18 KB

Versions: 6

Compression:

Stored size: 1.18 KB

Contents

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

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
alf-shell-0.16.4 doc/txt/minus.txt
alf-shell-0.16.3 doc/txt/minus.txt
alf-shell-0.16.2 doc/txt/minus.txt
alf-shell-0.16.1 doc/txt/minus.txt
alf-shell-0.16.0 doc/txt/minus.txt
alf-shell-0.15.0 doc/txt/minus.txt