diff options
author | James Lopez <james@jameslopez.es> | 2016-11-16 12:01:10 +0100 |
---|---|---|
committer | James Lopez <james@jameslopez.es> | 2016-11-17 08:22:59 +0100 |
commit | cf2dcf043c0054785bc0258ab6393104499b8d70 (patch) | |
tree | 1502646c438eb383a82f73d5a62f2b19b38d954c /lib/gitlab | |
parent | cbc9f0cd1aa9f379952b6e4d3ad6df9971f9092a (diff) | |
download | gitlab-ce-cf2dcf043c0054785bc0258ab6393104499b8d70.tar.gz |
Refactor all query config stuff into separate classes and added specs
Diffstat (limited to 'lib/gitlab')
-rw-r--r-- | lib/gitlab/cycle_analytics/base_config.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/code_config.rb | 18 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/events_fetcher.rb | 16 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/events_query.rb | 15 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/issue_config.rb | 16 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/plan_config.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/production_config.rb | 15 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/query_config.rb | 99 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/review_config.rb | 16 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/staging_config.rb | 14 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/test_config.rb | 14 |
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 |