From 1399eb058bfe22dc3fac5ee464e25ea67dd9e59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Wed, 11 Jul 2018 15:27:34 +0200 Subject: Fix performance problem of accessing tag list for projects api endpoints --- .../unreleased/fix-performance-problem-of-tags-query.yml | 5 +++++ lib/api/entities.rb | 15 +++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 changelogs/unreleased/fix-performance-problem-of-tags-query.yml diff --git a/changelogs/unreleased/fix-performance-problem-of-tags-query.yml b/changelogs/unreleased/fix-performance-problem-of-tags-query.yml new file mode 100644 index 00000000000..4649775be9c --- /dev/null +++ b/changelogs/unreleased/fix-performance-problem-of-tags-query.yml @@ -0,0 +1,5 @@ +--- +title: Fix performance problem of accessing tag list for projects api endpoints +merge_request: +author: +type: performance diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 40df1e79bc7..b52bf34eb90 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -135,10 +135,13 @@ module API expose :custom_attributes, using: 'API::Entities::CustomAttribute', if: :with_custom_attributes def self.preload_relation(projects_relation, options = {}) + # Preloading tags, should be done with using only `:tags`, + # as `:tags` are defined as: `has_many :tags, through: :taggings` + # N+1 is solved then by using `subject.tags.map(&:name)` + # MR describing the solution: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20555 projects_relation.preload(:project_feature, :route) - .preload(:import_state) - .preload(namespace: [:route, :owner], - tags: :taggings) + .preload(:import_state, :tags) + .preload(namespace: [:route, :owner]) end end @@ -212,11 +215,15 @@ module API expose :statistics, using: 'API::Entities::ProjectStatistics', if: :statistics def self.preload_relation(projects_relation, options = {}) + # Preloading tags, should be done with using only `:tags`, + # as `:tags` are defined as: `has_many :tags, through: :taggings` + # N+1 is solved then by using `subject.tags.map(&:name)` + # MR describing the solution: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20555 super(projects_relation).preload(:group) .preload(project_group_links: :group, fork_network: :root_project, forked_project_link: :forked_from_project, - forked_from_project: [:route, :forks, namespace: :route, tags: :taggings]) + forked_from_project: [:route, :forks, :tags, namespace: :route]) end def self.forks_counting_projects(projects_relation) -- cgit v1.2.3