diff options
author | James Lopez <james@jameslopez.es> | 2016-10-14 17:33:21 +0200 |
---|---|---|
committer | James Lopez <james@jameslopez.es> | 2016-11-17 08:22:54 +0100 |
commit | 470e39d64f02def538bb6aa3e51bcf406fd2e480 (patch) | |
tree | 0a204f76806b499226d29e0076987d94a4b4fc2a /lib | |
parent | ec7db295d230ba1cec0c75ae199d60bd8f89c1d6 (diff) | |
download | gitlab-ce-470e39d64f02def538bb6aa3e51bcf406fd2e480.tar.gz |
WIP - refactored some arel queries
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/cycle_analytics/events_fetcher.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/cycle_analytics/metrics_fetcher.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/database/date_time.rb | 26 |
3 files changed, 28 insertions, 17 deletions
diff --git a/lib/gitlab/cycle_analytics/events_fetcher.rb b/lib/gitlab/cycle_analytics/events_fetcher.rb index 9e62eef706c..ceed5823371 100644 --- a/lib/gitlab/cycle_analytics/events_fetcher.rb +++ b/lib/gitlab/cycle_analytics/events_fetcher.rb @@ -11,14 +11,21 @@ module Gitlab def fetch_issues cte_table = Arel::Table.new("cte_table_for_issue") - interval_query = Arel::Nodes::As.new( - cte_table, - subtract_datetimes(base_query_for(:issue), *attributes, 'issue')) + # Build a `SELECT` query. We find the first of the `end_time_attrs` that isn't `NULL` (call this end_time). + # Next, we find the first of the start_time_attrs that isn't `NULL` (call this start_time). + # We compute the (end_time - start_time) interval, and give it an alias based on the current + # cycle analytics stage. - #TODO ActiveRecord::Base.connection.execute(interval_query) + base_query = base_query_for(:issue) + + diff_fn = subtract_datetimes_diff(base_query, issue_table[:created_at], metric_attributes) + + query = base_query.project(diff_fn.as('issue_diff')) + + ActiveRecord::Base.connection.execute(query.to_sql) end - def attributes + def metric_attributes [issue_metrics_table[:first_associated_with_milestone_at], issue_metrics_table[:first_added_to_board_at]] end diff --git a/lib/gitlab/cycle_analytics/metrics_fetcher.rb b/lib/gitlab/cycle_analytics/metrics_fetcher.rb index 51b4963cf08..97b55656d79 100644 --- a/lib/gitlab/cycle_analytics/metrics_fetcher.rb +++ b/lib/gitlab/cycle_analytics/metrics_fetcher.rb @@ -28,7 +28,7 @@ module Gitlab # automatically excluded. def base_query_for(name) # Load issues - query = issue_metrics_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id])). + query = mr_closing_issues_table.join(issue_table).on(issue_table[:id].eq(mr_closing_issues_table[:issue_id])). join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id])). where(issue_table[:project_id].eq(@project.id)). where(issue_table[:deleted_at].eq(nil)). diff --git a/lib/gitlab/database/date_time.rb b/lib/gitlab/database/date_time.rb index b6a89f715fd..e2524886de2 100644 --- a/lib/gitlab/database/date_time.rb +++ b/lib/gitlab/database/date_time.rb @@ -8,20 +8,24 @@ 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, end_time_attrs, start_time_attrs, as) - diff_fn = if Gitlab::Database.postgresql? - Arel::Nodes::Subtraction.new( - Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs)), - Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(start_time_attrs))) - elsif Gitlab::Database.mysql? - Arel::Nodes::NamedFunction.new( - "TIMESTAMPDIFF", - [Arel.sql('second'), - Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(start_time_attrs)), - Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs))]) - end + diff_fn = subtract_datetimes_diff(query_so_far, end_time_attrs, start_time_attrs) query_so_far.project(diff_fn.as(as)) end + + def subtract_datetimes_diff(query_so_far, end_time_attrs, start_time_attrs) + if Gitlab::Database.postgresql? + Arel::Nodes::Subtraction.new( + Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs)), + Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(start_time_attrs))) + elsif Gitlab::Database.mysql? + Arel::Nodes::NamedFunction.new( + "TIMESTAMPDIFF", + [Arel.sql('second'), + Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(start_time_attrs)), + Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs))]) + end + end end end end |