Andl now supports recursive queries. This can be seen as a direct extension of the Relational Algebra for the situation where a query cannot be satisfied in a single operation.
Imagine a company organisation chart. One query will find every employee who reports to a given boss, but it takes a succession of queries to find out who reports to that employee, and who reports to them, until at last we reach the workers and no-one reports to them.
Here is the data for a simple orgchart (data thanks to SQLite).
name | boss ------------- Alice | Bob | Alice Cindy | Alice Dave | Bob Emma | Bob Fred | Cindy Gail | Cindy
Here is the Andl code to query it.
def orgchart:db(csv) orgchart ua := {{ name:= 'Alice', level := 0 }} recurse( {{ boss := name, level := level+1 }} compose orgchart) ua ua [{ t:=fill('.', level*3) & name }]
And here is the result. The recurse function repeatedly evaluates the join with successive tuples starting from the seed, until no more can be found.
name | level -------------- Alice | 0 Bob | 1 Cindy | 1 Dave | 2 Emma | 2 Fred | 2 Gail | 2
t ---------- Alice ...Bob ...Cindy ......Dave ......Emma ......Fred ......Gail