Add ecto support for range operators
Postgres ranges have convenient operators for doing set math on ranges. We can extend the Ecto DSL to provide convenience macros for working with these operators
e.g.
CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES
(1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
-- Containment
SELECT int4range(10, 20) @> 3;
-- Overlaps
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);
-- Extract the upper bound
SELECT upper(int8range(15, 25));
-- Compute the intersection
SELECT int4range(10, 20) * int4range(15, 25);
-- Is the range empty?
SELECT isempty(numrange(1, 5));
For the complete list, see the Postgres docs.
@davydog187 do you have an idea of how you'd like to handle operators which exist for ranges within postgres but are not valid operators in elixir or are otherwise in use (e.g. @>, &&, -|-)?
| postgres operator | supported in elixir? |
|---|---|
@>, <@ |
❌ |
>>, << |
❌ |
&<, >& |
❌ |
-|- |
❌ |
&&, +, *, - |
✅ (i assume these are already translated by the Ecto query builder) |
there are some unused operators which are maybe similar to the missing operators that could be used: |||, >>>, ~>, <->, etc.
@sloanelybutsurely I haven't given it much thought, but I don't find any of these operators particularly readable. My preference would be to use atoms with clearer names rather than try to mimic the SQL syntax 1-1