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
|