Skip to content

Commit d569890

Browse files
committed
feat: add consumer id and provider id to verifications table to speed up queries
1 parent ec59ba5 commit d569890

8 files changed

+102
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Sequel.migration do
2+
change do
3+
alter_table(:verifications) do
4+
add_foreign_key(:consumer_id, :pacticipants)
5+
add_foreign_key(:provider_id, :pacticipants)
6+
add_index(:consumer_id, name: "verifications_consumer_id_index")
7+
add_index(:provider_id, name: "verifications_provider_id_index")
8+
add_index([:provider_id, :consumer_id], name: "verifications_provider_id_consumer_id_index")
9+
end
10+
11+
# TODO
12+
# alter_table(:verifications) do
13+
# set_column_not_null(:consumer_id)
14+
# set_column_not_null(:provider_id)
15+
# end
16+
end
17+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require 'pact_broker/db/data_migrations/set_pacticipant_ids_for_verifications'
2+
3+
Sequel.migration do
4+
up do
5+
PactBroker::DB::DataMigrations::SetPacticipantIdsForVerifications.call(self)
6+
end
7+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Sequel.migration do
2+
up do
3+
# The latest verification id for each consumer version tag
4+
create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
5+
"select
6+
provider_id,
7+
consumer_id,
8+
max(id) as latest_verification_id
9+
from verifications v
10+
group by provider_id, consumer_id")
11+
end
12+
13+
down do
14+
# The latest verification id for each consumer version tag
15+
create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
16+
"select
17+
pv.pacticipant_id as provider_id,
18+
lpp.consumer_id,
19+
max(v.id) as latest_verification_id
20+
from verifications v
21+
join latest_pact_publications_by_consumer_versions lpp
22+
on v.pact_version_id = lpp.pact_version_id
23+
join versions pv
24+
on v.provider_version_id = pv.id
25+
group by pv.pacticipant_id, lpp.consumer_id")
26+
end
27+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module PactBroker
2+
module DB
3+
module DataMigrations
4+
class SetPacticipantIdsForVerifications
5+
def self.call connection
6+
if columns_exist?(connection)
7+
ids = connection.from(:verifications)
8+
.select(Sequel[:verifications][:id], Sequel[:pact_versions][:consumer_id], Sequel[:pact_versions][:provider_id])
9+
.join(:pact_versions, {id: :provider_version_id})
10+
.where(Sequel[:verifications][:consumer_id] => nil)
11+
.or(Sequel[:verifications][:provider_id] => nil)
12+
13+
ids.each do | id |
14+
connection.from(:verifications).where(id: id[:id]).update(consumer_id: id[:consumer_id], provider_id: id[:provider_id])
15+
end
16+
end
17+
end
18+
19+
def self.columns_exist?(connection)
20+
column_exists?(connection, :verifications, :provider_id) &&
21+
column_exists?(connection, :verifications, :consumer_id) &&
22+
column_exists?(connection, :verifications, :provider_version_id) &&
23+
column_exists?(connection, :pact_versions, :provider_id) &&
24+
column_exists?(connection, :pact_versions, :consumer_id) &&
25+
column_exists?(connection, :pact_versions, :id)
26+
end
27+
28+
def self.column_exists?(connection, table, column)
29+
connection.table_exists?(table) && connection.schema(table).find{|col| col.first == column }
30+
end
31+
end
32+
end
33+
end
34+
end

lib/pact_broker/db/migrate_data.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
require 'pact_broker/db/data_migrations/set_pacticipant_ids_for_verifications'
2+
13
module PactBroker
24
module DB
35
class MigrateData
46
def self.call database_connection, options = {}
5-
7+
DataMigrations::SetPacticipantIdsForVerifications.call(database_connection)
68
end
79
end
810
end

lib/pact_broker/domain/pacticipant.rb

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ def validate
6060
# pact_versions | pact_versions_consumer_id_fkey | (consumer_id) REFERENCES pacticipants(id)
6161
# pact_versions | pact_versions_provider_id_fkey | (provider_id) REFERENCES pacticipants(id)
6262
# versions | versions_pacticipant_id_fkey | (pacticipant_id) REFERENCES pacticipants(id)
63+
# verifications | verifications_consumer_id_fkey | (consumer_id) REFERENCES pacticipants(id)
64+
# verifications | verifications_provider_id_fkey | (provider_id) REFERENCES pacticipants(id)
6365
# labels | labels_pacticipant_id_fkey | (pacticipant_id) REFERENCES pacticipants(id)
6466
# triggered_webhooks | triggered_webhooks_consumer_id_fkey | (consumer_id) REFERENCES pacticipants(id)
6567
# triggered_webhooks | triggered_webhooks_provider_id_fkey | (provider_id) REFERENCES pacticipants(id)

lib/pact_broker/domain/verification.rb

+9-2
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,18 @@ def latest_pact_publication
111111
# created_at | timestamp without time zone | NOT NULL
112112
# provider_version_id | integer |
113113
# test_results | text |
114+
# consumer_id | integer |
115+
# provider_id | integer |
114116
# Indexes:
115-
# verifications_pkey | PRIMARY KEY btree (id)
116-
# verifications_pact_version_id_number_index | UNIQUE btree (pact_version_id, number)
117+
# verifications_pkey | PRIMARY KEY btree (id)
118+
# verifications_pact_version_id_number_index | UNIQUE btree (pact_version_id, number)
119+
# verifications_consumer_id_index | btree (consumer_id)
120+
# verifications_provider_id_consumer_id_index | btree (provider_id, consumer_id)
121+
# verifications_provider_id_index | btree (provider_id)
117122
# Foreign key constraints:
118123
# fk_verifications_versions | (provider_version_id) REFERENCES versions(id)
124+
# verifications_consumer_id_fkey | (consumer_id) REFERENCES pacticipants(id)
119125
# verifications_pact_version_id_fkey | (pact_version_id) REFERENCES pact_versions(id)
126+
# verifications_provider_id_fkey | (provider_id) REFERENCES pacticipants(id)
120127
# Referenced By:
121128
# triggered_webhooks | triggered_webhooks_verification_id_fkey | (verification_id) REFERENCES verifications(id)

lib/pact_broker/verifications/repository.rb

+3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ def next_number
2121

2222
def create verification, provider_version_number, pact
2323
provider = pacticipant_repository.find_by_name(pact.provider_name)
24+
consumer = pacticipant_repository.find_by_name(pact.consumer_name)
2425
version = version_repository.find_by_pacticipant_id_and_number_or_create(provider.id, provider_version_number)
2526
verification.pact_version_id = pact_version_id_for(pact)
2627
verification.provider_version = version
28+
verification.provider_id = provider.id
29+
verification.consumer_id = consumer.id
2730
verification.save
2831
end
2932

0 commit comments

Comments
 (0)