diff --git a/app/finders/projects/topics_finder.rb b/app/finders/projects/topics_finder.rb index 7c3abc27cf73105964cb33f8f06a90c4ee9009b4..c26b166a786c5135bd13d239a97ea5a0b048095b 100644 --- a/app/finders/projects/topics_finder.rb +++ b/app/finders/projects/topics_finder.rb @@ -12,7 +12,7 @@ def initialize(params: {}) end def execute - topics = Projects::Topic.order_by_total_projects_count + topics = Projects::Topic.order_by_non_private_projects_count by_search(topics) end diff --git a/app/graphql/resolvers/topics_resolver.rb b/app/graphql/resolvers/topics_resolver.rb index d8199f3d89b32557306d096479693c635bcf366b..68e2ff692827e418214b7e57d0cc783df0112466 100644 --- a/app/graphql/resolvers/topics_resolver.rb +++ b/app/graphql/resolvers/topics_resolver.rb @@ -10,9 +10,9 @@ class TopicsResolver < BaseResolver def resolve(**args) if args[:search].present? - ::Projects::Topic.search(args[:search]).order_by_total_projects_count + ::Projects::Topic.search(args[:search]).order_by_non_private_projects_count else - ::Projects::Topic.order_by_total_projects_count + ::Projects::Topic.order_by_non_private_projects_count end end end diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb index 78bc2df2e1ed337c42e68798db8568f48a9dcdf8..6f9732588c0ae334bb45c47e2240902fc537fbc7 100644 --- a/app/models/projects/topic.rb +++ b/app/models/projects/topic.rb @@ -13,12 +13,12 @@ class Topic < ApplicationRecord has_many :project_topics, class_name: 'Projects::ProjectTopic' has_many :projects, through: :project_topics - scope :order_by_total_projects_count, -> { order(total_projects_count: :desc).order(id: :asc) } + scope :order_by_non_private_projects_count, -> { order(non_private_projects_count: :desc).order(id: :asc) } scope :reorder_by_similarity, -> (search) do order_expression = Gitlab::Database::SimilarityScore.build_expression(search: search, rules: [ { column: arel_table['name'] } ]) - reorder(order_expression.desc, arel_table['total_projects_count'].desc, arel_table['id']) + reorder(order_expression.desc, arel_table['non_private_projects_count'].desc, arel_table['id']) end class << self diff --git a/db/migrate/20220211090920_cleanup_populate_topics_non_private_projects_count.rb b/db/migrate/20220211090920_cleanup_populate_topics_non_private_projects_count.rb new file mode 100644 index 0000000000000000000000000000000000000000..5ab8feb2195125aa108d02a69348c112ee5c37cc --- /dev/null +++ b/db/migrate/20220211090920_cleanup_populate_topics_non_private_projects_count.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class CleanupPopulateTopicsNonPrivateProjectsCount < Gitlab::Database::Migration[1.0] + MIGRATION = 'PopulateTopicsNonPrivateProjectsCount' + + disable_ddl_transaction! + + def up + finalize_background_migration(MIGRATION) + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20220211090920 b/db/schema_migrations/20220211090920 new file mode 100644 index 0000000000000000000000000000000000000000..1f08b66e508392e1f5f36e4892c1cc25df29b2bf --- /dev/null +++ b/db/schema_migrations/20220211090920 @@ -0,0 +1 @@ +644d38e401ac8179777cb9d3c5fefca2fb55e0c409197bb2d222f7e96e5dd42f \ No newline at end of file diff --git a/spec/finders/projects/topics_finder_spec.rb b/spec/finders/projects/topics_finder_spec.rb index 28802c5d49e55129988ed6772a70b69068690e99..3812f0757bcbc3ba2c58a9ca755dfabdab7f5c1e 100644 --- a/spec/finders/projects/topics_finder_spec.rb +++ b/spec/finders/projects/topics_finder_spec.rb @@ -9,9 +9,9 @@ let!(:topic2) { create(:topic, name: 'topicC') } let!(:topic3) { create(:topic, name: 'topicA') } - let!(:project1) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA, topicB') } - let!(:project2) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA') } - let!(:project3) { create(:project, namespace: user.namespace, topic_list: 'topicC') } + let!(:project1) { create(:project, :public, namespace: user.namespace, topic_list: 'topicC, topicA, topicB') } + let!(:project2) { create(:project, :public, namespace: user.namespace, topic_list: 'topicC, topicA') } + let!(:project3) { create(:project, :public, namespace: user.namespace, topic_list: 'topicC') } describe '#execute' do it 'returns topics' do diff --git a/spec/graphql/resolvers/topics_resolver_spec.rb b/spec/graphql/resolvers/topics_resolver_spec.rb index 3ff1dabc927901a694a8eb6e8bd65f1db6a9489a..89f4583bce8882d728386773c2c08de435e58e73 100644 --- a/spec/graphql/resolvers/topics_resolver_spec.rb +++ b/spec/graphql/resolvers/topics_resolver_spec.rb @@ -6,9 +6,9 @@ include GraphqlHelpers describe '#resolve' do - let!(:topic1) { create(:topic, name: 'GitLab', total_projects_count: 1) } - let!(:topic2) { create(:topic, name: 'git', total_projects_count: 2) } - let!(:topic3) { create(:topic, name: 'topic3', total_projects_count: 3) } + let!(:topic1) { create(:topic, name: 'GitLab', non_private_projects_count: 1) } + let!(:topic2) { create(:topic, name: 'git', non_private_projects_count: 2) } + let!(:topic3) { create(:topic, name: 'topic3', non_private_projects_count: 3) } it 'finds all topics' do expect(resolve_topics).to eq([topic3, topic2, topic1]) diff --git a/spec/models/projects/topic_spec.rb b/spec/models/projects/topic_spec.rb index 397c65f4d5c53ed0efec0573963ecbc6859daf20..1915dbe9fcc302ae358741d8c0b2cf6927517dea 100644 --- a/spec/models/projects/topic_spec.rb +++ b/spec/models/projects/topic_spec.rb @@ -28,16 +28,16 @@ end describe 'scopes' do - describe 'order_by_total_projects_count' do + describe 'order_by_non_private_projects_count' do let!(:topic1) { create(:topic, name: 'topicB') } let!(:topic2) { create(:topic, name: 'topicC') } let!(:topic3) { create(:topic, name: 'topicA') } - let!(:project1) { create(:project, topic_list: 'topicC, topicA, topicB') } - let!(:project2) { create(:project, topic_list: 'topicC, topicA') } - let!(:project3) { create(:project, topic_list: 'topicC') } + let!(:project1) { create(:project, :public, topic_list: 'topicC, topicA, topicB') } + let!(:project2) { create(:project, :public, topic_list: 'topicC, topicA') } + let!(:project3) { create(:project, :public, topic_list: 'topicC') } - it 'sorts topics by total_projects_count' do - topics = described_class.order_by_total_projects_count + it 'sorts topics by non_private_projects_count' do + topics = described_class.order_by_non_private_projects_count expect(topics.map(&:name)).to eq(%w[topicC topicA topicB topic]) end diff --git a/spec/requests/api/topics_spec.rb b/spec/requests/api/topics_spec.rb index 70eee8a1af90e96afcff42e242bf0ffc9811a455..9c6b47300d0ec032072b5694fce37daf0a8cf60b 100644 --- a/spec/requests/api/topics_spec.rb +++ b/spec/requests/api/topics_spec.rb @@ -7,9 +7,9 @@ let_it_be(:file) { fixture_file_upload('spec/fixtures/dk.png') } - let_it_be(:topic_1) { create(:topic, name: 'Git', total_projects_count: 1, avatar: file) } - let_it_be(:topic_2) { create(:topic, name: 'GitLab', total_projects_count: 2) } - let_it_be(:topic_3) { create(:topic, name: 'other-topic', total_projects_count: 3) } + let_it_be(:topic_1) { create(:topic, name: 'Git', total_projects_count: 1, non_private_projects_count: 1, avatar: file) } + let_it_be(:topic_2) { create(:topic, name: 'GitLab', total_projects_count: 2, non_private_projects_count: 2) } + let_it_be(:topic_3) { create(:topic, name: 'other-topic', total_projects_count: 3, non_private_projects_count: 3) } let_it_be(:admin) { create(:user, :admin) } let_it_be(:user) { create(:user) }