summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-19 19:35:38 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-19 19:35:38 +0000
commite1780825eeae0b1b839502da06dfb0e843b1b292 (patch)
tree1a766ffa76fadd759e3caa00e7db756299912d7b /spec
parent56476f18475deb896c09b47e967dc5146f66778b (diff)
parent094e1cc01b4f98ea4b8cd664344f3b8b583af471 (diff)
downloadgitlab-ce-e1780825eeae0b1b839502da06dfb0e843b1b292.tar.gz
Merge branch 'finding-issues-by-labels-performance' into 'master'
Improve performance of finding issues with/without labels The changes in this MR ultimately lead to finding issues with(out) labels being about 2x faster due to: 1. Newly added indexes on `issues.state` and `projects.visibility_level` 2. Adjusting the query so that finding issues for multiple projects is more efficient See merge request !1787
Diffstat (limited to 'spec')
-rw-r--r--spec/benchmarks/finders/issues_finder_spec.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/spec/benchmarks/finders/issues_finder_spec.rb b/spec/benchmarks/finders/issues_finder_spec.rb
new file mode 100644
index 00000000000..b57a33004a4
--- /dev/null
+++ b/spec/benchmarks/finders/issues_finder_spec.rb
@@ -0,0 +1,55 @@
+require 'spec_helper'
+
+describe IssuesFinder, benchmark: true do
+ describe '#execute' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :public) }
+
+ let(:label1) { create(:label, project: project, title: 'A') }
+ let(:label2) { create(:label, project: project, title: 'B') }
+
+ before do
+ 10.times do |n|
+ issue = create(:issue, author: user, project: project)
+
+ if n > 4
+ create(:label_link, label: label1, target: issue)
+ create(:label_link, label: label2, target: issue)
+ end
+ end
+ end
+
+ describe 'retrieving issues without labels' do
+ let(:finder) do
+ IssuesFinder.new(user, scope: 'all', label_name: Label::None.title,
+ state: 'opened')
+ end
+
+ benchmark_subject { finder.execute }
+
+ it { is_expected.to iterate_per_second(2000) }
+ end
+
+ describe 'retrieving issues with labels' do
+ let(:finder) do
+ IssuesFinder.new(user, scope: 'all', label_name: label1.title,
+ state: 'opened')
+ end
+
+ benchmark_subject { finder.execute }
+
+ it { is_expected.to iterate_per_second(1000) }
+ end
+
+ describe 'retrieving issues for a single project' do
+ let(:finder) do
+ IssuesFinder.new(user, scope: 'all', label_name: Label::None.title,
+ state: 'opened', project_id: project.id)
+ end
+
+ benchmark_subject { finder.execute }
+
+ it { is_expected.to iterate_per_second(2000) }
+ end
+ end
+end