summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOswaldo Ferreira <oswaldo@gitlab.com>2018-09-05 13:27:05 -0300
committerOswaldo Ferreira <oswaldo@gitlab.com>2018-09-05 13:27:05 -0300
commite1d7297b9720fbf61eaf3e818689f73a1cea6aa0 (patch)
tree6f85b39815382468af2ef5f6a04235b4c1a268b0
parentd73541d006ce3d0261cf082dac5ae605dfe7a848 (diff)
downloadgitlab-ce-osw-wrap-up-metrics-migration.tar.gz
Use MR metrics cached data whenever available (wraps up metrics migration)osw-wrap-up-metrics-migration
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js25
-rw-r--r--app/models/merge_request.rb34
-rw-r--r--app/serializers/merge_request_widget_entity.rb33
-rw-r--r--spec/models/merge_request_spec.rb4
-rw-r--r--spec/serializers/merge_request_widget_entity_spec.rb75
7 files changed, 44 insertions, 139 deletions
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
index 25a57e520ee..53a61372ff3 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
@@ -27,9 +27,9 @@
<div class="media-body">
<mr-widget-author-time
:action-text="s__('mrWidget|Closed by')"
- :author="mr.metrics.closedBy"
- :date-title="mr.metrics.closedAt"
- :date-readable="mr.metrics.readableClosedAt"
+ :author="mr.closedBy"
+ :date-title="mr.closedAt"
+ :date-readable="mr.readableClosedAt"
/>
<section class="mr-info-list">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
index 1a444c04a1d..ebc29c0fa06 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
@@ -111,9 +111,9 @@
<div class="space-children">
<mr-widget-author-time
:action-text="s__('mrWidget|Merged by')"
- :author="mr.metrics.mergedBy"
- :date-title="mr.metrics.mergedAt"
- :date-readable="mr.metrics.readableMergedAt"
+ :author="mr.mergedBy"
+ :date-title="mr.mergedAt"
+ :date-readable="mr.readableMergedAt"
/>
<a
v-tooltip
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index 672e5280b5e..016e5b64371 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -14,6 +14,7 @@ export default class MergeRequestStore {
setData(data) {
const currentUser = data.current_user;
const pipelineStatus = data.pipeline ? data.pipeline.details.status : null;
+ const mergeUser = MergeRequestStore.formatUserObject(data.merge_user || {});
this.squash = data.squash;
this.squashBeforeMergeHelpPath =
@@ -47,8 +48,13 @@ export default class MergeRequestStore {
}
this.updatedAt = data.updated_at;
- this.metrics = MergeRequestStore.buildMetrics(data.metrics);
- this.setToMWPSBy = MergeRequestStore.formatUserObject(data.merge_user || {});
+ this.mergedBy = mergeUser;
+ this.mergedAt = MergeRequestStore.formatUserObject(data.merged_at);
+ this.readableMergedAt = MergeRequestStore.getReadableDate(data.merged_at);
+ this.closedBy = MergeRequestStore.formatUserObject(data.closed_by);
+ this.closedAt = MergeRequestStore.formatUserObject(data.closed_at);
+ this.readableClosedAt = MergeRequestStore.getReadableDate(data.closed_at);
+ this.setToMWPSBy = mergeUser;
this.mergeUserId = data.merge_user_id;
this.currentUserId = gon.current_user_id;
this.sourceBranchPath = data.source_branch_path;
@@ -150,21 +156,6 @@ export default class MergeRequestStore {
this.rebasePath = data.rebase_path;
}
- static buildMetrics(metrics) {
- if (!metrics) {
- return {};
- }
-
- return {
- mergedBy: MergeRequestStore.formatUserObject(metrics.merged_by),
- closedBy: MergeRequestStore.formatUserObject(metrics.closed_by),
- mergedAt: formatDate(metrics.merged_at),
- closedAt: formatDate(metrics.closed_at),
- readableMergedAt: MergeRequestStore.getReadableDate(metrics.merged_at),
- readableClosedAt: MergeRequestStore.getReadableDate(metrics.closed_at),
- };
- }
-
static formatUserObject(user) {
if (!user) {
return {};
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 396647a14ae..8c5aa90cc20 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -642,14 +642,6 @@ class MergeRequest < ActiveRecord::Base
end
end
- def merge_event
- @merge_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
- end
-
- def closed_event
- @closed_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
- end
-
def work_in_progress?
self.class.work_in_progress?(title)
end
@@ -1117,6 +1109,32 @@ class MergeRequest < ActiveRecord::Base
end
end
+ def closed_at
+ strong_memoize(:closed_at) do
+ next unless closed?
+
+ metrics&.latest_closed_at || closed_event&.created_at
+ end
+ end
+
+ def closed_by
+ strong_memoize(:closed_by) do
+ next unless closed?
+
+ metrics&.latest_closed_by || closed_event&.author
+ end
+ end
+
+ def merge_event
+ @merge_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
+ end
+ private :merge_event
+
+ def closed_event
+ @closed_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
+ end
+ private :closed_event
+
def can_be_cherry_picked?
merge_commit.present?
end
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index f55d448235a..e992cf20159 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -27,13 +27,9 @@ class MergeRequestWidgetEntity < IssuableEntity
expose :ff_only_enabled do |merge_request|
merge_request.project.merge_requests_ff_only_enabled
end
-
- expose :metrics do |merge_request|
- metrics = build_metrics(merge_request)
-
- MergeRequestMetricsEntity.new(metrics).as_json
- end
-
+ expose :closed_at
+ expose :closed_by
+ expose :merged_at
expose :rebase_commit_sha
expose :rebase_in_progress?, as: :rebase_in_progress
@@ -245,27 +241,4 @@ class MergeRequestWidgetEntity < IssuableEntity
@presenters ||= {}
@presenters[merge_request] ||= MergeRequestPresenter.new(merge_request, current_user: current_user)
end
-
- # Once SchedulePopulateMergeRequestMetricsWithEventsData fully runs,
- # we can remove this method and just serialize MergeRequest#metrics
- # instead. See https://gitlab.com/gitlab-org/gitlab-ce/issues/41587
- def build_metrics(merge_request)
- # There's no need to query and serialize metrics data for merge requests that are not
- # merged or closed.
- return unless merge_request.merged? || merge_request.closed?
- return merge_request.metrics if merge_request.merged? && merge_request.metrics&.merged_by_id
- return merge_request.metrics if merge_request.closed? && merge_request.metrics&.latest_closed_by_id
-
- build_metrics_from_events(merge_request)
- end
-
- def build_metrics_from_events(merge_request)
- closed_event = merge_request.closed_event
- merge_event = merge_request.merge_event
-
- MergeRequest::Metrics.new(latest_closed_at: closed_event&.updated_at,
- latest_closed_by: closed_event&.author,
- merged_at: merge_event&.updated_at,
- merged_by: merge_event&.author)
- end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 48f4e53b93e..2d7fbb37f64 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -1444,8 +1444,7 @@ describe MergeRequest do
end
it 'returns merged event creation date' do
- expect(merge_request.merge_event).to be_persisted
- expect(merge_request.merged_at).to eq(merge_request.merge_event.created_at)
+ expect(merge_request.merged_at).to be_present
end
end
@@ -1464,7 +1463,6 @@ describe MergeRequest do
it 'returns merging note creation date' do
expect(merge_request.reload.metrics).to be_nil
- expect(merge_request.merge_event).to be_nil
expect(merge_request.notes.count).to eq(1)
expect(merge_request.merged_at).to eq(merge_request.notes.first.created_at)
end
diff --git a/spec/serializers/merge_request_widget_entity_spec.rb b/spec/serializers/merge_request_widget_entity_spec.rb
index 0ba2539a717..c9d520e0dfe 100644
--- a/spec/serializers/merge_request_widget_entity_spec.rb
+++ b/spec/serializers/merge_request_widget_entity_spec.rb
@@ -50,81 +50,6 @@ describe MergeRequestWidgetEntity do
end
end
- describe 'metrics' do
- context 'when metrics record exists with merged data' do
- before do
- resource.mark_as_merged!
- resource.metrics.update!(merged_by: user)
- end
-
- it 'matches merge request metrics schema' do
- expect(subject[:metrics].with_indifferent_access)
- .to match_schema('entities/merge_request_metrics')
- end
-
- it 'returns values from metrics record' do
- expect(subject.dig(:metrics, :merged_by, :id))
- .to eq(resource.metrics.merged_by_id)
- end
- end
-
- context 'when metrics record exists with closed data' do
- before do
- resource.close!
- resource.metrics.update!(latest_closed_by: user)
- end
-
- it 'matches merge request metrics schema' do
- expect(subject[:metrics].with_indifferent_access)
- .to match_schema('entities/merge_request_metrics')
- end
-
- it 'returns values from metrics record' do
- expect(subject.dig(:metrics, :closed_by, :id))
- .to eq(resource.metrics.latest_closed_by_id)
- end
- end
-
- context 'when metrics does not exists' do
- before do
- resource.mark_as_merged!
- resource.metrics.destroy!
- resource.reload
- end
-
- context 'when events exists' do
- let!(:closed_event) { create(:event, :closed, project: project, target: resource) }
- let!(:merge_event) { create(:event, :merged, project: project, target: resource) }
-
- it 'matches merge request metrics schema' do
- expect(subject[:metrics].with_indifferent_access)
- .to match_schema('entities/merge_request_metrics')
- end
-
- it 'returns values from events record' do
- expect(subject.dig(:metrics, :merged_by, :id))
- .to eq(merge_event.author_id)
-
- expect(subject.dig(:metrics, :closed_by, :id))
- .to eq(closed_event.author_id)
-
- expect(subject.dig(:metrics, :merged_at).to_s)
- .to eq(merge_event.updated_at.to_s)
-
- expect(subject.dig(:metrics, :closed_at).to_s)
- .to eq(closed_event.updated_at.to_s)
- end
- end
-
- context 'when events does not exists' do
- it 'matches merge request metrics schema' do
- expect(subject[:metrics].with_indifferent_access)
- .to match_schema('entities/merge_request_metrics')
- end
- end
- end
- end
-
it 'has email_patches_path' do
expect(subject[:email_patches_path])
.to eq("/#{resource.project.full_path}/merge_requests/#{resource.iid}.patch")