summaryrefslogtreecommitdiff
path: root/lib/gitlab/cycle_analytics/events_query.rb
blob: 9d69e267d8dad37a22ddf12b0a91e288950c78c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
module Gitlab
  module CycleAnalytics
    class EventsQuery
      include MetricsFetcher

      def initialize(project:, options: {})
        @project = project
        @from = options[:from]
        @branch = options[:branch]
      end

      def execute(stage, &block)
        @stage = stage
        @config = QueryConfig.get(stage)
        query = build_query(&block)

        ActiveRecord::Base.connection.exec_query(query.to_sql)
      end

      private

      def build_query
        base_query = base_query_for(@stage)
        diff_fn = subtract_datetimes_diff(@config[:base_query], @config[:start_time_attrs], @config[:end_time_attrs])

        yield base_query if block_given?

        base_query.project(extract_epoch(diff_fn).as('total_time'), *@config[:projections]).order(order.desc)
      end

      def order
        @config[:order] || @config[:start_time_attrs]
      end

      def extract_epoch(arel_attribute)
        return arel_attribute unless Gitlab::Database.postgresql?

        Arel.sql(%Q{EXTRACT(EPOCH FROM (#{arel_attribute.to_sql}))})
      end
    end
  end
end