From 24b8efe27a77e18b1a1596a8dcd450018c61be2c Mon Sep 17 00:00:00 2001 From: Lars Bonczek Date: Thu, 6 Jul 2023 18:51:55 +0200 Subject: [PATCH] MDL-78618 core_course: use UNION in get_nearest_editable_subcategory --- course/classes/category.php | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/course/classes/category.php b/course/classes/category.php index 29b1bed8524..1ad2cdae5e7 100644 --- a/course/classes/category.php +++ b/course/classes/category.php @@ -3206,24 +3206,27 @@ class core_course_category implements renderable, cacheable_object, IteratorAggr $fields = array_keys(array_filter(self::$coursecatfields)); $ctxselect = context_helper::get_preload_record_columns_sql('ctx'); $rs = $DB->get_recordset_sql(" - SELECT cc.". join(',cc.', $fields). ", $ctxselect - FROM {course_categories} cc - JOIN {context} ctx ON cc.id = ctx.instanceid AND ctx.contextlevel = :contextcoursecat - LEFT JOIN {role_assignments} ra ON ra.contextid = ctx.id - LEFT JOIN {role_capabilities} rc ON rc.contextid = ctx.id - LEFT JOIN {role_assignments} rc_ra ON rc_ra.roleid = rc.roleid - LEFT JOIN {context} rc_ra_ctx ON rc_ra_ctx.id = rc_ra.contextid - WHERE ctx.path LIKE :parentpath - AND ( - ra.userid = :userid1 - OR ( - rc_ra.userid = :userid2 - AND (ctx.path = rc_ra_ctx.path OR ctx.path LIKE " . $DB->sql_concat("rc_ra_ctx.path", "'/%'") . ") - ) - ) + SELECT cc.". join(',cc.', $fields). ", $ctxselect + FROM {course_categories} cc + JOIN {context} ctx ON cc.id = ctx.instanceid AND ctx.contextlevel = :contextcoursecat1 + JOIN {role_assignments} ra ON ra.contextid = ctx.id + WHERE ctx.path LIKE :parentpath1 + AND ra.userid = :userid1 + UNION + SELECT cc.". join(',cc.', $fields). ", $ctxselect + FROM {course_categories} cc + JOIN {context} ctx ON cc.id = ctx.instanceid AND ctx.contextlevel = :contextcoursecat2 + JOIN {role_capabilities} rc ON rc.contextid = ctx.id + JOIN {role_assignments} rc_ra ON rc_ra.roleid = rc.roleid + JOIN {context} rc_ra_ctx ON rc_ra_ctx.id = rc_ra.contextid + WHERE ctx.path LIKE :parentpath2 + AND rc_ra.userid = :userid2 + AND (ctx.path = rc_ra_ctx.path OR ctx.path LIKE " . $DB->sql_concat("rc_ra_ctx.path", "'/%'") . ") ", [ - 'contextcoursecat' => CONTEXT_COURSECAT, - 'parentpath' => $parentcat->get_context()->path . '/%', + 'contextcoursecat1' => CONTEXT_COURSECAT, + 'contextcoursecat2' => CONTEXT_COURSECAT, + 'parentpath1' => $parentcat->get_context()->path . '/%', + 'parentpath2' => $parentcat->get_context()->path . '/%', 'userid1' => $USER->id, 'userid2' => $USER->id ]);