From f67710a7c7573443f8e5a75c172f47dfa65b7dce Mon Sep 17 00:00:00 2001 From: Sheldon Led <sheldonled@gitlab.com> Date: Wed, 7 Feb 2024 17:59:10 +0000 Subject: [PATCH] Move to CE the Namespace Project Sort Enums related to storage size --- app/finders/namespaces/projects_finder.rb | 2 ++ .../types/projects/namespace_project_sort_enum.rb | 2 ++ app/models/project.rb | 9 +++++++++ doc/api/graphql/reference/index.md | 3 ++- .../components/namespace_storage_app.stories.js | 4 ++-- .../usage_quotas/storage/init_namespace_storage.js | 2 +- ee/app/finders/ee/namespaces/projects_finder.rb | 3 --- .../types/projects/namespace_project_sort_enum.rb | 11 ++++++----- ee/app/models/ee/project.rb | 10 ---------- .../components/namespace_storage_app_spec.js | 4 ++-- ee/spec/models/ee/project_spec.rb | 14 -------------- .../api/graphql/namespace/projects_spec.rb | 4 ++-- spec/models/project_spec.rb | 14 ++++++++++++++ 13 files changed, 42 insertions(+), 40 deletions(-) diff --git a/app/finders/namespaces/projects_finder.rb b/app/finders/namespaces/projects_finder.rb index 6547d41dcdddd..5ef26ca90759c 100644 --- a/app/finders/namespaces/projects_finder.rb +++ b/app/finders/namespaces/projects_finder.rb @@ -80,6 +80,8 @@ def by_feature_availability(items) def sort(items) return items.projects_order_id_desc unless params[:sort] + return items.order_by_storage_size(:asc) if params[:sort] == :storage_size_asc + return items.order_by_storage_size(:desc) if params[:sort] == :storage_size_desc if params[:sort] == :similarity && params[:search].present? return items.sorted_by_similarity_desc(params[:search], include_in_select: true) diff --git a/app/graphql/types/projects/namespace_project_sort_enum.rb b/app/graphql/types/projects/namespace_project_sort_enum.rb index 14a315781efab..29a5c86b084b3 100644 --- a/app/graphql/types/projects/namespace_project_sort_enum.rb +++ b/app/graphql/types/projects/namespace_project_sort_enum.rb @@ -8,6 +8,8 @@ class NamespaceProjectSortEnum < BaseEnum value 'SIMILARITY', 'Most similar to the search query.', value: :similarity value 'ACTIVITY_DESC', 'Sort by latest activity, descending order.', value: :latest_activity_desc + value 'STORAGE_SIZE_ASC', 'Sort by total storage size, ascending order.', value: :storage_size_asc + value 'STORAGE_SIZE_DESC', 'Sort by total storage size, descending order.', value: :storage_size_desc end end end diff --git a/app/models/project.rb b/app/models/project.rb index 7f1c3cd475c2f..c52562ff8f680 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -639,6 +639,15 @@ def self.integration_association_name(name) # Sometimes queries (e.g. using CTEs) require explicit disambiguation with table name scope :projects_order_id_asc, -> { reorder(self.arel_table['id'].asc) } scope :projects_order_id_desc, -> { reorder(self.arel_table['id'].desc) } + scope :order_by_storage_size, -> (direction) do + build_keyset_order_on_joined_column( + scope: joins(:statistics), + attribute_name: 'project_statistics_storage_size', + column: ::ProjectStatistics.arel_table[:storage_size], + direction: direction, + nullable: :nulls_first + ) + end scope :sorted_by_similarity_desc, -> (search, include_in_select: false) do order_expression = Gitlab::Database::SimilarityScore.build_expression( diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 88f8a3f2fc2f1..9eea2bef404d5 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -31352,8 +31352,9 @@ Values for sorting projects. | Value | Description | | ----- | ----------- | | <a id="namespaceprojectsortactivity_desc"></a>`ACTIVITY_DESC` | Sort by latest activity, descending order. | +| <a id="namespaceprojectsortexcess_repo_storage_size_desc"></a>`EXCESS_REPO_STORAGE_SIZE_DESC` | Sort by excess repository storage size, descending order. | | <a id="namespaceprojectsortsimilarity"></a>`SIMILARITY` | Most similar to the search query. | -| <a id="namespaceprojectsortstorage"></a>`STORAGE` | Sort by excess repository storage size, descending order. | +| <a id="namespaceprojectsortstorage"></a>`STORAGE` **{warning-solid}** | **Deprecated** in 16.9. Please use EXCESS_REPO_STORAGE_SIZE_DESC. | | <a id="namespaceprojectsortstorage_size_asc"></a>`STORAGE_SIZE_ASC` | Sort by total storage size, ascending order. | | <a id="namespaceprojectsortstorage_size_desc"></a>`STORAGE_SIZE_DESC` | Sort by total storage size, descending order. | diff --git a/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js b/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js index 4309457aa1ec3..340ca7d79200a 100644 --- a/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js +++ b/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js @@ -68,7 +68,7 @@ export const SaasWithProjectLimits = { isUsingProjectEnforcementWithLimits: true, isUsingProjectEnforcementWithNoLimits: false, totalRepositorySizeExcess: 3 * GIBIBYTE, - customSortKey: 'STORAGE', + customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC', }, }), }; @@ -112,7 +112,7 @@ export const SaasWithProjectLimitsLoading = { isUsingProjectEnforcementWithLimits: true, isUsingProjectEnforcementWithNoLimits: false, totalRepositorySizeExcess: 3 * GIBIBYTE, - customSortKey: 'STORAGE', + customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC', }, })(...args); }, diff --git a/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js b/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js index ed19e9efe10c9..d5a7c0ec32f7b 100644 --- a/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js +++ b/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js @@ -60,7 +60,7 @@ export default () => { isUsingNamespaceEnforcement, isUsingProjectEnforcementWithLimits, isUsingProjectEnforcementWithNoLimits, - customSortKey: isUsingProjectEnforcementWithLimits ? 'STORAGE' : null, + customSortKey: isUsingProjectEnforcementWithLimits ? 'EXCESS_REPO_STORAGE_SIZE_DESC' : null, helpLinks, }, render(createElement) { diff --git a/ee/app/finders/ee/namespaces/projects_finder.rb b/ee/app/finders/ee/namespaces/projects_finder.rb index 858eab411adb4..2501edd72ce99 100644 --- a/ee/app/finders/ee/namespaces/projects_finder.rb +++ b/ee/app/finders/ee/namespaces/projects_finder.rb @@ -64,9 +64,6 @@ def sort(items) return items.order_by_excess_repo_storage_size_desc(namespace.actual_size_limit) end - return items.order_by_storage_size(:asc) if params[:sort] == :storage_size_asc - return items.order_by_storage_size(:desc) if params[:sort] == :storage_size_desc - super(items) end diff --git a/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb b/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb index 2dd6a9dd7ef04..ed1123fa4a786 100644 --- a/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb +++ b/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb @@ -7,13 +7,14 @@ module NamespaceProjectSortEnum extend ActiveSupport::Concern prepended do - # Storage size value 'STORAGE', 'Sort by excess repository storage size, descending order.', + value: :excess_repo_storage_size_desc, + deprecated: { + reason: 'Please use EXCESS_REPO_STORAGE_SIZE_DESC', + milestone: '16.9' + } + value 'EXCESS_REPO_STORAGE_SIZE_DESC', 'Sort by excess repository storage size, descending order.', value: :excess_repo_storage_size_desc - - # project_statistics columns - value 'STORAGE_SIZE_ASC', 'Sort by total storage size, ascending order.', value: :storage_size_asc - value 'STORAGE_SIZE_DESC', 'Sort by total storage size, descending order.', value: :storage_size_desc end end end diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index c2d92369ad7ab..a4476abb16a01 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -285,16 +285,6 @@ def lock_for_confirmation!(id) order.apply_cursor_conditions(joins(:statistics)).order(order) end - scope :order_by_storage_size, -> (direction) do - build_keyset_order_on_joined_column( - scope: joins(:statistics), - attribute_name: 'project_statistics_storage_size', - column: ::ProjectStatistics.arel_table[:storage_size], - direction: direction, - nullable: :nulls_first - ) - end - scope :with_project_setting, -> { includes(:project_setting) } scope :compliance_framework_id_in, -> (ids) do diff --git a/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js b/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js index af266e5c69710..ad22a6d0f5d22 100644 --- a/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js +++ b/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js @@ -135,13 +135,13 @@ describe('NamespaceStorageApp', () => { provide: { isUsingNamespaceEnforcement: false, isUsingProjectEnforcementWithLimits: true, - customSortKey: 'STORAGE', + customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC', }, }); expect(getProjectListStorageHandler).toHaveBeenCalledWith( expect.objectContaining({ - sortKey: 'STORAGE', + sortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC', }), ); diff --git a/ee/spec/models/ee/project_spec.rb b/ee/spec/models/ee/project_spec.rb index 0de2b4001d7ff..b444540b51add 100644 --- a/ee/spec/models/ee/project_spec.rb +++ b/ee/spec/models/ee/project_spec.rb @@ -453,20 +453,6 @@ it { is_expected.to eq([project_2, project_3, project_1]) } end - describe '.order_by_storage_size' do - let_it_be(:project_1) { create(:project_statistics, repository_size: 1).project } - let_it_be(:project_2) { create(:project_statistics, repository_size: 3).project } - let_it_be(:project_3) { create(:project_statistics, repository_size: 2).project } - - context 'ascending' do - it { expect(described_class.order_by_storage_size(:asc)).to eq([project_1, project_3, project_2]) } - end - - context 'descending' do - it { expect(described_class.order_by_storage_size(:desc)).to eq([project_2, project_3, project_1]) } - end - end - describe '.with_coverage_feature_usage' do let_it_be(:project_1) { create(:project) } let_it_be(:project_2) { create(:project) } diff --git a/ee/spec/requests/api/graphql/namespace/projects_spec.rb b/ee/spec/requests/api/graphql/namespace/projects_spec.rb index 8c4101298cbb3..808489ad8567f 100644 --- a/ee/spec/requests/api/graphql/namespace/projects_spec.rb +++ b/ee/spec/requests/api/graphql/namespace/projects_spec.rb @@ -28,7 +28,7 @@ def pagination_query(params) query_nodes(:projects, :name, include_pagination_info: true, args: params + project_args)) end - context 'when sorting by STORAGE' do + context 'when sorting by STORAGE_SIZE_DESC' do before do project_4.statistics.update!(lfs_objects_size: 1, repository_size: 4.gigabytes) project_2.statistics.update!(lfs_objects_size: 1, repository_size: 2.gigabytes) @@ -37,7 +37,7 @@ def pagination_query(params) it_behaves_like 'sorted paginated query' do let(:node_path) { %w[name] } - let(:sort_param) { :STORAGE } + let(:sort_param) { :STORAGE_SIZE_DESC } let(:first_param) { 2 } let(:all_records) { [project_4, project_2, project_3].map(&:name) } end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 3d5ccbc6feb17..d9d4018a7e427 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2126,6 +2126,20 @@ def has_external_wiki end end + describe '.order_by_storage_size' do + let_it_be(:project_1) { create(:project_statistics, repository_size: 1).project } + let_it_be(:project_2) { create(:project_statistics, repository_size: 3).project } + let_it_be(:project_3) { create(:project_statistics, repository_size: 2).project } + + context 'ascending' do + it { expect(described_class.order_by_storage_size(:asc)).to eq([project_1, project_3, project_2]) } + end + + context 'descending' do + it { expect(described_class.order_by_storage_size(:desc)).to eq([project_2, project_3, project_1]) } + end + end + describe '.with_shared_runners_enabled' do subject { described_class.with_shared_runners_enabled } -- GitLab