diff options
author | Adam Hegyi <ahegyi@gitlab.com> | 2019-06-27 13:11:25 +0200 |
---|---|---|
committer | Adam Hegyi <ahegyi@gitlab.com> | 2019-06-27 13:11:25 +0200 |
commit | c42a6618397e2c5ca83eb06c85d83ab586699221 (patch) | |
tree | dfc7136ed92eaf03fe52a5bedd1308a75b9e3e4d | |
parent | f9b1910ebb7e920d9b9ad2028367b4e58dcab863 (diff) | |
download | gitlab-ce-experimental-cycle-analytics-chart-data-source.tar.gz |
Transforming a stage query to get duration and finish timestamp [skip ci]experimental-cycle-analytics-chart-data-source
-rw-r--r-- | lib/gitlab/cycle_analytics/base_event_fetcher.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/base_stage.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/scatterplot_chart_data_fetcher.rb | 35 | ||||
-rw-r--r-- | lib/gitlab/database/date_time.rb | 4 |
4 files changed, 39 insertions, 3 deletions
diff --git a/lib/gitlab/cycle_analytics/base_event_fetcher.rb b/lib/gitlab/cycle_analytics/base_event_fetcher.rb index 2c8ecabb11f..84033e9d846 100644 --- a/lib/gitlab/cycle_analytics/base_event_fetcher.rb +++ b/lib/gitlab/cycle_analytics/base_event_fetcher.rb @@ -40,7 +40,7 @@ module Gitlab end def events_query - diff_fn = subtract_datetimes_diff(base_query, @options[:start_time_attrs], @options[:end_time_attrs]) + diff_fn = subtract_datetimes_diff(@options[:start_time_attrs], @options[:end_time_attrs]) base_query.project(extract_diff_epoch(diff_fn).as('total_time'), *projections).order(order.desc).take(MAX_EVENTS) end diff --git a/lib/gitlab/cycle_analytics/base_stage.rb b/lib/gitlab/cycle_analytics/base_stage.rb index 996af87f819..598f1eb79e9 100644 --- a/lib/gitlab/cycle_analytics/base_stage.rb +++ b/lib/gitlab/cycle_analytics/base_stage.rb @@ -4,6 +4,7 @@ module Gitlab module CycleAnalytics class BaseStage include BaseQuery + attr_reader :project def initialize(project: nil, options:) @project = project diff --git a/lib/gitlab/cycle_analytics/scatterplot_chart_data_fetcher.rb b/lib/gitlab/cycle_analytics/scatterplot_chart_data_fetcher.rb new file mode 100644 index 00000000000..56431efac41 --- /dev/null +++ b/lib/gitlab/cycle_analytics/scatterplot_chart_data_fetcher.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Gitlab + module CycleAnalytics + class ScatterplotChartDataFetcher < BaseStage + def initialize(stage) + @stage = stage + end + + def fetch + ActiveRecord::Base.connection.execute(build_query.to_sql) + end + + private + + attr_reader :stage + + def build_query + duration = subtract_datetimes_diff(stage.start_time_attrs, stage.end_time_attrs) + days_took = Arel::Nodes::NamedFunction.new("EXTRACT", [Arel::Nodes::NamedFunction.new("DAY FROM", [duration])]) + + query = stage.stage_query(stage.send(:projects).map(&:id)) + query.projections = [] + query.project(days_took.as('days_took')) + query.project( + Arel::Nodes::NamedFunction.new("DATE", [ + Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(stage.end_time_attrs)) + ]).as('finished_at') + ) + query.where(duration.gteq(zero_interval)) + query + end + end + end +end diff --git a/lib/gitlab/database/date_time.rb b/lib/gitlab/database/date_time.rb index 79d2caff151..be5a44fe32d 100644 --- a/lib/gitlab/database/date_time.rb +++ b/lib/gitlab/database/date_time.rb @@ -10,12 +10,12 @@ module Gitlab # Note: For MySQL, the interval is returned in seconds. # For PostgreSQL, the interval is returned as an INTERVAL type. def subtract_datetimes(query_so_far, start_time_attrs, end_time_attrs, as) - diff_fn = subtract_datetimes_diff(query_so_far, start_time_attrs, end_time_attrs) + diff_fn = subtract_datetimes_diff(start_time_attrs, end_time_attrs) query_so_far.project(diff_fn.as(as)) end - def subtract_datetimes_diff(query_so_far, start_time_attrs, end_time_attrs) + def subtract_datetimes_diff(start_time_attrs, end_time_attrs) if Gitlab::Database.postgresql? Arel::Nodes::Subtraction.new( Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs)), |