summaryrefslogtreecommitdiff
path: root/lib/gitlab/cycle_analytics
diff options
context:
space:
mode:
authorJames Lopez <james@jameslopez.es>2016-11-16 12:01:10 +0100
committerJames Lopez <james@jameslopez.es>2016-11-17 08:22:59 +0100
commitcf2dcf043c0054785bc0258ab6393104499b8d70 (patch)
tree1502646c438eb383a82f73d5a62f2b19b38d954c /lib/gitlab/cycle_analytics
parentcbc9f0cd1aa9f379952b6e4d3ad6df9971f9092a (diff)
downloadgitlab-ce-cf2dcf043c0054785bc0258ab6393104499b8d70.tar.gz
Refactor all query config stuff into separate classes and added specs
Diffstat (limited to 'lib/gitlab/cycle_analytics')
-rw-r--r--lib/gitlab/cycle_analytics/base_config.rb17
-rw-r--r--lib/gitlab/cycle_analytics/code_config.rb18
-rw-r--r--lib/gitlab/cycle_analytics/events_fetcher.rb16
-rw-r--r--lib/gitlab/cycle_analytics/events_query.rb15
-rw-r--r--lib/gitlab/cycle_analytics/issue_config.rb16
-rw-r--r--lib/gitlab/cycle_analytics/plan_config.rb17
-rw-r--r--lib/gitlab/cycle_analytics/production_config.rb15
-rw-r--r--lib/gitlab/cycle_analytics/query_config.rb99
-rw-r--r--lib/gitlab/cycle_analytics/review_config.rb16
-rw-r--r--lib/gitlab/cycle_analytics/staging_config.rb14
-rw-r--r--lib/gitlab/cycle_analytics/test_config.rb14
11 files changed, 136 insertions, 121 deletions
diff --git a/lib/gitlab/cycle_analytics/base_config.rb b/lib/gitlab/cycle_analytics/base_config.rb
new file mode 100644
index 00000000000..06ae9a15a7a
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/base_config.rb
@@ -0,0 +1,17 @@
+module Gitlab
+ module CycleAnalytics
+ class BaseConfig
+ extend MetricsFetcher
+
+ class << self
+ attr_reader :start_time_attrs, :end_time_attrs, :projections
+ end
+
+ def self.order
+ @order || @start_time_attrs
+ end
+
+ def self.query(base_query); end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/code_config.rb b/lib/gitlab/cycle_analytics/code_config.rb
new file mode 100644
index 00000000000..c27419310db
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/code_config.rb
@@ -0,0 +1,18 @@
+module Gitlab
+ module CycleAnalytics
+ class CodeConfig < BaseConfig
+ @start_time_attrs = issue_metrics_table[:first_mentioned_in_commit_at]
+
+ @end_time_attrs = mr_table[:created_at]
+
+ @projections = [mr_table[:title],
+ mr_table[:iid],
+ mr_table[:id],
+ mr_table[:created_at],
+ mr_table[:state],
+ mr_table[:author_id]]
+
+ @order = mr_table[:created_at]
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/events_fetcher.rb b/lib/gitlab/cycle_analytics/events_fetcher.rb
index d19ce6e0f6f..714afb88833 100644
--- a/lib/gitlab/cycle_analytics/events_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/events_fetcher.rb
@@ -8,22 +8,10 @@ module Gitlab
end
def fetch(stage:)
- custom_query = "#{stage}_custom_query".to_sym
-
- @query.execute(stage) do |base_query|
- public_send(custom_query, base_query) if self.respond_to?(custom_query)
+ @query.execute(stage) do |stage_class, base_query|
+ stage_class.query(base_query)
end
end
-
- def plan_custom_query(base_query)
- base_query.join(mr_diff_table).on(mr_diff_table[:merge_request_id].eq(mr_table[:id]))
- end
-
- def test_custom_query(base_query)
- base_query.join(build_table).on(mr_metrics_table[:pipeline_id].eq(build_table[:commit_id]))
- end
-
- alias_method :staging_custom_query, :test_custom_query
end
end
end
diff --git a/lib/gitlab/cycle_analytics/events_query.rb b/lib/gitlab/cycle_analytics/events_query.rb
index 9d69e267d8d..b61320fc561 100644
--- a/lib/gitlab/cycle_analytics/events_query.rb
+++ b/lib/gitlab/cycle_analytics/events_query.rb
@@ -11,7 +11,6 @@ module Gitlab
def execute(stage, &block)
@stage = stage
- @config = QueryConfig.get(stage)
query = build_query(&block)
ActiveRecord::Base.connection.exec_query(query.to_sql)
@@ -21,15 +20,11 @@ module Gitlab
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])
+ diff_fn = subtract_datetimes_diff(base_query, stage_class.start_time_attrs, stage_class.end_time_attrs)
- yield base_query if block_given?
+ yield(stage_class, 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]
+ base_query.project(extract_epoch(diff_fn).as('total_time'), *stage_class.projections).order(stage_class.order.desc)
end
def extract_epoch(arel_attribute)
@@ -37,6 +32,10 @@ module Gitlab
Arel.sql(%Q{EXTRACT(EPOCH FROM (#{arel_attribute.to_sql}))})
end
+
+ def stage_class
+ @stage_class ||= "Gitlab::CycleAnalytics::#{@stage.to_s.camelize}Config".constantize
+ end
end
end
end
diff --git a/lib/gitlab/cycle_analytics/issue_config.rb b/lib/gitlab/cycle_analytics/issue_config.rb
new file mode 100644
index 00000000000..985ac76feb2
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/issue_config.rb
@@ -0,0 +1,16 @@
+module Gitlab
+ module CycleAnalytics
+ class IssueConfig < BaseConfig
+ @start_time_attrs = issue_table[:created_at]
+
+ @end_time_attrs = [issue_metrics_table[:first_associated_with_milestone_at],
+ issue_metrics_table[:first_added_to_board_at]]
+
+ @projections = [issue_table[:title],
+ issue_table[:iid],
+ issue_table[:id],
+ issue_table[:created_at],
+ issue_table[:author_id]]
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/plan_config.rb b/lib/gitlab/cycle_analytics/plan_config.rb
new file mode 100644
index 00000000000..453ee26b4c9
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/plan_config.rb
@@ -0,0 +1,17 @@
+module Gitlab
+ module CycleAnalytics
+ class PlanConfig < BaseConfig
+ @start_time_attrs = issue_metrics_table[:first_associated_with_milestone_at]
+
+ @end_time_attrs = [issue_metrics_table[:first_added_to_board_at],
+ issue_metrics_table[:first_mentioned_in_commit_at]]
+
+ @projections = [mr_diff_table[:st_commits].as('commits'),
+ issue_metrics_table[:first_mentioned_in_commit_at]]
+
+ def self.query(base_query)
+ base_query.join(mr_diff_table).on(mr_diff_table[:merge_request_id].eq(mr_table[:id]))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/production_config.rb b/lib/gitlab/cycle_analytics/production_config.rb
new file mode 100644
index 00000000000..dc9f1d5d059
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/production_config.rb
@@ -0,0 +1,15 @@
+module Gitlab
+ module CycleAnalytics
+ class ProductionConfig < BaseConfig
+ @start_time_attrs = issue_table[:created_at]
+
+ @end_time_attrs = mr_metrics_table[:first_deployed_to_production_at]
+
+ @projections = [issue_table[:title],
+ issue_table[:iid],
+ issue_table[:id],
+ issue_table[:created_at],
+ issue_table[:author_id]]
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/query_config.rb b/lib/gitlab/cycle_analytics/query_config.rb
deleted file mode 100644
index 4fddbad95f2..00000000000
--- a/lib/gitlab/cycle_analytics/query_config.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-module Gitlab
- module CycleAnalytics
- class QueryConfig
- include MetricsFetcher
-
- def self.get(*args)
- new(*args).get
- end
-
- def initialize(stage)
- @stage = stage
- end
-
- def get
- public_send(@stage).freeze if self.respond_to?(@stage)
- end
-
- def issue
- {
- start_time_attrs: issue_table[:created_at],
- end_time_attrs: [issue_metrics_table[:first_associated_with_milestone_at],
- issue_metrics_table[:first_added_to_board_at]],
- projections: [issue_table[:title],
- issue_table[:iid],
- issue_table[:id],
- issue_table[:created_at],
- issue_table[:author_id]]
- }
- end
-
- def plan
- {
- start_time_attrs: issue_metrics_table[:first_associated_with_milestone_at],
- end_time_attrs: [issue_metrics_table[:first_added_to_board_at],
- issue_metrics_table[:first_mentioned_in_commit_at]],
- projections: [mr_diff_table[:st_commits].as('commits'),
- issue_metrics_table[:first_mentioned_in_commit_at]]
- }
- end
-
- def code
- {
- start_time_attrs: issue_metrics_table[:first_mentioned_in_commit_at],
- end_time_attrs: mr_table[:created_at],
- projections: [mr_table[:title],
- mr_table[:iid],
- mr_table[:id],
- mr_table[:created_at],
- mr_table[:state],
- mr_table[:author_id]],
- order: mr_table[:created_at]
- }
- end
-
- def test
- {
- start_time_attrs: mr_metrics_table[:latest_build_started_at],
- end_time_attrs: mr_metrics_table[:latest_build_finished_at],
- projections: [build_table[:id]],
- order: build_table[:created_at]
- }
- end
-
- def review
- {
- start_time_attrs: mr_table[:created_at],
- end_time_attrs: mr_metrics_table[:merged_at],
- projections: [mr_table[:title],
- mr_table[:iid],
- mr_table[:id],
- mr_table[:created_at],
- mr_table[:state],
- mr_table[:author_id]]
- }
- end
-
- def staging
- {
- start_time_attrs: mr_metrics_table[:merged_at],
- end_time_attrs: mr_metrics_table[:first_deployed_to_production_at],
- projections: [build_table[:id]],
- order: build_table[:created_at]
- }
- end
-
- def production
- {
- start_time_attrs: issue_table[:created_at],
- end_time_attrs: mr_metrics_table[:first_deployed_to_production_at],
- projections: [issue_table[:title],
- issue_table[:iid],
- issue_table[:id],
- issue_table[:created_at],
- issue_table[:author_id]]
- }
- end
- end
- end
-end
diff --git a/lib/gitlab/cycle_analytics/review_config.rb b/lib/gitlab/cycle_analytics/review_config.rb
new file mode 100644
index 00000000000..e91dc1ea104
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/review_config.rb
@@ -0,0 +1,16 @@
+module Gitlab
+ module CycleAnalytics
+ class ReviewConfig < BaseConfig
+ @start_time_attrs = mr_table[:created_at]
+
+ @end_time_attrs = mr_metrics_table[:merged_at]
+
+ @projections = [mr_table[:title],
+ mr_table[:iid],
+ mr_table[:id],
+ mr_table[:created_at],
+ mr_table[:state],
+ mr_table[:author_id]]
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/staging_config.rb b/lib/gitlab/cycle_analytics/staging_config.rb
new file mode 100644
index 00000000000..f6f471286a0
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/staging_config.rb
@@ -0,0 +1,14 @@
+module Gitlab
+ module CycleAnalytics
+ class StagingConfig < BaseConfig
+ @start_time_attrs = mr_metrics_table[:merged_at]
+ @end_time_attrs = mr_metrics_table[:first_deployed_to_production_at]
+ @projections = [build_table[:id]]
+ @order = build_table[:created_at]
+
+ def self.query(base_query)
+ base_query.join(build_table).on(mr_metrics_table[:pipeline_id].eq(build_table[:commit_id]))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/test_config.rb b/lib/gitlab/cycle_analytics/test_config.rb
new file mode 100644
index 00000000000..6cb80f9a62c
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/test_config.rb
@@ -0,0 +1,14 @@
+module Gitlab
+ module CycleAnalytics
+ class TestConfig < BaseConfig
+ @start_time_attrs = mr_metrics_table[:latest_build_started_at]
+ @end_time_attrs = mr_metrics_table[:latest_build_finished_at]
+ @projections = [build_table[:id]]
+ @order = build_table[:created_at]
+
+ def self.query(base_query)
+ base_query.join(build_table).on(mr_metrics_table[:pipeline_id].eq(build_table[:commit_id]))
+ end
+ end
+ end
+end