diff options
Diffstat (limited to 'lib/gitlab/analytics')
4 files changed, 30 insertions, 21 deletions
diff --git a/lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb b/lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb index 1e50c980a3a..dd8149aba94 100644 --- a/lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb +++ b/lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb @@ -37,6 +37,16 @@ module Gitlab filter_assignees(query) end + def build_sorted_query + direction = params[:direction] || :desc + + if params[:sort] == :duration + build.order_by_duration(direction) + else + build.order_by_end_event(direction) + end + end + def filter_author(query) return query if params[:author_username].blank? diff --git a/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb index 2441b7a7497..22d8874db57 100644 --- a/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb +++ b/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb @@ -32,7 +32,7 @@ module Gitlab def records_fetcher strong_memoize(:records_fetcher) do - RecordsFetcher.new(stage: stage, query: query, params: params) + RecordsFetcher.new(stage: stage, query: query_builder.build_sorted_query, params: params) end end @@ -41,7 +41,11 @@ module Gitlab attr_reader :stage, :params def query - BaseQueryBuilder.new(stage: stage, params: params).build + query_builder.build + end + + def query_builder + @query_builder = BaseQueryBuilder.new(stage: stage, params: params) end def limit_count diff --git a/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb b/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb index 1742d396c10..55e421173d7 100644 --- a/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb +++ b/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb @@ -36,7 +36,13 @@ module Gitlab def serialized_records strong_memoize(:serialized_records) do - records = ordered_and_limited_query.select(stage_event_model.arel_table[Arel.star], duration_in_seconds.as('total_time')) + # When RecordsFetcher is used with query sourced from + # InOperatorOptimization::QueryBuilder only columns + # used in ORDER BY statement would be selected by Arel.start operation + selections = [stage_event_model.arel_table[Arel.star]] + selections << duration_in_seconds.as('total_time') if params[:sort] != :duration # duration sorting already exposes this data + + records = limited_query.select(*selections) yield records if block_given? issuables_and_records = load_issuables(records) @@ -56,27 +62,12 @@ module Gitlab end end - # rubocop: disable CodeReuse/ActiveRecord - def ordered_and_limited_query - sorting_options = { - end_event: { - asc: -> { query.order(end_event_timestamp: :asc) }, - desc: -> { query.order(end_event_timestamp: :desc) } - }, - duration: { - asc: -> { query.order(duration.asc) }, - desc: -> { query.order(duration.desc) } - } - } - - sort_lambda = sorting_options.dig(sort, direction) || sorting_options.dig(:end_event, :desc) - - sort_lambda.call + def limited_query + query .page(page) .per(per_page) .without_count end - # rubocop: enable CodeReuse/ActiveRecord private diff --git a/lib/gitlab/analytics/cycle_analytics/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/data_collector.rb index a20481dd39e..ae675b6ad27 100644 --- a/lib/gitlab/analytics/cycle_analytics/data_collector.rb +++ b/lib/gitlab/analytics/cycle_analytics/data_collector.rb @@ -62,7 +62,11 @@ module Gitlab attr_reader :stage, :params def query - BaseQueryBuilder.new(stage: stage, params: params).build + query_builder.build + end + + def query_builder + @query_builder ||= BaseQueryBuilder.new(stage: stage, params: params) end # Limiting the maximum number of records so the COUNT(*) query stays efficient for large groups. |