Skip to content

Commit e09d528

Browse files
committed
fix: optimize matrix query to speed up lengthy pact publication times
1 parent d2992cf commit e09d528

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
require_relative 'migration_helper'
2+
3+
Sequel.migration do
4+
up do
5+
6+
# For each consumer_id/provider_id/tag_name, the version order of the latest version that has a pact
7+
create_or_replace_view(:latest_tagged_pact_consumer_version_orders,
8+
"select pp.provider_id, cv.pacticipant_id as consumer_id, t.name as tag_name, max(\"order\") as latest_consumer_version_order
9+
from pact_publications pp
10+
inner join versions cv
11+
on pp.consumer_version_id = cv.id
12+
inner join tags t
13+
on t.version_id = pp.consumer_version_id
14+
group by pp.provider_id, cv.pacticipant_id, t.name"
15+
)
16+
17+
# Add provider_version_order
18+
create_or_replace_view(:latest_verifications,
19+
PactBroker::MigrationHelper.sqlite_safe("SELECT v.id, v.number, v.success, s.number as provider_version,
20+
v.build_url, v.pact_version_id, v.execution_date, v.created_at,
21+
v.provider_version_id, s.number as provider_version_number,
22+
s.order as provider_version_order
23+
FROM verifications v
24+
INNER JOIN latest_verification_numbers lv
25+
ON v.pact_version_id = lv.pact_version_id
26+
AND v.number = lv.latest_number
27+
INNER JOIN versions s on v.provider_version_id = s.id")
28+
)
29+
30+
create_or_replace_view(:head_matrix,
31+
32+
PactBroker::MigrationHelper.sqlite_safe("
33+
select
34+
p.consumer_id, p.consumer_name, p.consumer_version_id, p.consumer_version_number, p.consumer_version_order,
35+
p.id as pact_publication_id, p.pact_version_id, p.pact_version_sha, p.revision_number as pact_revision_number,
36+
p.created_at as pact_created_at,
37+
p.provider_id, p.provider_name, lv.provider_version_id, lv.provider_version_number, lv.provider_version_order,
38+
lv.id as verification_id, lv.success, lv.number as verification_number, lv.execution_date as verification_executed_at,
39+
lv.build_url as verification_build_url,
40+
null as consumer_version_tag_name
41+
from latest_pact_publications p
42+
left outer join latest_verifications lv
43+
on p.pact_version_id = lv.pact_version_id
44+
45+
union all
46+
47+
select
48+
p.consumer_id, p.consumer_name, p.consumer_version_id, p.consumer_version_number, p.consumer_version_order,
49+
p.id as pact_publication_id, p.pact_version_id, p.pact_version_sha, p.revision_number as pact_revision_number,
50+
p.created_at as pact_created_at,
51+
p.provider_id, p.provider_name, lv.provider_version_id, lv.provider_version_number, lv.provider_version_order,
52+
lv.id as verification_id, lv.success, lv.number as verification_number, lv.execution_date as verification_executed_at,
53+
lv.build_url as verification_build_url,
54+
lt.tag_name as consumer_version_tag_name
55+
from latest_tagged_pact_consumer_version_orders lt
56+
inner join latest_pact_publications_by_consumer_versions p
57+
on lt.consumer_id = p.consumer_id
58+
and lt.provider_id = p.provider_id
59+
and lt.latest_consumer_version_order = p.consumer_version_order
60+
left outer join latest_verifications lv
61+
on p.pact_version_id = lv.pact_version_id
62+
")
63+
)
64+
end
65+
end

db/migrations/migration_helper.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def adapter
2424

2525
def sqlite_safe string
2626
if adapter == 'sqlite'
27-
string.gsub(/\border\b/, '`order`')
27+
string.gsub(/(?:\b|")order(?:"|\b)/, '`order`')
2828
else
2929
string
3030
end

0 commit comments

Comments
 (0)