Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/background_migration/backfill_user_details_fields.rb')
-rw-r--r--lib/gitlab/background_migration/backfill_user_details_fields.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/backfill_user_details_fields.rb b/lib/gitlab/background_migration/backfill_user_details_fields.rb
new file mode 100644
index 00000000000..8d8619256b0
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_user_details_fields.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Class that will backfill the following fields from user to user_details
+ # * linkedin
+ # * twitter
+ # * skype
+ # * website_url
+ # * location
+ # * organization
+ class BackfillUserDetailsFields < BatchedMigrationJob
+ operation_name :backfill_user_details_fields
+
+ def perform
+ query = <<~SQL
+ (COALESCE(linkedin, '') IS DISTINCT FROM '')
+ OR (COALESCE(twitter, '') IS DISTINCT FROM '')
+ OR (COALESCE(skype, '') IS DISTINCT FROM '')
+ OR (COALESCE(website_url, '') IS DISTINCT FROM '')
+ OR (COALESCE(location, '') IS DISTINCT FROM '')
+ OR (COALESCE(organization, '') IS DISTINCT FROM '')
+ SQL
+ field_limit = UserDetail::DEFAULT_FIELD_LENGTH
+
+ each_sub_batch(
+ batching_scope: ->(relation) {
+ relation.where(query).select(
+ 'id AS user_id',
+ "substring(COALESCE(linkedin, '') from 1 for #{field_limit}) AS linkedin",
+ "substring(COALESCE(twitter, '') from 1 for #{field_limit}) AS twitter",
+ "substring(COALESCE(skype, '') from 1 for #{field_limit}) AS skype",
+ "substring(COALESCE(website_url, '') from 1 for #{field_limit}) AS website_url",
+ "substring(COALESCE(location, '') from 1 for #{field_limit}) AS location",
+ "substring(COALESCE(organization, '') from 1 for #{field_limit}) AS organization"
+ )
+ }
+ ) do |sub_batch|
+ upsert_user_details_fields(sub_batch)
+ end
+ end
+
+ def upsert_user_details_fields(relation)
+ connection.execute(
+ <<~SQL
+ INSERT INTO user_details (user_id, linkedin, twitter, skype, website_url, location, organization)
+ #{relation.to_sql}
+ ON CONFLICT (user_id)
+ DO UPDATE SET
+ "linkedin" = EXCLUDED."linkedin",
+ "twitter" = EXCLUDED."twitter",
+ "skype" = EXCLUDED."skype",
+ "website_url" = EXCLUDED."website_url",
+ "location" = EXCLUDED."location",
+ "organization" = EXCLUDED."organization"
+ SQL
+ )
+ end
+ end
+ end
+end