From 51e53b9f40bae27a96c0cc193a2ea6a28cb47b91 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 10 May 2018 15:36:58 +0800 Subject: [PATCH] MDL-61905 mod_workshop: Adjust privacy SQL queries This change moves the content of WHERE to the JOIN, thus filtering the results before they are returned. This reduces the number of joined rows which gives a big performance benefit. --- mod/workshop/classes/privacy/provider.php | 39 +++++++++++------------ 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/mod/workshop/classes/privacy/provider.php b/mod/workshop/classes/privacy/provider.php index 3a073abf87d..ed4eb6dd921 100644 --- a/mod/workshop/classes/privacy/provider.php +++ b/mod/workshop/classes/privacy/provider.php @@ -129,20 +129,22 @@ class provider implements public static function get_contexts_for_userid(int $userid) : contextlist { $contextlist = new contextlist(); - $sql = "SELECT ctx.id FROM {course_modules} cm JOIN {modules} m ON cm.module = m.id AND m.name = :module JOIN {context} ctx ON ctx.contextlevel = :contextlevel AND ctx.instanceid = cm.id JOIN {workshop} w ON cm.instance = w.id LEFT JOIN {workshop_submissions} ws ON ws.workshopid = w.id - LEFT JOIN {workshop_assessments} wa ON wa.submissionid = ws.id - LEFT JOIN {workshop_aggregations} wr ON wr.workshopid = w.id + LEFT JOIN {workshop_assessments} wa ON wa.submissionid = ws.id AND ( + wa.reviewerid = :wareviewerid + OR + wa.gradinggradeoverby = :wagradinggradeoverby + ) + LEFT JOIN {workshop_aggregations} wr ON wr.workshopid = w.id AND wr.userid = :wruserid WHERE ws.authorid = :wsauthorid OR ws.gradeoverby = :wsgradeoverby - OR wa.reviewerid = :wareviewerid - OR wa.gradinggradeoverby = :wagradinggradeoverby - OR wr.userid = :wruserid"; + OR wa.id IS NOT NULL + OR wr.id IS NOT NULL"; $params = [ 'module' => 'workshop', @@ -306,9 +308,8 @@ class provider implements JOIN {modules} m ON cm.module = m.id AND m.name = :module JOIN {context} ctx ON ctx.contextlevel = :contextlevel AND ctx.instanceid = cm.id JOIN {workshop} w ON cm.instance = w.id - JOIN {workshop_submissions} ws ON ws.workshopid = w.id - WHERE ctx.id {$contextsql} - AND ws.authorid = :authorid"; + JOIN {workshop_submissions} ws ON ws.workshopid = w.id AND ws.authorid = :authorid + WHERE ctx.id {$contextsql}"; $params = $contextparams + [ 'module' => 'workshop', @@ -418,9 +419,8 @@ class provider implements JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel JOIN {workshop} w ON cm.instance = w.id JOIN {workshop_submissions} ws ON ws.workshopid = w.id - JOIN {workshop_assessments} wa ON wa.submissionid = ws.id - WHERE ctx.id {$contextsql} - AND wa.reviewerid = :reviewerid"; + JOIN {workshop_assessments} wa ON wa.submissionid = ws.id AND wa.reviewerid = :reviewerid + WHERE ctx.id {$contextsql}"; $params = $contextparams + [ 'module' => 'workshop', @@ -570,9 +570,8 @@ class provider implements JOIN {modules} m ON cm.module = m.id AND m.name = :module JOIN {context} ctx ON ctx.contextlevel = :contextlevel AND ctx.instanceid = cm.id JOIN {workshop} w ON cm.instance = w.id - JOIN {workshop_submissions} ws ON ws.workshopid = w.id - WHERE ctx.id {$contextsql} - AND ws.authorid = :authorid"; + JOIN {workshop_submissions} ws ON ws.workshopid = w.id AND ws.authorid = :authorid + WHERE ctx.id {$contextsql}"; $params = $contextparams + [ 'module' => 'workshop', @@ -607,10 +606,9 @@ class provider implements JOIN {modules} m ON cm.module = m.id AND m.name = :module JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel JOIN {workshop} w ON cm.instance = w.id - JOIN {workshop_submissions} ws ON ws.workshopid = w.id + JOIN {workshop_submissions} ws ON ws.workshopid = w.id AND ws.authorid = :authorid JOIN {workshop_assessments} wa ON wa.submissionid = ws.id - WHERE ctx.id {$contextsql} - AND ws.authorid = :authorid"; + WHERE ctx.id {$contextsql}"; $params = $contextparams + [ 'module' => 'workshop', @@ -642,9 +640,8 @@ class provider implements JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel JOIN {workshop} w ON cm.instance = w.id JOIN {workshop_submissions} ws ON ws.workshopid = w.id - JOIN {workshop_assessments} wa ON wa.submissionid = ws.id - WHERE ctx.id {$contextsql} - AND wa.reviewerid = :reviewerid"; + JOIN {workshop_assessments} wa ON wa.submissionid = ws.id AND wa.reviewerid = :reviewerid + WHERE ctx.id {$contextsql}"; $params = $contextparams + [ 'module' => 'workshop',