Skip to content

Commit e2f184d

Browse files
committed
Add function to improve search performance.
1 parent 7f238d1 commit e2f184d

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
-- The previous user_has_project_permission function is called on _every_ project when doing global omnisearch,
2+
-- which is too slow.
3+
4+
-- Create a view which serves as join table for finding projects we should consider in search, it's much faster
5+
-- than running a permission check for every private project.
6+
CREATE FUNCTION projects_searchable_by_user(arg_user_id UUID)
7+
-- Returns a subset of the projects table
8+
RETURNS SETOF projects AS $$
9+
-- Get all public projects and projects owned by the user,
10+
-- as well as all public projects.
11+
SELECT p.*
12+
FROM projects p
13+
WHERE p.owner_user_id = arg_user_id
14+
OR NOT p.private
15+
UNION
16+
SELECT
17+
p.*
18+
FROM org_members om
19+
JOIN projects p
20+
ON om.organization_user_id = p.owner_user_id
21+
JOIN roles r ON om.role_id = r.id
22+
WHERE om.member_user_id = arg_user_id
23+
AND 'project:view' = ANY(r.permissions)
24+
-- All public projects are already included above
25+
AND p.private
26+
UNION
27+
-- Include projects the user is a direct maintainer of
28+
SELECT
29+
p.*
30+
FROM users u
31+
JOIN role_memberships rm ON u.subject_id = rm.subject_id
32+
JOIN roles r ON rm.role_id = r.id
33+
JOIN projects p ON rm.resource_id = p.resource_id
34+
WHERE u.id = arg_user_id
35+
AND 'project:view' = ANY(r.permissions)
36+
AND p.private;
37+
$$ LANGUAGE sql STABLE PARALLEL SAFE;
38+
39+
-- A better index for this query.
40+
-- CREATE INDEX idx_projects_by_owner_and_privacy
41+
-- ON projects (private, owner_user_id);
42+
43+
CREATE INDEX idx_public_projects_by_owner
44+
ON projects (owner_user_id)
45+
WHERE NOT private;
46+
47+
CREATE INDEX idx_private_projects_by_owner
48+
ON projects (owner_user_id)
49+
WHERE private;

0 commit comments

Comments
 (0)