Skip to content

Commit db0a344

Browse files
author
Lars Thoms
committed
changed joins into multiple subqueries as suggested by @ziegenberg
1 parent 2b9a065 commit db0a344

File tree

1 file changed

+25
-50
lines changed

1 file changed

+25
-50
lines changed

classes/privacy/provider.php

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -137,62 +137,37 @@ public static function get_metadata(collection $collection) : collection {
137137
*/
138138
public static function get_contexts_for_userid(int $userid) : contextlist {
139139
// Fetch all Moodleoverflow discussions, moodleoverflow posts, ratings, tracking settings and subscriptions.
140-
// FIX: split query into two parts due to a never ending database request.
141-
$sql1 = "SELECT c.id
142-
FROM {context} c
143-
INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel
144-
INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname
145-
INNER JOIN {moodleoverflow} mof ON mof.id = cm.instance
146-
LEFT JOIN {moodleoverflow_discussions} d ON d.moodleoverflow = mof.id
147-
LEFT JOIN {moodleoverflow_posts} p ON p.discussion = d.id
148-
LEFT JOIN {moodleoverflow_read} r ON r.moodleoverflowid = mof.id
149-
LEFT JOIN {moodleoverflow_subscriptions} s ON s.moodleoverflow = mof.id
150-
WHERE (
151-
d.userid = :duserid OR
152-
d.usermodified = :dmuserid OR
153-
p.userid = :puserid OR
154-
r.userid = :ruserid OR
155-
s.userid = :suserid
156-
) GROUP BY c.id";
157-
158-
$sql2 = "SELECT c.id
159-
FROM {context} c
160-
INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel
161-
INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname
162-
INNER JOIN {moodleoverflow} mof ON mof.id = cm.instance
163-
LEFT JOIN {moodleoverflow_discuss_subs} ds ON ds.moodleoverflow = mof.id
164-
LEFT JOIN {moodleoverflow_ratings} ra ON ra.moodleoverflowid = mof.id
165-
LEFT JOIN {moodleoverflow_tracking} track ON track.moodleoverflowid = mof.id
166-
LEFT JOIN {moodleoverflow_grades} g ON g.moodleoverflowid = mof.id
167-
WHERE (
168-
ds.userid = :dsuserid OR
169-
ra.userid = :rauserid OR
170-
track.userid = :userid OR
171-
g.userid = :guserid
172-
) GROUP BY c.id";
173-
174-
$params1 = [
175-
'modname' => 'moodleoverflow',
176-
'contextlevel' => CONTEXT_MODULE,
177-
'duserid' => $userid,
178-
'dmuserid' => $userid,
179-
'puserid' => $userid,
180-
'ruserid' => $userid,
181-
'suserid' => $userid
182-
];
140+
$sql = "SELECT c.id
141+
FROM {context} c
142+
INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel
143+
INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname
144+
INNER JOIN {moodleoverflow} mof ON mof.id = cm.instance
145+
WHERE EXISTS (
146+
SELECT 1 FROM {moodleoverflow_discussions} d WHERE d.moodleoverflow = mof.id AND (d.userid = :userid OR d.usermodified = :userid)
147+
) OR EXISTS (
148+
SELECT 1 FROM {moodleoverflow_posts} p WHERE p.discussion IN (SELECT id FROM {moodleoverflow_discussions} WHERE moodleoverflow = mof.id) AND p.userid = :userid
149+
) OR EXISTS (
150+
SELECT 1 FROM {moodleoverflow_read} r WHERE r.moodleoverflowid = mof.id AND r.userid = :userid
151+
) OR EXISTS (
152+
SELECT 1 FROM {moodleoverflow_subscriptions} s WHERE s.moodleoverflow = mof.id AND s.userid = :userid
153+
) OR EXISTS (
154+
SELECT 1 FROM {moodleoverflow_discuss_subs} ds WHERE ds.moodleoverflow = mof.id AND ds.userid = :userid
155+
) OR EXISTS (
156+
SELECT 1 FROM {moodleoverflow_ratings} ra WHERE ra.moodleoverflowid = mof.id AND ra.userid = :userid
157+
) OR EXISTS (
158+
SELECT 1 FROM {moodleoverflow_tracking} track WHERE track.moodleoverflowid = mof.id AND track.userid = :userid
159+
) OR EXISTS (
160+
SELECT 1 FROM {moodleoverflow_grades} g WHERE g.moodleoverflowid = mof.id AND g.userid = :userid
161+
);"
183162
184-
$params2 = [
163+
$params = [
185164
'modname' => 'moodleoverflow',
186165
'contextlevel' => CONTEXT_MODULE,
187-
'dsuserid' => $userid,
188-
'rauserid' => $userid,
189-
'userid' => $userid,
190-
'guserid' => $userid
166+
'userid' => $userid
191167
];
192168
193169
$contextlist = new \core_privacy\local\request\contextlist();
194-
$contextlist->add_from_sql($sql1, $params1);
195-
$contextlist->add_from_sql($sql2, $params2);
170+
$contextlist->add_from_sql($sql, $params);
196171
197172
return $contextlist;
198173
}

0 commit comments

Comments
 (0)