From f5e3d2b3deb04a07e67d42a71f86a97b9d0bbb63 Mon Sep 17 00:00:00 2001 From: "Sergio C. Arteaga" Date: Mon, 25 Oct 2021 15:20:10 +0200 Subject: [PATCH] Update packages tsdoc when transferring repository (#1652) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #1648 Signed-off-by: Sergio CastaƱo Arteaga --- .../repositories/transfer_repository.sql | 27 +++++++ .../029_regenerate_all_packages_tsdoc.sql | 24 +++++++ .../repositories/transfer_repository.sql | 71 ++++++++++++++++++- 3 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 database/migrations/schema/029_regenerate_all_packages_tsdoc.sql diff --git a/database/migrations/functions/repositories/transfer_repository.sql b/database/migrations/functions/repositories/transfer_repository.sql index c38dc20b..7484dba9 100644 --- a/database/migrations/functions/repositories/transfer_repository.sql +++ b/database/migrations/functions/repositories/transfer_repository.sql @@ -64,5 +64,32 @@ begin user_id = null where name = p_repository_name; end if; + + -- Regenerate repository's packages text search document using new + -- publisher information + with new_tsdoc as ( + select + p.package_id, + generate_package_tsdoc( + p.name, + s.display_name, + s.description, + s.keywords, + array[r.name, r.display_name], + array[u.alias, o.name, o.display_name, s.provider] + ) as tsdoc + from package p + join snapshot s using (package_id) + join repository r using (repository_id) + left join "user" u using (user_id) + left join organization o using (organization_id) + where s.version = p.latest_version + and r.name = p_repository_name + ) + update package + set tsdoc = new_tsdoc.tsdoc + from new_tsdoc + where package.package_id = new_tsdoc.package_id; + end $$ language plpgsql; diff --git a/database/migrations/schema/029_regenerate_all_packages_tsdoc.sql b/database/migrations/schema/029_regenerate_all_packages_tsdoc.sql new file mode 100644 index 00000000..e6b048f5 --- /dev/null +++ b/database/migrations/schema/029_regenerate_all_packages_tsdoc.sql @@ -0,0 +1,24 @@ +with new_tsdoc as ( + select + p.package_id, + ( + setweight(to_tsvector(p.name), 'A') || + setweight(to_tsvector(coalesce(s.display_name, '')), 'A') || + setweight(to_tsvector(coalesce(s.description, '')), 'B') || + setweight(to_tsvector(array_to_string(coalesce(s.keywords, '{}'), ' ')), 'C') || + setweight(to_tsvector(array_to_string(coalesce(array[r.name, r.display_name], '{}'), ' ')), 'B') || + setweight(to_tsvector(array_to_string(coalesce(array[u.alias, o.name, o.display_name, s.provider], '{}'), ' ')), 'B') + ) as tsdoc + from package p + join snapshot s using (package_id) + join repository r using (repository_id) + left join "user" u using (user_id) + left join organization o using (organization_id) + where s.version = p.latest_version +) +update package +set tsdoc = new_tsdoc.tsdoc +from new_tsdoc +where package.package_id = new_tsdoc.package_id; + +---- create above / drop below ---- diff --git a/database/tests/functions/repositories/transfer_repository.sql b/database/tests/functions/repositories/transfer_repository.sql index 22441d82..e95c6f44 100644 --- a/database/tests/functions/repositories/transfer_repository.sql +++ b/database/tests/functions/repositories/transfer_repository.sql @@ -1,6 +1,6 @@ -- Start transaction and plan tests begin; -select plan(13); +select plan(16); -- Declare some variables \set user1ID '00000000-0000-0000-0000-000000000001' @@ -10,6 +10,8 @@ select plan(13); \set org3ID '00000000-0000-0000-0000-000000000003' \set repo1ID '00000000-0000-0000-0000-000000000001' \set repo2ID '00000000-0000-0000-0000-000000000002' +\set package1ID '00000000-0000-0000-0000-000000000001' +\set package2ID '00000000-0000-0000-0000-000000000002' -- Seed some data insert into "user" (user_id, alias, email) @@ -28,6 +30,54 @@ insert into repository (repository_id, name, display_name, url, repository_kind_ values (:'repo1ID', 'repo1', 'Repo 1', 'https://repo1.com', 0, :'user1ID'); insert into repository (repository_id, name, display_name, url, repository_kind_id, organization_id) values (:'repo2ID', 'repo2', 'Repo 2', 'https://repo2.com', 0, :'org1ID'); +insert into package ( + package_id, + name, + latest_version, + repository_id +) values ( + :'package1ID', + 'package1', + '1.0.0', + :'repo1ID' +); +insert into snapshot ( + package_id, + version, + app_version, + display_name, + description +) values ( + :'package1ID', + '1.0.0', + '12.0.0', + 'Package 1', + 'description' +); +insert into package ( + package_id, + name, + latest_version, + repository_id +) values ( + :'package2ID', + 'package2', + '1.0.0', + :'repo2ID' +); +insert into snapshot ( + package_id, + version, + app_version, + display_name, + description +) values ( + :'package2ID', + '1.0.0', + '12.0.0', + 'Package 2', + 'description' +); -- Transfers NOT part of an ownership claim request @@ -97,12 +147,30 @@ select results_eq( ); select is(count(*), 0::bigint, 'No repository ownership claim events should have been registered') from event where repository_id=:'repo2ID' and event_kind_id = 3; +select is( + tsdoc, + '2:3A 2:7B description:4B package:2A package2:1A repo:6B repo2:5B user1:8B'::tsvector, + 'Package 2 tsdoc should have been updated (user1 is now the publisher)' +) +from package where package_id=:'package2ID'; +select is( + tsdoc, + null, + 'Package 1 tsdoc should not have been updated' +) +from package where package_id=:'package1ID'; select transfer_repository( 'repo2', '00000000-0000-0000-0000-000000000001', 'org1', false ); +select is( + tsdoc, + '1:10B 2:3A,7B description:4B org1:8B organization:9B package:2A package2:1A repo:6B repo2:5B'::tsvector, + 'Package 2 tsdoc should have been updated again (org1 is now the publisher)' +) +from package where package_id=:'package2ID'; -- Transfer org owned repository to other org select transfer_repository( @@ -155,7 +223,6 @@ select transfer_repository( null, true ); -select * from event; select results_eq( $$ select user_id, organization_id