diff --git a/lib/gitlab/cycle_analytics/base_event_fetcher.rb b/lib/gitlab/cycle_analytics/base_event_fetcher.rb index 0d851f81b1da89ddfee04c07313f1407621f9cb1..d4b2d665e593d515f4e0bfc99f813a29e6220ce9 100644 --- a/lib/gitlab/cycle_analytics/base_event_fetcher.rb +++ b/lib/gitlab/cycle_analytics/base_event_fetcher.rb @@ -3,7 +3,7 @@ module Gitlab class BaseEventFetcher include MetricsTables - attr_reader :projections, :query, :stage + attr_reader :projections, :query, :stage, :order def initialize(fetcher:, options:, stage:) @fetcher = fetcher @@ -22,10 +22,6 @@ module Gitlab def custom_query(_base_query); end - def order - @order || @start_time_attrs - end - private def update_author! @@ -35,7 +31,7 @@ module Gitlab end def event_result - @event_result ||= @fetcher.events(self).to_a + @event_result ||= @fetcher.events.to_a end def serialize(_event) diff --git a/lib/gitlab/cycle_analytics/base_stage.rb b/lib/gitlab/cycle_analytics/base_stage.rb index f3b8bb6e1d36a346b0bb68527a59ada5ce86dcd1..f81a41bccb6343e973fc1653a2ae33c0efdfa32f 100644 --- a/lib/gitlab/cycle_analytics/base_stage.rb +++ b/lib/gitlab/cycle_analytics/base_stage.rb @@ -1,6 +1,8 @@ module Gitlab module CycleAnalytics class BaseStage + include MetricsTables + attr_accessor :start_time_attrs, :end_time_attrs def initialize(project:, options:) @@ -13,7 +15,7 @@ module Gitlab end def event - @event ||= Gitlab::CycleAnalytics::Event[stage].new(fetcher: @fetcher, options: @options) + @event ||= Gitlab::CycleAnalytics::Event[stage].new(fetcher: @fetcher, options: @options, stage: stage) end def events diff --git a/lib/gitlab/cycle_analytics/event.rb b/lib/gitlab/cycle_analytics/event.rb index bb3a5722a0f2028e7947bdf5668ce38259a66591..1ba7bc08ee5be8e4684580aef0c0b360aa1c11ab 100644 --- a/lib/gitlab/cycle_analytics/event.rb +++ b/lib/gitlab/cycle_analytics/event.rb @@ -2,7 +2,7 @@ module Gitlab module CycleAnalytics module Event def self.[](stage_name) - CycleAnalytics.const_get("#{stage_name.to_s.camelize}Event") + CycleAnalytics.const_get("#{stage_name.to_s.camelize}EventFetcher") end end end diff --git a/lib/gitlab/cycle_analytics/metrics_fetcher.rb b/lib/gitlab/cycle_analytics/metrics_fetcher.rb index 865abd0fa6cad1c9c4dffc78d6c495dca199812d..dd291840ecd9c6621d51c32fd9b78182110ec477 100644 --- a/lib/gitlab/cycle_analytics/metrics_fetcher.rb +++ b/lib/gitlab/cycle_analytics/metrics_fetcher.rb @@ -38,13 +38,16 @@ module Gitlab def events_query base_query = base_query_for(@stage.stage) - event = @stage.event diff_fn = subtract_datetimes_diff(base_query, @stage.start_time_attrs, @stage.end_time_attrs) - event_instance.custom_query(base_query) + @stage.event.custom_query(base_query) - base_query.project(extract_diff_epoch(diff_fn).as('total_time'), *event.projections).order(event.order.desc) + base_query.project(extract_diff_epoch(diff_fn).as('total_time'), *@stage.event.projections).order(order.desc) + end + + def order + @stage.event.order || @stage.start_time_attrs.is_a?(Array) ? @stage.start_time_attrs.first : @stage.start_time_attrs end # Join table with a row for every <issue,merge_request> pair (where the merge request diff --git a/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb index abfd60d7f6a12ee2171f4fb8c658cdccc9052f1b..0267e8c2f69e13593ea1b6803239c1be7686a047 100644 --- a/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb @@ -5,8 +5,8 @@ describe Gitlab::CycleAnalytics::CodeEventFetcher do let(:stage_name) { :code } it_behaves_like 'default query config' do - it 'does not have the default order' do - expect(event.order).not_to eq(event.start_time_attrs) + it 'has a default order' do + expect(event.order).not_to be_nil end end end diff --git a/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb index f4d995d072f6a29ea1b0986abc40c4ad084b058f..fd9fa2fee497b349e28ddeb73414e2c7c0bfe9c2 100644 --- a/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb @@ -4,9 +4,5 @@ require 'lib/gitlab/cycle_analytics/shared_event_spec' describe Gitlab::CycleAnalytics::IssueEventFetcher do let(:stage_name) { :issue } - it_behaves_like 'default query config' do - it 'has the default order' do - expect(event.order).to eq(event.start_time_attrs) - end - end + it_behaves_like 'default query config' end diff --git a/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb index 679779de51e4c5f0789eaf2b9dce235dd788645a..1c3c1728fc65bed648666b2bdd87eee0b83811a7 100644 --- a/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb @@ -5,10 +5,6 @@ describe Gitlab::CycleAnalytics::PlanEventFetcher do let(:stage_name) { :plan } it_behaves_like 'default query config' do - it 'has the default order' do - expect(event.order).to eq(event.start_time_attrs) - end - context 'no commits' do it 'does not blow up if there are no commits' do allow_any_instance_of(Gitlab::CycleAnalytics::MetricsFetcher).to receive(:events).and_return([{}]) diff --git a/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb index a9126b8fa1c2df82383d412b3cf29623ae4fd89c..7400118130533e072c59f71b8a71c11971bc961d 100644 --- a/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb @@ -4,9 +4,5 @@ require 'lib/gitlab/cycle_analytics/shared_event_spec' describe Gitlab::CycleAnalytics::ProductionEventFetcher do let(:stage_name) { :production } - it_behaves_like 'default query config' do - it 'has the default order' do - expect(event.order).to eq(event.start_time_attrs) - end - end + it_behaves_like 'default query config' end diff --git a/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb index c3e66dcb861e8c3380d4f8eb780eede5721d91ec..4f67c95ed4cb9e359b5ad697076917727ccefb67 100644 --- a/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb @@ -4,9 +4,5 @@ require 'lib/gitlab/cycle_analytics/shared_event_spec' describe Gitlab::CycleAnalytics::ReviewEventFetcher do let(:stage_name) { :review } - it_behaves_like 'default query config' do - it 'has the default order' do - expect(event.order).to eq(event.start_time_attrs) - end - end + it_behaves_like 'default query config' end diff --git a/spec/lib/gitlab/cycle_analytics/shared_event_spec.rb b/spec/lib/gitlab/cycle_analytics/shared_event_spec.rb index 60ec87255c8a42ad0bb75f17ef58636ce87e5932..725f9a558f5ea679b2cc71a09eb41fd77d590d66 100644 --- a/spec/lib/gitlab/cycle_analytics/shared_event_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/shared_event_spec.rb @@ -10,18 +10,10 @@ shared_examples 'default query config' do let(:event) { described_class.new(fetcher: fetcher, options: {}, stage: stage_name) } - it 'has the start attributes' do - expect(event.start_time_attrs).not_to be_nil - end - it 'has the stage attribute' do expect(event.stage).not_to be_nil end - it 'has the end attributes' do - expect(event.end_time_attrs).not_to be_nil - end - it 'has the projection attributes' do expect(event.projections).not_to be_nil end diff --git a/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb index 8cc7875258e409ca1a7df8659baff9e03a6b82e1..c88e3e22f5c361085bf30816d699a10fc012c720 100644 --- a/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb @@ -8,6 +8,14 @@ shared_examples 'base stage' do allow_any_instance_of(Gitlab::CycleAnalytics::BaseEventFetcher).to receive(:event_result).and_return({}) end + it 'has the start attributes' do + expect(stage.start_time_attrs).not_to be_nil + end + + it 'has the end attributes' do + expect(stage.end_time_attrs).not_to be_nil + end + it 'has the median data value' do expect(stage.median_data[:value]).not_to be_nil end diff --git a/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb index 8338e17b96d030a544cf2ef6078d420f57c3db53..bbc82496340238e20b0510166b69a5a71e70aa2a 100644 --- a/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb @@ -5,8 +5,8 @@ describe Gitlab::CycleAnalytics::StagingEventFetcher do let(:stage_name) { :staging } it_behaves_like 'default query config' do - it 'does not have the default order' do - expect(event.order).not_to eq(event.start_time_attrs) + it 'has a default order' do + expect(event.order).not_to be_nil end end end diff --git a/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb index 9d4f7667f1d8f9a5dbb160cf5fcdb4563c3cc86c..6639fa54e0ebeac1d62761cb97ad2f078610cfac 100644 --- a/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb @@ -5,8 +5,8 @@ describe Gitlab::CycleAnalytics::TestEventFetcher do let(:stage_name) { :test } it_behaves_like 'default query config' do - it 'does not have the default order' do - expect(event.order).not_to eq(event.start_time_attrs) + it 'has a default order' do + expect(event.order).not_to be_nil end end end