diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-11-19 19:35:38 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-11-19 19:35:38 +0000 |
commit | e1780825eeae0b1b839502da06dfb0e843b1b292 (patch) | |
tree | 1a766ffa76fadd759e3caa00e7db756299912d7b /spec | |
parent | 56476f18475deb896c09b47e967dc5146f66778b (diff) | |
parent | 094e1cc01b4f98ea4b8cd664344f3b8b583af471 (diff) | |
download | gitlab-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.rb | 55 |
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 |