Restore memoization to base query and add a batch base query method
This commit is contained in:
parent
4fcbcce364
commit
41bb23ae1d
6 changed files with 16 additions and 11 deletions
|
@ -7,8 +7,13 @@ class CycleAnalytics
|
||||||
end
|
end
|
||||||
|
|
||||||
def all_medians_per_stage
|
def all_medians_per_stage
|
||||||
STAGES.each_with_object({}) do |stage_name, hsh|
|
medians_per_stage = {}
|
||||||
hsh[stage_name] = self[stage_name].median
|
|
||||||
|
# We only need this data for Postgres instances
|
||||||
|
return medians_per_stage if Gitlab::Database.mysql?
|
||||||
|
|
||||||
|
STAGES.each do |stage_name|
|
||||||
|
medians_per_stage[stage_name] = self[stage_name].median
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,6 @@ class AnalyticsStageEntity < Grape::Entity
|
||||||
expose :description
|
expose :description
|
||||||
|
|
||||||
expose :median, as: :value do |stage|
|
expose :median, as: :value do |stage|
|
||||||
stage.median && !stage.median.blank? ? distance_of_time_in_words(stage.median) : nil
|
distance_of_time_in_words(stage.median) if stage.median && !(stage.median.blank? || stage.median.zero?)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,14 +7,15 @@ module Gitlab
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def base_query(project_ids = nil)
|
def base_query
|
||||||
stage_query(project_ids)
|
@base_query ||= stage_query([@project.id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def stage_query(project_ids = nil)
|
def stage_query(project_ids)
|
||||||
query = mr_closing_issues_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id]))
|
query = mr_closing_issues_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id]))
|
||||||
.join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id]))
|
.join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id]))
|
||||||
.where(issue_table[:project_id].in(project_ids || @project.id)) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
.project(issue_table[:project_id].as("project_id"))
|
||||||
|
.where(issue_table[:project_id].in(project_ids)) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
.where(issue_table[:created_at].gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
.where(issue_table[:created_at].gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
|
|
||||||
# Load merge_requests
|
# Load merge_requests
|
||||||
|
@ -22,7 +23,6 @@ module Gitlab
|
||||||
.on(mr_table[:id].eq(mr_closing_issues_table[:merge_request_id]))
|
.on(mr_table[:id].eq(mr_closing_issues_table[:merge_request_id]))
|
||||||
.join(mr_metrics_table)
|
.join(mr_metrics_table)
|
||||||
.on(mr_table[:id].eq(mr_metrics_table[:merge_request_id]))
|
.on(mr_table[:id].eq(mr_metrics_table[:merge_request_id]))
|
||||||
.project(issue_table[:project_id].as("project_id"))
|
|
||||||
|
|
||||||
query
|
query
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,7 +29,7 @@ module Gitlab
|
||||||
# We compute the (end_time - start_time) interval, and give it an alias based on the current
|
# We compute the (end_time - start_time) interval, and give it an alias based on the current
|
||||||
# cycle analytics stage.
|
# cycle analytics stage.
|
||||||
interval_query = Arel::Nodes::As.new(cte_table,
|
interval_query = Arel::Nodes::As.new(cte_table,
|
||||||
subtract_datetimes(base_query(project_ids), start_time_attrs, end_time_attrs, name.to_s))
|
subtract_datetimes(stage_query(project_ids), start_time_attrs, end_time_attrs, name.to_s))
|
||||||
|
|
||||||
median_datetimes(cte_table, interval_query, name, :project_id)&.each do |project_id, median|
|
median_datetimes(cte_table, interval_query, name, :project_id)&.each do |project_id, median|
|
||||||
loader.call(project_id, median)
|
loader.call(project_id, median)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module Gitlab
|
module Gitlab
|
||||||
module CycleAnalytics
|
module CycleAnalytics
|
||||||
module ProductionHelper
|
module ProductionHelper
|
||||||
def stage_query(project_ids = nil)
|
def stage_query(project_ids)
|
||||||
super(project_ids)
|
super(project_ids)
|
||||||
.where(mr_metrics_table[:first_deployed_to_production_at]
|
.where(mr_metrics_table[:first_deployed_to_production_at]
|
||||||
.gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
.gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
|
|
|
@ -25,7 +25,7 @@ module Gitlab
|
||||||
_("Total test time for all commits/merges")
|
_("Total test time for all commits/merges")
|
||||||
end
|
end
|
||||||
|
|
||||||
def stage_query(project_ids = nil)
|
def stage_query(project_ids)
|
||||||
if @options[:branch]
|
if @options[:branch]
|
||||||
super(project_ids).where(build_table[:ref].eq(@options[:branch]))
|
super(project_ids).where(build_table[:ref].eq(@options[:branch]))
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue