Patch #12721

Optimize MenuManager a bit

Added by Daniel Ritz about 9 years ago. Updated about 9 years ago.

Status:ClosedStart date:
Priority:NormalDue date:
Assignee:-% Done:


Category:Code cleanup/refactoring
Target version:2.3.0


In a project without the modules repository, wiki and boards, the following queries are needlessly executed:

Wiki Load (0.3ms)  SELECT `wikis`.* FROM `wikis` WHERE `wikis`.`project_id` = 1 LIMIT 1
(0.5ms) SELECT COUNT() FROM `boards` WHERE `boards`.`project_id` = 1
Repository Load (0.7ms) SELECT `repositories`.
FROM `repositories` WHERE `repositories`.`project_id` = 1 AND (is_default = 1) LIMIT 1

In cases where issue tracking and file modules are not enabled, this is also not needed:

(0.7ms)  SELECT COUNT(DISTINCT `issues`.`id`) AS count_id, tracker_id AS tracker_id FROM `issues`
LEFT OUTER JOIN `projects` ON `projects`.`id` = `issues`.`project_id`
LEFT OUTER JOIN `issue_statuses` ON `issue_statuses`.`id` = `issues`.`status_id`
LEFT OUTER JOIN `trackers` ON `trackers`.`id` = `issues`.`tracker_id`
WHERE (projects.status=1 AND IN (
SELECT em.project_id FROM enabled_modules em WHERE'issue_tracking'))
AND (( = 1 OR (projects.lft > 1 AND projects.rgt < 2)))
GROUP BY tracker_id

The reason is in allowed_node? in Redmine::MenuManager::MenuHelper. It first checks extra conditions, then checks if the user is allowed to perform an action. The user permission check in turn checks if a module is enabled. The patch changes the order in which the checks are executed: First the permissions, then the extra conditions. A win of 1.5-3ms per call on my system.

menu-manager-optimize.patch Magnifier (947 Bytes) Daniel Ritz, 2013-01-03 14:45

Associated revisions

Revision 11112
Added by Jean-Philippe Lang about 9 years ago

Check permissions before the extra condition for displaying a menu item (#12721).

Patch by Daniel Ritz.


#1 Updated by Daniel Felix about 9 years ago

+1 from me.
Lesser requests for the same goal, are always a good idea. ;-)

#2 Updated by Jean-Philippe Lang about 9 years ago

  • Status changed from New to Closed
  • Target version set to 2.3.0

Patch committed in r11112, thanks for pointing this out.

Also available in: Atom PDF