debian-mirror-gitlab/app/models/analytics/usage_trends/measurement.rb

62 lines
2.1 KiB
Ruby
Raw Normal View History

2020-11-24 15:15:51 +05:30
# frozen_string_literal: true
module Analytics
2021-04-17 20:07:23 +05:30
module UsageTrends
2020-11-24 15:15:51 +05:30
class Measurement < ApplicationRecord
2021-09-04 01:27:46 +05:30
self.table_name = 'analytics_usage_trends_measurements'
2021-01-03 14:25:43 +05:30
2020-11-24 15:15:51 +05:30
enum identifier: {
projects: 1,
users: 2,
issues: 3,
merge_requests: 4,
groups: 5,
2021-01-03 14:25:43 +05:30
pipelines: 6,
pipelines_succeeded: 7,
pipelines_failed: 8,
pipelines_canceled: 9,
2021-01-29 00:20:46 +05:30
pipelines_skipped: 10,
billable_users: 11
2020-11-24 15:15:51 +05:30
}
validates :recorded_at, :identifier, :count, presence: true
validates :recorded_at, uniqueness: { scope: :identifier }
scope :order_by_latest, -> { order(recorded_at: :desc) }
2023-03-04 22:38:38 +05:30
scope :with_identifier, ->(identifier) { where(identifier: identifier) }
scope :recorded_after, ->(date) { where(self.model.arel_table[:recorded_at].gteq(date)) if date.present? }
scope :recorded_before, ->(date) { where(self.model.arel_table[:recorded_at].lteq(date)) if date.present? }
2021-01-29 00:20:46 +05:30
def self.identifier_query_mapping
{
identifiers[:projects] => -> { Project },
identifiers[:users] => -> { User },
identifiers[:issues] => -> { Issue },
identifiers[:merge_requests] => -> { MergeRequest },
identifiers[:groups] => -> { Group },
identifiers[:pipelines] => -> { Ci::Pipeline },
identifiers[:pipelines_succeeded] => -> { Ci::Pipeline.success },
identifiers[:pipelines_failed] => -> { Ci::Pipeline.failed },
identifiers[:pipelines_canceled] => -> { Ci::Pipeline.canceled },
identifiers[:pipelines_skipped] => -> { Ci::Pipeline.skipped }
}
end
# Customized min and max calculation, in some cases using the original scope is too slow.
def self.identifier_min_max_queries
{}
end
2021-01-03 14:25:43 +05:30
def self.measurement_identifier_values
2021-01-29 00:20:46 +05:30
identifiers.values
end
def self.find_latest_or_fallback(identifier)
with_identifier(identifier).order_by_latest.first || identifier_query_mapping[identifiers[identifier]].call
2021-01-03 14:25:43 +05:30
end
2020-11-24 15:15:51 +05:30
end
end
end
2021-01-29 00:20:46 +05:30
2021-06-08 01:23:25 +05:30
Analytics::UsageTrends::Measurement.prepend_mod_with('Analytics::UsageTrends::Measurement')