Skip to content

Commit a3aea48

Browse files
committed
feat(dashboard api): speed up loading of verification tags
1 parent a0d0e94 commit a3aea48

10 files changed

+66
-143
lines changed

db/migrations/20180119_update_latest_triggered_webhooks.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
)
1919

2020
create_or_replace_view(:latest_triggered_webhook_ids,
21-
"select tw.webhook_uuid, tw.consumer_id, tw.provider_id, max(tw.id) as latest_triggered_webhook_id
21+
"select tw.webhook_uuid, tw.consumer_id, tw.provider_id, ltwcd.latest_triggered_webhook_created_at, max(tw.id) as latest_triggered_webhook_id
2222
from latest_triggered_webhook_creation_dates ltwcd
2323
inner join triggered_webhooks tw
2424
on tw.consumer_id = ltwcd.consumer_id

db/migrations/20180123_create_latest_verification_tags.rb

-43
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require_relative 'migration_helper'
2+
3+
Sequel.migration do
4+
change do
5+
create_view(:latest_tagged_version_orders,
6+
PactBroker::MigrationHelper.sqlite_safe("
7+
select v.pacticipant_id, t.name as tag_name, max(v.order) as latest_version_order, 1 as latest
8+
from tags t
9+
inner join versions v
10+
on v.id = t.version_id
11+
group by v.pacticipant_id, t.name
12+
")
13+
)
14+
15+
create_view(:tags_with_latest_flag,
16+
PactBroker::MigrationHelper.sqlite_safe("
17+
select t.*, ltvo.latest
18+
from tags t
19+
inner join versions v
20+
on v.id = t.version_id
21+
left outer join latest_tagged_version_orders ltvo
22+
on t.name = ltvo.tag_name
23+
and v.pacticipant_id = ltvo.pacticipant_id
24+
and v.order = ltvo.latest_version_order
25+
")
26+
)
27+
end
28+
end

db/migrations/migration_helper.rb

+8
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,13 @@ def with_mysql
2121
def adapter
2222
Sequel::Model.db.adapter_scheme.to_s
2323
end
24+
25+
def sqlite_safe string
26+
if adapter == 'sqlite'
27+
string.gsub(/\border\b/, '`order`')
28+
else
29+
string
30+
end
31+
end
2432
end
2533
end

lib/pact_broker/api/decorators/dashboard_decorator.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def verification_tags(index_item, base_url)
131131
fake_tag = OpenStruct.new(name: tag.name, version: index_item.provider_version)
132132
{
133133
name: tag.name,
134-
latest: true,
134+
latest: tag.latest?,
135135
_links: {
136136
self: {
137137
href: tag_url(base_url, fake_tag)

lib/pact_broker/index/service.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def self.find_index_items options = {}
2323
.eager(:webhooks)
2424
.order(:consumer_name, :provider_name)
2525
.eager(:consumer_version_tags)
26+
.eager(:provider_version_tags)
2627
.all
2728
end
2829

@@ -35,7 +36,7 @@ def self.find_index_items options = {}
3536
.eager(:webhooks)
3637
.order(:consumer_name, :provider_name)
3738
.eager(:consumer_version_tags)
38-
.eager(:latest_verification_tags)
39+
.eager(:provider_version_tags)
3940

4041
if options[:tags].is_a?(Array)
4142
tagged_rows = tagged_rows.where(Sequel[:head_pact_publications][:tag_name] => options[:tags]).or(Sequel[:head_pact_publications][:tag_name] => nil)
@@ -67,7 +68,7 @@ def self.find_index_items options = {}
6768
row.webhooks,
6869
row.latest_triggered_webhooks,
6970
tag_names,
70-
row.latest_verification_tags
71+
row.provider_version_tags.select(&:latest?)
7172
)
7273
end
7374

lib/pact_broker/matrix/row.rb

+6-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
require 'pact_broker/repositories/helpers'
22
require 'pact_broker/webhooks/latest_triggered_webhook'
33
require 'pact_broker/tags/latest_verification_tag'
4+
require 'pact_broker/tags/tag_with_latest_flag'
45

56
module PactBroker
67
module Matrix
78
class Row < Sequel::Model(:matrix)
89

9-
1010
associate(:one_to_many, :latest_triggered_webhooks, :class => "PactBroker::Webhooks::LatestTriggeredWebhook", primary_key: :pact_publication_id, key: :pact_publication_id)
11-
12-
# already have this
13-
# associate(:many_to_one, :latest_verification, :class => "PactBroker::Verifications::Repository::LatestVerificationsByConsumerVersion", primary_key: :pact_version_id, key: :pact_version_id)
14-
# TODO modify this to work with single pacticipant webhooks
1511
associate(:one_to_many, :webhooks, :class => "PactBroker::Webhooks::Webhook", primary_key: [:consumer_id, :provider_id], key: [:consumer_id, :provider_id])
16-
associate(:one_to_many, :consumer_version_tags, :class => "PactBroker::Domain::Tag", primary_key: :consumer_version_id, key: :version_id)
17-
associate(:one_to_many, :latest_verification_tags, :class => "PactBroker::Tags::LatestVerificationTag", primary_key: :verification_id, key: :verification_id)
12+
associate(:one_to_many, :consumer_version_tags, :class => "PactBroker::Tags::TagWithLatestFlag", primary_key: :consumer_version_id, key: :version_id)
13+
associate(:one_to_many, :provider_version_tags, :class => "PactBroker::Tags::TagWithLatestFlag", primary_key: :provider_version_id, key: :version_id)
1814

1915
dataset_module do
2016
include PactBroker::Repositories::Helpers
@@ -71,9 +67,9 @@ def consumer_head_tag_names= consumer_head_tag_names
7167
@consumer_head_tag_names = consumer_head_tag_names
7268
end
7369

74-
def latest_triggered_webhooks
75-
@latest_triggered_webhooks ||= []
76-
end
70+
# def latest_triggered_webhooks
71+
# @latest_triggered_webhooks ||= []
72+
# end
7773

7874
def summary
7975
"#{consumer_name}#{consumer_version_number} #{provider_name}#{provider_version_number || '?'} (r#{pact_revision_number}n#{verification_number || '?'})"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'pact_broker/db'
2+
require 'pact_broker/repositories/helpers'
3+
4+
module PactBroker
5+
module Tags
6+
# The tag associated with the latest verification for a given tag
7+
class TagWithLatestFlag < Sequel::Model(:tags_with_latest_flag)
8+
9+
dataset_module do
10+
include PactBroker::Repositories::Helpers
11+
end
12+
13+
def latest?
14+
!values[:latest].nil?
15+
end
16+
end
17+
end
18+
end

spec/lib/pact_broker/api/decorators/dashboard_decorator_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module Decorators
2121
provider_version_number: provider_version.number,
2222
consumer_version_number: consumer_version.number,
2323
tag_names: ['prod'],
24-
latest_verification_latest_tags: [double('tag', name: 'dev')]
24+
latest_verification_latest_tags: [double('tag', name: 'dev', latest?: true)]
2525
)
2626
end
2727
let(:consumer) { instance_double('PactBroker::Domain::Pacticipant', name: 'Foo') }

spec/migrations/20180123_create_latest_verification_tags_spec.rb

-85
This file was deleted.

0 commit comments

Comments
 (0)