$sql = $DB->sql_like('action', ':action', false);
$params['action'] = '%'.$action.'%';
}
- } else {
+ } else if (!empty($this->filterparams->action)) {
$sql = "crud = :crud";
$params['crud'] = $this->filterparams->action;
+ } else {
+ // Add condition for all possible values of crud (to use db index).
+ list($sql, $params) = $DB->get_in_or_equal(array('c', 'r', 'u', 'd'),
+ SQL_PARAMS_NAMED, 'crud');
+ $sql = "crud ".$sql;
}
return array($sql, $params);
}
* @param bool $useinitialsbar do you want to use the initials bar.
*/
public function query_db($pagesize, $useinitialsbar = true) {
+ global $DB;
$joins = array();
$params = array();
+ // If we filter by userid and module id we also need to filter by crud and edulevel to ensure DB index is engaged.
+ $useextendeddbindex = !($this->filterparams->logreader instanceof logstore_legacy\log\store)
+ && !empty($this->filterparams->userid) && !empty($this->filterparams->modid);
+
$groupid = 0;
if (!empty($this->filterparams->courseid)) {
if (!empty($this->filterparams->groupid)) {
if (!empty($this->filterparams->modid)) {
$joins[] = "contextinstanceid = :contextinstanceid";
+ $joins[] = "contextlevel = :contextmodule";
$params['contextinstanceid'] = $this->filterparams->modid;
+ $params['contextmodule'] = CONTEXT_MODULE;
}
- if (!empty($this->filterparams->action)) {
+ if (!empty($this->filterparams->action) || $useextendeddbindex) {
list($actionsql, $actionparams) = $this->get_action_sql();
$joins[] = $actionsql;
$params = array_merge($params, $actionparams);
if (isset($this->filterparams->edulevel) && ($this->filterparams->edulevel >= 0)) {
$joins[] = "edulevel = :edulevel";
$params['edulevel'] = $this->filterparams->edulevel;
+ } else if ($useextendeddbindex) {
+ list($edulevelsql, $edulevelparams) = $DB->get_in_or_equal(array(\core\event\base::LEVEL_OTHER,
+ \core\event\base::LEVEL_PARTICIPATING, \core\event\base::LEVEL_TEACHING), SQL_PARAMS_NAMED, 'edulevel');
+ $joins[] = "edulevel ".$edulevelsql;
+ $params = array_merge($params, $edulevelparams);
+ }
+
+ if (!($this->filterparams->logreader instanceof logstore_legacy\log\store)) {
+ // Filter out anonymous actions, this is N/A for legacy log because it never stores them.
+ $joins[] = "anonymous = 0";
}
$selector = implode(' AND ', $joins);
$logtable = 'log';
$timefield = 'time';
$coursefield = 'course';
+ // Anonymous actions are never logged in legacy log.
+ $nonanonymous = '';
} else {
$logtable = $reader->get_internal_log_table_name();
$timefield = 'timecreated';
$coursefield = 'courseid';
+ $nonanonymous = 'AND anonymous = 0';
}
$params = array();
return $DB->get_records_sql("SELECT FLOOR(($timefield - $coursestart)/" . DAYSECS . ") AS day, COUNT(*) AS num
FROM {" . $logtable . "}
WHERE userid = :userid
- AND $timefield > $coursestart $courseselect
+ AND $timefield > $coursestart $courseselect $nonanonymous
GROUP BY FLOOR(($timefield - $coursestart)/" . DAYSECS .")", $params);
}
$logtable = 'log';
$timefield = 'time';
$coursefield = 'course';
+ // Anonymous actions are never logged in legacy log.
+ $nonanonymous = '';
} else {
$logtable = $reader->get_internal_log_table_name();
$timefield = 'timecreated';
$coursefield = 'courseid';
+ $nonanonymous = 'AND anonymous = 0';
}
$params = array('userid' => $userid);
return $DB->get_records_sql("SELECT FLOOR(($timefield - $daystart)/" . HOURSECS . ") AS hour, COUNT(*) AS num
FROM {" . $logtable . "}
WHERE userid = :userid
- AND $timefield > $daystart $courseselect
+ AND $timefield > $daystart $courseselect $nonanonymous
GROUP BY FLOOR(($timefield - $daystart)/" . HOURSECS . ") ", $params);
}