Postgres запрос ltree имеет дочерний элемент - PullRequest
1 голос
/ 27 мая 2020

У меня есть следующие таблицы:

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

1 Ответ

0 голосов
/ 27 мая 2020

Пожалуйста, используйте запрос ниже,

select i.path, i.id from items i
inner join permissions p
on ((p.id = substr(i.path, 0,1)) or (p.id = substr(i.path, instr(i.path,'.') +1,1)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...