Class: Gitlab::Analytics::CycleAnalytics::Aggregated::BaseQueryBuilder

Inherits:
Object
  • Object
show all
Includes:
StageQueryHelpers
Defined in:
lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb

Overview

rubocop: disable CodeReuse/ActiveRecord

Constant Summary collapse

MODEL_CLASSES =
{
  MergeRequest.to_s => ::Analytics::CycleAnalytics::MergeRequestStageEvent,
  Issue.to_s => ::Analytics::CycleAnalytics::IssueStageEvent
}.freeze

Instance Method Summary collapse

Methods included from StageQueryHelpers

#duration, #duration_in_seconds, #in_progress?, #percentile_cont

Constructor Details

#initialize(stage:, params: {}) ⇒ BaseQueryBuilder

Allowed params:

  • from - stage end date filter start date

  • to - stage end date filter to date

  • author_username

  • milestone_title

  • label_name (array)

  • assignee_username (array)

  • project_ids (array)



24
25
26
27
28
29
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 24

def initialize(stage:, params: {})
  @stage = stage
  @params = params
  @root_ancestor = stage.namespace.root_ancestor
  @stage_event_model = MODEL_CLASSES.fetch(stage.subject_class.to_s)
end

Instance Method Details

#base_queryObject



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 96

def base_query
  query = stage_event_model
    .by_stage_event_hash_id(stage.stage_event_hash_id)

  from = params[:from] || 30.days.ago
  if in_progress?
    query = query
      .end_event_is_not_happened_yet
      .opened_state
      .start_event_timestamp_after(from)
    query = query.start_event_timestamp_before(params[:to]) if params[:to]
  else
    query = query.end_event_timestamp_after(from)
    query = query.end_event_timestamp_before(params[:to]) if params[:to]
  end

  query
end

#buildObject



31
32
33
34
35
36
37
38
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 31

def build
  query = base_query
  query = filter_by_stage_parent(query)
  query = filter_author(query)
  query = filter_milestone_ids(query)
  query = filter_label_names(query)
  filter_assignees(query)
end

#build_sorted_queryObject



40
41
42
43
44
45
46
47
48
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 40

def build_sorted_query
  direction = params[:direction] || :desc

  if params[:sort] == :duration
    build.order_by_duration(direction)
  else
    build.order_by_end_event(direction)
  end
end

#filter_assignees(query) ⇒ Object



84
85
86
87
88
89
90
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 84

def filter_assignees(query)
  return query if params[:assignee_username].blank?

  Issuables::AssigneeFilter
    .new(params: { assignee_username: params[:assignee_username] })
    .filter(query)
end

#filter_author(query) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 50

def filter_author(query)
  return query if params[:author_username].blank?

  user = User.by_username(params[:author_username]).first

  return query.none if user.blank?

  query.authored(user)
end

#filter_by_stage_parent(query) ⇒ Object



92
93
94
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 92

def filter_by_stage_parent(query)
  query.by_project_id(stage.namespace.project.id)
end

#filter_label_names(query) ⇒ Object



73
74
75
76
77
78
79
80
81
82
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 73

def filter_label_names(query)
  return query if params[:label_name].blank?

  LabelFilter.new(
    stage: stage,
    params: params,
    project: nil,
    group: root_ancestor
  ).filter(query)
end

#filter_milestone_ids(query) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb', line 60

def filter_milestone_ids(query)
  return query if params[:milestone_title].blank?

  milestone = MilestonesFinder
    .new(group_ids: root_ancestor.self_and_descendant_ids, project_ids: root_ancestor.all_projects.select(:id), title: params[:milestone_title])
    .execute
    .first

  return query.none if milestone.blank?

  query.with_milestone_id(milestone.id)
end