summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Provaznik <jprovaznik@gitlab.com>2017-12-13 09:55:52 +0100
committerJan Provaznik <jprovaznik@gitlab.com>2017-12-13 09:55:52 +0100
commit1db1a0afc79907b1e31eadc1c18b4ea134840fd7 (patch)
tree864e696ed70833ab144313e8b02a719a9e4a3901
parenta11fae2489c650bcb6cdd9e5a31c0ea01041256f (diff)
downloadgitlab-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.rb2
-rw-r--r--spec/models/project_spec.rb15
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) }