From 99f6dfc88b70a531b695d9d54df2c6bb28ac293e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20W=C3=A4lter?= <jonas.waelter@noser.com>
Date: Fri, 11 Feb 2022 10:16:30 +0100
Subject: [PATCH] Change the order column of topics to
 non_private_projects_count

Changelog: changed
---
 app/finders/projects/topics_finder.rb             |  2 +-
 app/graphql/resolvers/topics_resolver.rb          |  4 ++--
 app/models/projects/topic.rb                      |  4 ++--
 ..._populate_topics_non_private_projects_count.rb | 15 +++++++++++++++
 db/schema_migrations/20220211090920               |  1 +
 spec/finders/projects/topics_finder_spec.rb       |  6 +++---
 spec/graphql/resolvers/topics_resolver_spec.rb    |  6 +++---
 spec/models/projects/topic_spec.rb                | 12 ++++++------
 spec/requests/api/topics_spec.rb                  |  6 +++---
 9 files changed, 36 insertions(+), 20 deletions(-)
 create mode 100644 db/migrate/20220211090920_cleanup_populate_topics_non_private_projects_count.rb
 create mode 100644 db/schema_migrations/20220211090920

diff --git a/app/finders/projects/topics_finder.rb b/app/finders/projects/topics_finder.rb
index 7c3abc27cf73..c26b166a786c 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 d8199f3d89b3..68e2ff692827 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 78bc2df2e1ed..6f9732588c0a 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 000000000000..5ab8feb21951
--- /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 000000000000..1f08b66e5083
--- /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 28802c5d49e5..3812f0757bcb 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 3ff1dabc9279..89f4583bce88 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 397c65f4d5c5..1915dbe9fcc3 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 70eee8a1af90..9c6b47300d0e 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) }
-- 
GitLab