Skip to content

Commit b4f1877

Browse files
committed
feat: keep track of the latest verification for a pact version for each provider version, rather than calculating it
1 parent c8fa554 commit b4f1877

6 files changed

+82
-1
lines changed

db/migrations/20180517_create_latest_pact_publication_ids.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
create_table(:latest_pact_publication_ids_by_consumer_versions, charset: 'utf8') do
1111
foreign_key :consumer_version_id, :versions, nil: false, on_delete: :cascade
1212
foreign_key :provider_id, :pacticipants, nil: false, on_delete: :cascade
13-
foreign_key :pact_publication_id, :pact_publications, nil: false, on_delete: :cascade
13+
foreign_key :pact_publication_id, :pact_publications, nil: false, on_delete: :cascade, unique: true
1414
index [:provider_id, :consumer_version_id], unique: true, name: "unq_latest_ppid_prov_conver"
1515
end
1616
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Sequel.migration do
2+
up do
3+
# Latest verification_id for each pact version/provider version.
4+
# Keeping track of this in a table rather than having to calculate the
5+
# latest revision speeds queries up.
6+
create_table(:latest_verification_id_for_pact_version_and_provider_version, charset: 'utf8') do
7+
foreign_key :pact_version_id, :pact_versions, nil: false, on_delete: :cascade
8+
foreign_key :provider_version_id, :versions, nil: false, on_delete: :cascade
9+
foreign_key :provider_id, :pacticipants, nil: false, on_delete: :cascade
10+
foreign_key :verification_id, :verifications, nil: false, on_delete: :cascade, unique: true
11+
index [:pact_version_id, :provider_version_id], unique: true, name: "unq_latest_verifid_pvid_provid"
12+
end
13+
end
14+
15+
down do
16+
drop_table(:latest_verification_id_for_pact_version_and_provider_version)
17+
end
18+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Sequel.migration do
2+
up do
3+
# Not sure if we need the provider_id, but it might come in handy
4+
rows = from(:verifications).select_group(
5+
Sequel[:verifications][:pact_version_id],
6+
Sequel[:verifications][:provider_version_id],
7+
Sequel[:versions][:pacticipant_id].as(:provider_id))
8+
.select_append{ max(verifications[id]).as(verification_id) }
9+
.join(:versions, { Sequel[:verifications][:provider_version_id] => Sequel[:versions][:id] })
10+
11+
# The danger with this migration is that a verification created by an old node will be lost
12+
from(:latest_verification_id_for_pact_version_and_provider_version).insert(rows)
13+
end
14+
15+
down do
16+
17+
end
18+
end
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Sequel.migration do
2+
up do
3+
# joining with latest_pact_publication_revision_numbers gets rid of the overwritten
4+
# pact revisions, and the max(verification_id) gets rid of the overwritten
5+
# verifications
6+
create_or_replace_view(:latest_verification_id_for_consumer_version_and_provider_version,
7+
"select pp.consumer_version_id, lv.provider_version_id, lv.verification_id as latest_verification_id
8+
from latest_pact_publication_ids_by_consumer_versions lpp
9+
inner join pact_publications pp
10+
on pp.id = lpp.pact_publication_id
11+
left outer join latest_verification_id_for_pact_version_and_provider_version lv
12+
on lv.pact_version_id = pp.pact_version_id"
13+
)
14+
15+
end
16+
17+
down do
18+
create_or_replace_view(:latest_verification_id_for_consumer_version_and_provider_version,
19+
"select consumer_version_id, provider_version_id, max(verification_id) as latest_verification_id
20+
from matrix
21+
inner join latest_pact_publication_revision_numbers lr
22+
on matrix.consumer_id = lr.consumer_id
23+
and matrix.provider_id = lr.provider_id
24+
and matrix.consumer_version_order = lr.consumer_version_order
25+
and matrix.pact_revision_number = lr.latest_revision_number
26+
group by consumer_version_id, provider_version_id"
27+
)
28+
29+
end
30+
end

lib/pact_broker/api/resources/verification.rb

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ def content_types_provided
1414
[["application/hal+json", :to_json], ["application/json", :to_json]]
1515
end
1616

17+
# Remember to update latest_verification_id_for_pact_version_and_provider_version
18+
# if/when DELETE is implemented
1719
def allowed_methods
1820
["GET"]
1921
end

lib/pact_broker/verifications/repository.rb

+13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ def create verification, provider_version_number, pact
2525
verification.pact_version_id = pact_version_id_for(pact)
2626
verification.provider_version = version
2727
verification.save
28+
update_latest_verification_id(verification)
29+
verification
30+
end
31+
32+
def update_latest_verification_id verification
33+
if PactBroker::Domain::Verification.db.table_exists?(:latest_verification_id_for_pact_version_and_provider_version)
34+
table = PactBroker::Domain::Verification.db[:latest_verification_id_for_pact_version_and_provider_version]
35+
if table.where(pact_version_id: verification.pact_version_id, provider_version_id: verification.provider_version_id).count == 0
36+
table.insert(pact_version_id: verification.pact_version_id, provider_version_id: verification.provider_version_id, provider_id: verification.provider_version.pacticipant_id, verification_id: verification.id)
37+
else
38+
table.where(pact_version_id: verification.pact_version_id, provider_version_id: verification.provider_version_id).update(verification_id: verification.id)
39+
end
40+
end
2841
end
2942

3043
def find consumer_name, provider_name, pact_version_sha, verification_number

0 commit comments

Comments
 (0)