У меня есть следующие таблицы:
CREATE TABLE public.permissions (
"user" varchar ,
"action" permissions_action_enum, -- 'read'/'write'
id ltree
);
CREATE TABLE public.items (
"path" ltree NULL,
id uuid NOT NULL,
);
Я хочу вернуть все строки, которые пользователь имеет разрешение на просмотр, у пользователя есть разрешение на элемент, если у него есть разрешение на элемент или на один из его предки. например:
public.permissions:
user |action|id |
-----------|------|---|
1 |read |a |
1 |read |d |
public.items:
path |id |
-----------|---|
a.b |b |
a.c |c |
e.d |d |
g.f |f |
Согласно приведенным выше данным, у пользователя есть разрешения на элементы (b, c и d).
Я хочу создать запрос, который присоединяется к над таблицами и вернуть все элементы, на которые у пользователя есть разрешение на read
, ожидаемый результат:
path |id |
-----------|---|
a.b |b |
a.c |c |
e.d |d |
Существует эффективный способ поиска, содержит ли ltree
другие ltree
? Или если ltree
является дочерним элементом другой записи? Что-то вроде *.a.*
в lquery
, но между столбцами.
Я пробовал использовать <@/@>
, но они годятся только для проверок root / item:
select 'a.b'::ltree <@ 'b'::ltree -- false
select 'a.b'::ltree <@ 'a'::ltree -- true
select 'a.b'::ltree @> 'b'::ltree -- false
select 'a.b'::ltree @> 'a'::ltree -- false