From 867f5adb73e5306475fa94e6d6f5d44fbb13653d Mon Sep 17 00:00:00 2001 From: moodler Date: Tue, 26 Sep 2006 04:33:59 +0000 Subject: [PATCH] Moved Penny's funky sql function into dmllib.php --- course/report/participation/index.php | 2 +- lib/dmllib.php | 37 +++++++++++++++++++++++++++ lib/statslib.php | 26 +------------------ 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/course/report/participation/index.php b/course/report/participation/index.php index 3172794255c..73cd187f317 100644 --- a/course/report/participation/index.php +++ b/course/report/participation/index.php @@ -228,7 +228,7 @@ $table->setup(); - $primary_roles = stats_get_primary_role_subselect(); + $primary_roles = sql_primary_role_subselect(); // In dmllib.php $sql = 'SELECT DISTINCT prs.userid, u.firstname,u.lastname,u.idnumber,count(l.action) as count FROM ('.$primary_roles.') prs' .' JOIN '.$CFG->prefix.'user u ON u.id = prs.userid LEFT JOIN '.$CFG->prefix.'log l ON prs.userid = l.userid ' .' AND prs.courseid = l.course AND l.time > '.$timefrom.' AND l.course = '.$course->id.' AND l.module = \''.$module->name.'\' ' diff --git a/lib/dmllib.php b/lib/dmllib.php index 34aee54754c..f09ee9f5a78 100644 --- a/lib/dmllib.php +++ b/lib/dmllib.php @@ -1308,6 +1308,43 @@ function sql_order_by_text($fieldname, $numchars=32) { } } + +/** + * Returns SQL to be used as a subselect to find the primary role of users. + * Penny (the author) is very keen for this to be implemented as a view in + * future versions. + * + * eg if this function returns a string called $primaryroles, then you could: + * $sql = 'SELECT COUNT(DISTINCT prs.userid) FROM ('.$primary_roles.') prs + * WHERE prs.primary_roleid='.$role->id.' AND prs.courseid='.$course->id. + * ' AND prs.contextlevel = '.CONTEXT_COURSE; + * + * @return string the piece of SQL code to be used in your FROM( ) statement. + */ +function sql_primary_role_subselect() { + global $CFG; + return 'SELECT ra.userid, + ra.roleid AS primary_roleid, + ra.contextid, + r.sortorder, + r.name, + r.description, + r.shortname, + c.instanceid AS courseid, + c.contextlevel + FROM '.$CFG->prefix.'role_assignments ra + INNER JOIN '.$CFG->prefix.'role r ON ra.roleid = r.id + INNER JOIN '.$CFG->prefix.'context c ON ra.contextid = c.id + WHERE NOT EXISTS ( + SELECT 1 + FROM '.$CFG->prefix.'role_assignments i_ra + INNER JOIN '.$CFG->prefix.'role i_r ON i_ra.roleid = i_r.id + WHERE ra.userid = i_ra.userid AND + ra.contextid = i_ra.contextid AND + i_r.sortorder < r.sortorder + ) '; +} + /** * Prepare a SQL WHERE clause to select records where the given fields match the given values. * diff --git a/lib/statslib.php b/lib/statslib.php index 7383fb33d48..fdb1937039d 100644 --- a/lib/statslib.php +++ b/lib/statslib.php @@ -138,7 +138,7 @@ function stats_cron_daily () { continue; } - $primary_roles = stats_get_primary_role_subselect(); + $primary_roles = sql_primary_role_subselect(); // In dmllib.php foreach ($roles as $role) { // ENROLMENT FIRST.... // ALL users with this role... @@ -1315,28 +1315,4 @@ function stats_upgrade_table_for_roles ($period) { return true; } -function stats_get_primary_role_subselect() { - global $CFG; - return 'SELECT ra.userid, - ra.roleid AS primary_roleid, - ra.contextid, - r.sortorder, - r.name, - r.description, - r.shortname, - c.instanceid AS courseid, - c.contextlevel - FROM '.$CFG->prefix.'role_assignments ra - INNER JOIN '.$CFG->prefix.'role r ON ra.roleid = r.id - INNER JOIN '.$CFG->prefix.'context c ON ra.contextid = c.id - WHERE NOT EXISTS ( - SELECT 1 - FROM '.$CFG->prefix.'role_assignments i_ra - INNER JOIN '.$CFG->prefix.'role i_r ON i_ra.roleid = i_r.id - WHERE ra.userid = i_ra.userid AND - ra.contextid = i_ra.contextid AND - i_r.sortorder < r.sortorder - ) '; -} - ?>