diff --git a/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml b/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml new file mode 100644 index 0000000000000000000000000000000000000000..a52dacbe229ae3db9738cdeeab6d98a587e735db --- /dev/null +++ b/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml @@ -0,0 +1,8 @@ +--- +name: use_500_page_size_for_contribution_analytics +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136724 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/431595 +milestone: '16.7' +type: development +group: group::optimize +default_enabled: false diff --git a/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue b/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue index 43a89dcb7afcdff76388b10483f43796adf39a29..2b4734b2d8cc1a32afc5d0da3d7b8b740385e1a2 100644 --- a/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue +++ b/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue @@ -84,10 +84,12 @@ export default { try { const { endDate, nextStartDate } = this.limitPostgresqlRequests(startDate, this.endDate); + const pageSize = gon.features?.use500PageSizeForContributionAnalytics ? 500 : null; const { data } = await this.$apollo.query({ query: contributionsQuery, variables: { + first: pageSize, fullPath: this.fullPath, startDate, endDate, diff --git a/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql b/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql index f09d08fc2105ae735f2efa64bc4e8686032e244c..adbe03d3c93f14029825775dec7c63cf72103fe9 100644 --- a/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql +++ b/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql @@ -3,10 +3,11 @@ query getContributionsData( $startDate: ISO8601Date! $endDate: ISO8601Date! $nextPageCursor: String = "" + $first: Int ) { group(fullPath: $fullPath) { id - contributions(from: $startDate, to: $endDate, after: $nextPageCursor) { + contributions(from: $startDate, to: $endDate, first: $first, after: $nextPageCursor) { nodes { repoPushed mergeRequestsCreated diff --git a/ee/app/controllers/groups/contribution_analytics_controller.rb b/ee/app/controllers/groups/contribution_analytics_controller.rb index 17cb4247a0a6cab23dc1215efa9356707d8a150d..db24ad0647d783fc3805ceb4d651d1d30610b723 100644 --- a/ee/app/controllers/groups/contribution_analytics_controller.rb +++ b/ee/app/controllers/groups/contribution_analytics_controller.rb @@ -23,6 +23,8 @@ def show # https://gitlab.com/gitlab-org/gitlab/-/issues/428585 @data_source_clickhouse = Feature.enabled?(:clickhouse_data_collection, group) + push_frontend_feature_flag(:use_500_page_size_for_contribution_analytics, group) + respond_to do |format| format.html format.json do diff --git a/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb b/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb index 18ccff0157d5824da617b1c5ec0c8a69ac5ca3e2..1d49088a9cf963e97e57ef27802ca84b66f5277a 100644 --- a/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb +++ b/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb @@ -17,6 +17,9 @@ class ContributionsResolver < BaseResolver "The end date must be within #{NUMBER_OF_DAYS} days after the start date." # rubocop:enable Layout/LineLength + max_page_size 500 + default_page_size GitlabSchema.default_max_page_size # ensure backwards compability + def resolve(from:, to:) validate_date_range!(from, to) diff --git a/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js b/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js index 8264db4e334ea85cc9597b63ffbdeb880daa4d9d..544c27ab86deaf697d203e5f8af412f9a5fb56fa 100644 --- a/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js +++ b/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js @@ -39,6 +39,7 @@ describe('Contribution Analytics App', () => { wrapper = shallowMount(App, { apolloProvider, propsData: { + first: null, fullPath: 'test', startDate: '2000-12-10', endDate: '2000-12-31', @@ -71,6 +72,7 @@ describe('Contribution Analytics App', () => { results.forEach((result) => expect(resolver).toHaveBeenCalledWith({ fullPath: wrapper.props('fullPath'), + first: null, ...result, }), ); @@ -95,6 +97,35 @@ describe('Contribution Analytics App', () => { expect(findErrorAlert().text()).toEqual(wrapper.vm.$options.i18n.error); }); + it('fetches a page size of 500 when use_500_page_size_for_contribution_analytics is enabled', async () => { + gon.features = { use500PageSizeForContributionAnalytics: true }; + + const contributionsQueryResolver = jest + .fn() + .mockResolvedValueOnce(mockApiResponse({ endCursor: nextPageCursor })) + .mockResolvedValueOnce(mockApiResponse()); + + createWrapper({ contributionsQueryResolver, props: { dataSourceClickhouse: true } }); + await waitForPromises(); + + expectGroupMembersTableToHaveData(); + + expectContributionsQueryResolverCalls(contributionsQueryResolver, [ + { + first: 500, + startDate: '2000-12-10', + endDate: '2000-12-31', + nextPageCursor: '', + }, + { + first: 500, + startDate: '2000-12-10', + endDate: '2000-12-31', + nextPageCursor, + }, + ]); + }); + it('fetches Clickhouse data, using paginated requests when necessary', async () => { const contributionsQueryResolver = jest .fn()