2019-10-10 17:06:01 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Gitlab
|
|
|
|
module Analytics
|
|
|
|
module CycleAnalytics
|
|
|
|
class Median
|
|
|
|
include StageQueryHelpers
|
|
|
|
|
2021-04-28 02:09:49 -04:00
|
|
|
def initialize(stage:, query:, params: {})
|
2019-10-10 17:06:01 -04:00
|
|
|
@stage = stage
|
|
|
|
@query = query
|
2021-04-28 02:09:49 -04:00
|
|
|
@params = params
|
2019-10-10 17:06:01 -04:00
|
|
|
end
|
|
|
|
|
2020-05-29 17:08:35 -04:00
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
2019-10-10 17:06:01 -04:00
|
|
|
def seconds
|
2020-05-29 17:08:35 -04:00
|
|
|
@query = @query.select(median_duration_in_seconds.as('median')).reorder(nil)
|
2019-10-10 17:06:01 -04:00
|
|
|
result = execute_query(@query).first || {}
|
|
|
|
|
2020-05-11 20:10:11 -04:00
|
|
|
result['median'] || nil
|
2019-10-10 17:06:01 -04:00
|
|
|
end
|
2020-05-29 17:08:35 -04:00
|
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
2019-10-10 17:06:01 -04:00
|
|
|
|
2020-04-29 14:09:56 -04:00
|
|
|
def days
|
|
|
|
seconds ? seconds.fdiv(1.day) : nil
|
|
|
|
end
|
|
|
|
|
2019-10-10 17:06:01 -04:00
|
|
|
private
|
|
|
|
|
2021-04-28 02:09:49 -04:00
|
|
|
attr_reader :stage, :params
|
2019-10-10 17:06:01 -04:00
|
|
|
|
|
|
|
def percentile_cont
|
|
|
|
percentile_cont_ordering = Arel::Nodes::UnaryOperation.new(Arel::Nodes::SqlLiteral.new('ORDER BY'), duration)
|
|
|
|
Arel::Nodes::NamedFunction.new(
|
|
|
|
'percentile_cont(0.5) WITHIN GROUP',
|
|
|
|
[percentile_cont_ordering]
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def median_duration_in_seconds
|
|
|
|
Arel::Nodes::Extract.new(percentile_cont, :epoch)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|