# Relational algebra

Envision is a hybrid between array programming and relational algebra. Envision is geared towards operations performed over relational databases, as commonly found in enterprise systems, but it also abstracts away the need for loops, both for performance and reliability purposes, as commonly done with array programming languages.

Every variable in Envision belongs to a table, and technically, identifies a vector, that is, a collection of values with one value per table line. Thus, when two variables belong to the same table, it becomes possible to perform operations on all lines at the same time.

table Colors = with
[| as French, as English |]
[| "Rouge", "Red" |]
[| "Bleu", "Blue" |]
[| "Vert", "Green" |]

Colors.Explain = "\{Colors.French} means \{Colors.English}."

show table "My Translation" with Colors.Explain


The script above outputs a table that contains the 3 lines with the following content:

Explain
Rouge means Red
Bleu means Blue
Vert means Green

The text format operation used to compute Colors.Explain has been done for all the lines of the Colors table at once.

Numeric operations can be performed in a similar way :

table Orders = with
[| as Quantity, as UnitPrice |]
[| 3, 12.00 |]
[| 7, 20.50 |]
[| 2, 25.00 |]

tax = 0.2
Orders.Charge = Orders.Quantity * Orders.UnitPrice * (1 + tax)

show table "Tax Included" with Orders.Charge


Which gives the resulting table:

Charge
43.2
172.2
60

The attentive reader might have noticed that the script above is mixing two tables in the calculation of Orders.Charge: the Orders table and the Scalar table, the latter being implicit for both tax and the 1 number literal. This mechanism is referred to as broadcasting, and will be detailed in the following.

A vector in the Envision realm is equivalent to a column in the database realm. However, unlike SQL databases, creating and manipulating columns in Envision is the natural expected way to proceed. By leveraging operations that are automatically performed over a vector (i.e. a column), Envision removes the need to resort to manual loops (i.e. for loops) in the vast majority of supply chain situations.

Advanced remark: Envision tables are what Python or R users would recognize as Data Frames. Under the hood, Envision does not reify all the vectors, even when those vectors get named through a variable. For performance, the compiler attempts to inline calculations whenever inlining is deemed more efficient than the alternative. For example, renaming a vector i.e. Orders.ChargeBis = Orders.Charge is a zero-cost operation in Envision.