1# frozen_string_literal: true
2
3module Gitlab
4  # This class is used by the `gitlab:usage_data:dump_sql` rake tasks to output SQL instead of running it.
5  # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41091
6  class UsageDataQueries < UsageData
7    class << self
8      def add_metric(metric, time_frame: 'none', options: {})
9        metric_class = "Gitlab::Usage::Metrics::Instrumentations::#{metric}".constantize
10
11        metric_class.new(time_frame: time_frame, options: options).instrumentation
12      end
13
14      def count(relation, column = nil, *args, **kwargs)
15        Gitlab::Usage::Metrics::Query.for(:count, relation, column)
16      end
17
18      def distinct_count(relation, column = nil, *args, **kwargs)
19        Gitlab::Usage::Metrics::Query.for(:distinct_count, relation, column)
20      end
21
22      def sum(relation, column, *args, **kwargs)
23        Gitlab::Usage::Metrics::Query.for(:sum, relation, column)
24      end
25
26      # rubocop: disable CodeReuse/ActiveRecord
27      def histogram(relation, column, buckets:, bucket_size: buckets.size)
28        Gitlab::Usage::Metrics::Query.for(:histogram, relation, column, buckets: buckets, bucket_size: bucket_size)
29      end
30      # rubocop: enable CodeReuse/ActiveRecord
31
32      # For estimated distinct count use exact query instead of hll
33      # buckets query, because it can't be used to obtain estimations without
34      # supplementary ruby code present in Gitlab::Database::PostgresHll::BatchDistinctCounter
35      def estimate_batch_distinct_count(relation, column = nil, *args, **kwargs)
36        Gitlab::Usage::Metrics::Query.for(:estimate_batch_distinct_count, relation, column)
37      end
38
39      def add(*args)
40        'SELECT ' + args.map { |arg| "(#{arg})" }.join(' + ')
41      end
42
43      def maximum_id(model, column = nil)
44      end
45
46      def minimum_id(model, column = nil)
47      end
48
49      def redis_usage_data(counter = nil, &block)
50        if block_given?
51          { redis_usage_data_block: block.to_s }
52        elsif counter.present?
53          { redis_usage_data_counter: counter }
54        end
55      end
56
57      def jira_integration_data
58        {
59          projects_jira_server_active: 0,
60          projects_jira_cloud_active: 0
61        }
62      end
63
64      def epics_deepest_relationship_level
65        { epics_deepest_relationship_level: 0 }
66      end
67    end
68  end
69end
70