MDL-84898 core: Improve prohibit performance
Change the query used to check if a user has a capability but is assigned a role that prohibits that capability. This is based on the query added by Petr Skoda for MDL-57027.
This commit is contained in:
+7
-8
@@ -3796,14 +3796,13 @@ function get_with_capability_join(context $context, $capability, $useridcolumn)
|
||||
AND roleid IN (" . implode(',', array_keys($prohibited[$cap])) . "))";
|
||||
|
||||
} else {
|
||||
$unions[] = "SELECT userid
|
||||
FROM {role_assignments}
|
||||
WHERE contextid IN ($ctxids) AND roleid IN (" . implode(',', array_keys($needed[$cap])) . ")
|
||||
AND userid NOT IN (
|
||||
SELECT userid
|
||||
FROM {role_assignments}
|
||||
WHERE contextid IN ($ctxids)
|
||||
AND roleid IN (" . implode(',', array_keys($prohibited[$cap])) . "))";
|
||||
$unions[] = "SELECT ra.userid
|
||||
FROM {role_assignments} ra
|
||||
LEFT JOIN {role_assignments} rap ON (rap.userid = ra.userid
|
||||
AND rap.contextid IN ($ctxids)
|
||||
AND rap.roleid IN (" . implode(',', array_keys($prohibited[$cap])) . "))
|
||||
WHERE ra.contextid IN ($ctxids) AND ra.roleid IN (" . implode(',', array_keys($needed[$cap])) . ")
|
||||
AND rap.id IS NULL";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user