diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2017-12-13 09:55:52 +0100 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2017-12-13 09:55:52 +0100 |
commit | 1db1a0afc79907b1e31eadc1c18b4ea134840fd7 (patch) | |
tree | 864e696ed70833ab144313e8b02a719a9e4a3901 | |
parent | a11fae2489c650bcb6cdd9e5a31c0ea01041256f (diff) | |
download | gitlab-ce-jprovazn-feature-filter.tar.gz |
Use negative comparison on feature filteringjprovazn-feature-filter
Use search for "other than disabled" features, instead
of enumerating all not-disabled values. This optimizes
and simplifies SQL query which allows to create significantly
faster query plan.
-rw-r--r-- | app/models/project.rb | 2 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 15 |
2 files changed, 16 insertions, 1 deletions
diff --git a/app/models/project.rb b/app/models/project.rb index 5183a216c53..64f9aae9c53 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -301,7 +301,7 @@ class Project < ActiveRecord::Base # "enabled" here means "not disabled". It includes private features! scope :with_feature_enabled, ->(feature) { access_level_attribute = ProjectFeature.access_level_attribute(feature) - with_project_feature.where(project_features: { access_level_attribute => [nil, ProjectFeature::PRIVATE, ProjectFeature::ENABLED] }) + with_project_feature.where.not(project_features: { access_level_attribute => ProjectFeature::DISABLED }) } # Picks a feature where the level is exactly that given. diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index dd9e8498519..f777e03f016 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -996,6 +996,21 @@ describe Project do end end + describe '.with_feature_enabled' do + context 'when there is a project with a feature disabled' do + let!(:project1) { create(:project, issues_access_level: ProjectFeature::DISABLED) } + let!(:project2) { create(:project, issues_access_level: ProjectFeature::ENABLED) } + let!(:project3) { create(:project, issues_access_level: ProjectFeature::PRIVATE) } + let(:features) { %w(issues) } + + it "ignores only disabled project" do + projects = described_class.with_feature_enabled(:issues) + expect(projects).not_to include(project1) + expect(projects).to include(project2, project3) + end + end + end + describe '.cached_count', :use_clean_rails_memory_store_caching do let(:group) { create(:group, :public) } let!(:project1) { create(:project, :public, group: group) } |