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