Welcome to mirror list, hosted at ThFree Co, Russian Federation.

base_query_builder.rb « cycle_analytics « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7e10196c8aea56cc442144f632d0a4a79b0342b9 (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

module Gitlab
  module CycleAnalytics
    class BaseQueryBuilder
      include Gitlab::CycleAnalytics::MetricsTables
      include StageQueryHelpers

      delegate :subject_model, to: :stage

      PROJECT_QUERY_RULES = {
        Project => {
          Issue => ->(query) {
            query.join(projects_table).on(issue_table[:project_id].eq(projects_table[:id]))
              .where(issue_table[:project_id].eq(stage.parent.id))
          },
          MergeRequest => ->(query) {
            query.join(projects_table).on(mr_table[:target_project_id].eq(projects_table[:id]))
              .where(mr_table[:target_project_id].eq(stage.parent.id))
          }
        }
      }.freeze

      def initialize(stage:, params: {})
        @stage = stage
        @params = params
      end

      def apply
        query = model_arel_table
        query = filter_by_parent_model(query)
        query = filter_by_time_range(query)
        query = query.join(routes_table).on(projects_table[:namespace_id].eq(routes_table[:source_id]))
        query = stage.start_event.apply_query_customization(query)
        query = stage.end_event.apply_query_customization(query)
        query = query.where(duration.gt(zero_interval))
        query.where(routes_table[:source_type].eq('Namespace'))
      end

      private

      attr_reader :stage, :params

      def filter_by_parent_model(query)
        instance_exec(query, &query_rules.fetch(stage.parent.class).fetch(subject_model))
      end

      def filter_by_time_range(query)
        from = params[:from] || 30.days.ago
        to = params[:to] || nil

        query = query.where(model_arel_table[:created_at].gteq(from))
        query = query.where(model_arel_table[:created_at].lteq(to)) if to
        query
      end

      def model_arel_table
        subject_model.arel_table
      end

      # EE will override this to include Group rules
      def query_rules
        PROJECT_QUERY_RULES
      end
    end
  end
end