summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJames Lopez <james@jameslopez.es>2016-10-14 17:33:21 +0200
committerJames Lopez <james@jameslopez.es>2016-11-17 08:22:54 +0100
commit470e39d64f02def538bb6aa3e51bcf406fd2e480 (patch)
tree0a204f76806b499226d29e0076987d94a4b4fc2a /lib
parentec7db295d230ba1cec0c75ae199d60bd8f89c1d6 (diff)
downloadgitlab-ce-470e39d64f02def538bb6aa3e51bcf406fd2e480.tar.gz
WIP - refactored some arel queries
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/cycle_analytics/events_fetcher.rb17
-rw-r--r--lib/gitlab/cycle_analytics/metrics_fetcher.rb2
-rw-r--r--lib/gitlab/database/date_time.rb26
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