From: stronk7 Date: Sun, 22 Jul 2007 00:56:42 +0000 (+0000) Subject: New cross-db version of the big union query used by get_my_courses() function. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=ae7dc0d1e00818846283b8a29590ced87e638db4;p=moodle.git New cross-db version of the big union query used by get_my_courses() function. I've tested both the "IN" subquery and the "FROM" subquery and, under sites with more courses, the "FROM" one seems to perform slightly better. MDL-9381 Merged from MOODLE_18_STABLE --- diff --git a/lib/datalib.php b/lib/datalib.php index cca5b98356..68e8259138 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -682,7 +682,7 @@ function get_courses_page($categoryid="all", $sort="c.sortorder ASC", $fields="c */ function get_my_courses($userid, $sort=NULL, $fields=NULL, $doanything=false,$limit=0) { - global $USER; + global $CFG, $USER; // Default parameters $d_sort = 'visible DESC,sortorder ASC'; @@ -744,37 +744,45 @@ function get_my_courses($userid, $sort=NULL, $fields=NULL, $doanything=false,$li // However for a typical student on a large system this can reduce the // number of courses considered from around 2,000 to around 2, with corresponding // reduction in the number of queries needed. - global $CFG; - $rs=get_recordset_sql(" -SELECT - $fields -FROM - {$CFG->prefix}role_assignments ra - INNER JOIN {$CFG->prefix}context x ON x.id=ra.contextid - INNER JOIN {$CFG->prefix}course c ON x.instanceid=c.id AND x.contextlevel=50 -WHERE - ra.userid=$userid -UNION -SELECT - $fields -FROM - {$CFG->prefix}role_assignments ra - INNER JOIN {$CFG->prefix}context x ON x.id=ra.contextid - INNER JOIN {$CFG->prefix}course_categories a ON (a.path LIKE ".sql_concat("'%/'", 'x.instanceid', "'/%'")." OR a.id=x.instanceid) AND x.contextlevel=40 - INNER JOIN {$CFG->prefix}course c ON c.category=a.id -WHERE - ra.userid=$userid -UNION -SELECT - $fields -FROM - {$CFG->prefix}role_capabilities ca - INNER JOIN {$CFG->prefix}context x ON x.id=ca.contextid AND x.contextlevel=50 - INNER JOIN {$CFG->prefix}course c ON c.id=x.instanceid -WHERE - ca.contextid <> {$sitecontext->id} AND ca.capability='moodle/course:view' -ORDER BY $sort"); - } + $rs=get_recordset_sql(" + SELECT $fields + FROM {$CFG->prefix}course c, ( + SELECT + c.id + FROM + {$CFG->prefix}role_assignments ra + INNER JOIN {$CFG->prefix}context x ON x.id = ra.contextid + INNER JOIN {$CFG->prefix}course c ON x.instanceid = c.id + WHERE + ra.userid = $userid AND + x.contextlevel = 50 + UNION + SELECT + c.id + FROM + {$CFG->prefix}role_assignments ra + INNER JOIN {$CFG->prefix}context x ON x.id = ra.contextid + INNER JOIN {$CFG->prefix}course_categories a ON a.path LIKE ".sql_concat("'%/'", 'x.instanceid', "'/%'")." OR x.instanceid = a.id + INNER JOIN {$CFG->prefix}course c ON c.category = a.id + WHERE + ra.userid = $userid AND + x.contextlevel = 40 + UNION + SELECT + c.id + FROM + {$CFG->prefix}role_capabilities ca + INNER JOIN {$CFG->prefix}context x ON x.id = ca.contextid + INNER JOIN {$CFG->prefix}course c ON c.id = x.instanceid + WHERE + ca.capability = 'moodle/course:view' AND + ca.contextid != {$sitecontext->id} AND + x.contextlevel = 50 + ) cids + WHERE c.id = cids.id + ORDER BY $sort" + ); + } if ($rs && $rs->RecordCount() > 0) { while ($course = rs_fetch_next_record($rs)) {