From ddb9c47252685549658338d43313ffe9e952afde Mon Sep 17 00:00:00 2001 From: skodak <skodak> Date: Sun, 16 Mar 2008 01:24:21 +0000 Subject: [PATCH] MDL-13939 stats produce bogus role/course data if user has several different enrolments; ,erged from MOODLE_19_STABLE --- lib/statslib.php | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/statslib.php b/lib/statslib.php index 3bedd07d70..c002eb7d67 100644 --- a/lib/statslib.php +++ b/lib/statslib.php @@ -198,10 +198,12 @@ function stats_cron_daily($maxdays=1) { $sql = "INSERT INTO {$CFG->prefix}stats_daily (stattype, timeend, courseid, roleid, stat1, stat2) SELECT 'enrolments' AS stattype, $nextmidnight AS timeend, - c.id AS courseid, ra.roleid, COUNT(DISTINCT ra.userid) AS stat1, 0 AS stat2 - FROM {$CFG->prefix}role_assignments ra $enroljoin_na - WHERE $enrolwhere_na - GROUP BY stattype, timeend, c.id, ra.roleid, stat2"; + pl.courseid, pl.roleid, COUNT(DISTINCT pl.userid) AS stat1, 0 AS stat2 + FROM (SELECT DISTINCT ra.roleid, ra.userid, c.id as courseid + FROM {$CFG->prefix}role_assignments ra $enroljoin_na + WHERE $enrolwhere_na + ) pl + GROUP BY stattype, timeend, pl.courseid, pl.roleid, stat2"; if (!execute_sql($sql, false)) { $failed = true; @@ -390,17 +392,18 @@ function stats_cron_daily($maxdays=1) { $sql = "INSERT INTO {$CFG->prefix}stats_daily (stattype, timeend, courseid, roleid, stat1, stat2) SELECT 'activity' AS stattype, $nextmidnight AS timeend, pl.courseid, pl.roleid, - SUM(pl.statsreads) AS stat1, SUM(pl.statswrites) AS stat2 - FROM (SELECT DISTINCT ra.roleid, c.id AS courseid, sud.statsreads, sud.statswrites + SUM(sud.statsreads) AS stat1, SUM(sud.statswrites) AS stat2 + FROM {$CFG->prefix}stats_user_daily sud, + (SELECT DISTINCT ra.userid, ra.roleid, c.id AS courseid FROM {$CFG->prefix}role_assignments ra $enroljoin - JOIN {$CFG->prefix}stats_user_daily sud - ON (sud.userid = ra.userid AND sud.courseid = c.id) WHERE c.id <> ".SITEID." AND ra.roleid <> $guestrole->id AND ra.userid <> $guest->id AND - sud.timeend = $nextmidnight AND $enrolwhere + $enrolwhere ) pl + WHERE sud.userid = pl.userid AND sud.courseid = pl.courseid AND + sud.timeend = $nextmidnight AND sud.stattype='activity' GROUP BY stattype, timeend, pl.courseid, pl.roleid - HAVING SUM(pl.statsreads) > 0 OR SUM(pl.statswrites) > 0"; + HAVING SUM(sud.statsreads) > 0 OR SUM(sud.statswrites) > 0"; if ($logspresent and !execute_sql($sql, false)) { $failed = true; @@ -418,6 +421,7 @@ function stats_cron_daily($maxdays=1) { SUM(sud.statsreads) AS stat1, SUM(sud.statswrites) AS stat2 FROM {$CFG->prefix}stats_user_daily sud WHERE sud.timeend = $nextmidnight AND sud.courseid <> ".SITEID." AND + sud.stattype='activity' AND (sud.userid = $guest->id OR sud.userid NOT IN (SELECT ra.userid FROM {$CFG->prefix}role_assignments ra $enroljoin @@ -437,17 +441,19 @@ function stats_cron_daily($maxdays=1) { $sql = "INSERT INTO {$CFG->prefix}stats_daily (stattype, timeend, courseid, roleid, stat1, stat2) SELECT 'activity' AS stattype, $nextmidnight AS timeend, pl.courseid, pl.roleid, - SUM(pl.statsreads) AS stat1, SUM(pl.statswrites) AS stat2 - FROM (SELECT DISTINCT ra.roleid, c.id AS courseid, sud.statsreads, sud.statswrites - FROM {$CFG->prefix}role_assignments ra $fpjoin - JOIN {$CFG->prefix}stats_user_daily sud - ON (sud.userid = ra.userid AND sud.courseid = c.id) - WHERE c.id = ".SITEID." AND ra.roleid <> $defaultfproleid AND + SUM(sud.statsreads) AS stat1, SUM(sud.statswrites) AS stat2 + FROM {$CFG->prefix}stats_user_daily sud, + (SELECT DISTINCT ra.userid, ra.roleid, c.id AS courseid + FROM {$CFG->prefix}role_assignments ra $enroljoin + WHERE c.id = ".SITEID." AND + ra.roleid <> $defaultfproleid AND ra.roleid <> $guestrole->id AND ra.userid <> $guest->id AND - sud.timeend = $nextmidnight AND $fpwhere + $enrolwhere ) pl + WHERE sud.userid = pl.userid AND sud.courseid = pl.courseid AND + sud.timeend = $nextmidnight AND sud.stattype='activity' GROUP BY stattype, timeend, pl.courseid, pl.roleid - HAVING SUM(pl.statsreads) > 0 OR SUM(pl.statswrites) > 0"; + HAVING SUM(sud.statsreads) > 0 OR SUM(sud.statswrites) > 0"; if ($logspresent and !execute_sql($sql, false)) { $failed = true; @@ -463,6 +469,7 @@ function stats_cron_daily($maxdays=1) { SUM(sud.statsreads) AS stat1, SUM(sud.statswrites) AS stat2 FROM {$CFG->prefix}stats_user_daily sud WHERE sud.timeend = $nextmidnight AND sud.courseid = ".SITEID." AND + sud.stattype='activity' AND sud.userid <> $guest->id AND sud.userid <> 0 AND sud.userid NOT IN (SELECT ra.userid FROM {$CFG->prefix}role_assignments ra $fpjoin @@ -485,7 +492,8 @@ function stats_cron_daily($maxdays=1) { FROM (SELECT sud.statsreads, sud.statswrites FROM {$CFG->prefix}stats_user_daily sud WHERE (sud.userid = $guest->id OR sud.userid = 0) AND - sud.timeend = $nextmidnight AND sud.courseid = ".SITEID." + sud.timeend = $nextmidnight AND sud.courseid = ".SITEID." AND + sud.stattype='activity' ) pl GROUP BY stattype, timeend, courseid, nroleid HAVING SUM(pl.statsreads) > 0 OR SUM(pl.statswrites) > 0"; -- 2.39.5