It is perfectly valid to have a query like:
Match None of the following:
- Role is ANY of the following:
-- 'Teacher'
-- 'Editing teacher'
-- 'Manager'; AND
- Keyword is NONE of the following:
-- 'Kevin'
However, due to the way in which the query is constructed, this leads to
a query which includes
WHERE NOT ef.id IS NOT NULL
AND NOT
u.id IN (SELECT userid FROM {role_assignments} WHERE roleid IN (...) AND contextid IN (...))
AND NOT
NOT (u.firstname || ' ' || u.lastname LIKE '%Kevin%')
The use of NOT NOT is valid in Postgres, MariaDB, MySQL, and MSSQL, but
not in Oracle.
To counter this when the outer jointype is of type NONE, we must wrap
each of the inner WHERE clauses in a set of brackets, which makes the
query:
WHERE NOT ef.id IS NOT NULL
AND NOT
(u.id IN (SELECT userid FROM {role_assignments} WHERE roleid IN (...) AND contextid IN (...)))
AND NOT
(NOT (u.firstname || ' ' || u.lastname LIKE '%Kevin%'))
Whilst Oracle does not support the use of `AND NOT NOT ...`, it does support
`AND NOT (NOT ...)`
This is required to ensure regardless of user applied filters, only
members of groups visible to the user are ever fetched. This also
includes a fix to remove the groups filter option where no groups
mode is applied.
Completed support for all join types (any/all/none) for enrolment
method and status filtering. This includes handling forced status
filtering where a user does not have the capability to view suspended
users, as well as handling front page (whole site) participants page.
The last access implementation also fixes an existing bug,
where it was assumed never accessed would be 0, when it also needed to
handle null to return correct results. Related userlib unit tests also
updated to reflect this, as well as some incorrect comment wording.
This was originally intended to be a way for the calling code to specify
data as part of the table construction which could then be used as
appropriate. When the filterset was created the requirement for this
function no longer existed.
Removing this to simplify the API.
Passing parameters to implode() in reverse order is deprecated, use
implode($glue, $parts) instead of implode($parts, $glue).
This commit corresponds to phpunit and manual detections, core files.
From course lang files to user lang files (where the target belongs to)
AMOS BEGIN
MOV [target:upcomingactivitiesdue,core_course],[target:upcomingactivitiesdue,core_user]
MOV [target:upcomingactivitiesdue_help,core_course],[target:upcomingactivitiesdue_help,core_user]
AMOS END
- Removed redundant query to analytics_predict_samples
- Analysers API now uses recordsets to iterate through the analysable
elements. They take the last analysed time into account.
- New method for targets so there is no need to always update the last
analysis time. Useful for lightweight targets.