From 3d7f23c5e92d809d50d19fdd0ea7c321ab89b98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=CC=8Ckoda?= Date: Mon, 13 Aug 2012 22:31:36 +0200 Subject: [PATCH] MDL-34864 improve enrol_category sync performance --- enrol/category/locallib.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/enrol/category/locallib.php b/enrol/category/locallib.php index 6a7671b7dbd..2f4c0c1122f 100644 --- a/enrol/category/locallib.php +++ b/enrol/category/locallib.php @@ -265,6 +265,7 @@ function enrol_category_sync_full() { // first of all add necessary enrol instances to all courses $parentcat = $DB->sql_concat("cat.path", "'/%'"); + $parentcctx = $DB->sql_concat("cctx.path", "'/%'"); // need whole course records to be used by add_instance(), use inner view (ci) to // get distinct records only. // TODO: Moodle 2.1. Improve enrol API to accept courseid / courserec @@ -293,12 +294,11 @@ function enrol_category_sync_full() { $sql = "SELECT e.* FROM {enrol} e JOIN {context} ctx ON (ctx.instanceid = e.courseid AND ctx.contextlevel = :courselevel) - LEFT JOIN (SELECT DISTINCT cctx.path - FROM {course_categories} cc + LEFT JOIN ({course_categories} cc JOIN {context} cctx ON (cctx.instanceid = cc.id AND cctx.contextlevel = :catlevel) JOIN {role_assignments} ra ON (ra.contextid = cctx.id AND ra.roleid $roleids) - ) cat ON (ctx.path LIKE $parentcat) - WHERE e.enrol = 'category' AND cat.path IS NULL"; + ) ON (ctx.path LIKE $parentcctx) + WHERE e.enrol = 'category' AND cc.id IS NULL"; $rs = $DB->get_recordset_sql($sql, $params); foreach($rs as $instance) { @@ -333,12 +333,11 @@ function enrol_category_sync_full() { FROM {enrol} e JOIN {context} ctx ON (ctx.instanceid = e.courseid AND ctx.contextlevel = :courselevel) JOIN {user_enrolments} ue ON (ue.enrolid = e.id) - LEFT JOIN (SELECT DISTINCT cctx.path, ra.userid - FROM {course_categories} cc + LEFT JOIN ({course_categories} cc JOIN {context} cctx ON (cctx.instanceid = cc.id AND cctx.contextlevel = :catlevel) JOIN {role_assignments} ra ON (ra.contextid = cctx.id AND ra.roleid $roleids) - ) cat ON (ctx.path LIKE $parentcat AND cat.userid = ue.userid) - WHERE e.enrol = 'category' AND cat.userid IS NULL"; + ) ON (ctx.path LIKE $parentcctx AND ra.userid = ue.userid) + WHERE e.enrol = 'category' AND cc.id IS NULL"; $rs = $DB->get_recordset_sql($sql, $params); foreach($rs as $instance) { $userid = $instance->userid;