ecto_range icon indicating copy to clipboard operation
ecto_range copied to clipboard

Add ecto support for range operators

Open davydog187 opened this issue 3 years ago • 2 comments

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 avatar Nov 02 '22 14:11 davydog187

@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.

Operators - Custom and overridden operators

sloanelybutsurely avatar Nov 01 '24 01:11 sloanelybutsurely

@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

davydog187 avatar Nov 01 '24 10:11 davydog187