| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Rel8.Internal.Query.Loop
Documentation
loop :: Table Expr a => Query a -> (a -> Query a) -> Query a Source #
loop allows the construction of recursive queries, using Postgres'
WITH RECURSIVE
under the hood. The first argument to loop is what the Postgres
documentation refers to as the "non-recursive term" and the second
argument is the "recursive term", which is defined in terms of the result
of the "non-recursive term". loop uses UNION ALL to combine the
recursive and non-recursive terms.
Denotionally, is the smallest set of rows loop s fr such
that
r == s `unionAll` (r >>= f)
Operationally, takes each row in an initial set loop s fs and
supplies it to f, resulting in a new generation of rows which are added
to the result set. Each row from this new generation is then fed back to
f, and this process is repeated until a generation comes along for which
f returns an empty set for each row therein.
loopDistinct :: Table Expr a => Query a -> (a -> Query a) -> Query a Source #
loopDistinct is like loop but uses UNION instead of UNION ALL to
combine the recursive and non-recursive terms.
Denotationally, is the smallest set of rows
loopDistinct s fr such that
r == s `union` (r >>= f)
Operationally, takes each distinct row in an
initial set loopDistinct s fs and supplies it to f, resulting in a new generation of
rows. Any rows returned by f that already exist in the result set are not
considered part of this new generation by loopDistinct (in contrast to
loop). This new generation is then added to the result set, and each row
therein is then fed back to f, and this process is repeated until a
generation comes along for which f returns no rows that don't already
exist in the result set.