diff options
Diffstat (limited to 'db/fixtures/development/03_project.rb')
-rw-r--r-- | db/fixtures/development/03_project.rb | 113 |
1 files changed, 63 insertions, 50 deletions
diff --git a/db/fixtures/development/03_project.rb b/db/fixtures/development/03_project.rb index e879db84e68..ae9a17b637c 100644 --- a/db/fixtures/development/03_project.rb +++ b/db/fixtures/development/03_project.rb @@ -53,14 +53,56 @@ class Gitlab::Seeder::Projects public: 1 # 1m projects = 5m total } + BATCH_SIZE = 100_000 + def seed! Sidekiq::Testing.inline! do create_real_projects! create_large_projects! - create_mass_projects! end end + def self.insert_project_namespaces_sql(type:, range:) + <<~SQL + INSERT INTO namespaces (name, path, parent_id, owner_id, type, visibility_level, created_at, updated_at) + SELECT + 'Seed project ' || seq || ' ' || ('{#{Gitlab::Seeder::Projects.visibility_per_user}}'::text[])[seq] AS project_name, + '#{Gitlab::Seeder::MASS_INSERT_PROJECT_START}' || ('{#{Gitlab::Seeder::Projects.visibility_per_user}}'::text[])[seq] || '_' || seq AS namespace_path, + n.id AS parent_id, + n.owner_id AS owner_id, + 'Project' AS type, + ('{#{Gitlab::Seeder::Projects.visibility_level_per_user}}'::int[])[seq] AS visibility_level, + NOW() AS created_at, + NOW() AS updated_at + FROM namespaces n + CROSS JOIN generate_series(1, #{Gitlab::Seeder::Projects.projects_per_user_count}) AS seq + WHERE type='#{type}' AND path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%' + AND n.id BETWEEN #{range.first} AND #{range.last} + ON CONFLICT DO NOTHING; + SQL + end + + def self.insert_projects_sql(type:, range:) + <<~SQL + INSERT INTO projects (name, path, creator_id, namespace_id, project_namespace_id, visibility_level, created_at, updated_at) + SELECT + n.name AS project_name, + n.path AS project_path, + n.owner_id AS creator_id, + n.parent_id AS namespace_id, + n.id AS project_namespace_id, + n.visibility_level AS visibility_level, + NOW() AS created_at, + NOW() AS updated_at + FROM namespaces n + WHERE type = 'Project' AND n.parent_id IN ( + SELECT id FROM namespaces n1 WHERE type='#{type}' + AND path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%' AND n1.id BETWEEN #{range.first} AND #{range.last} + ) + ON CONFLICT DO NOTHING; + SQL + end + private def create_real_projects! @@ -156,55 +198,26 @@ class Gitlab::Seeder::Projects end end - def create_mass_projects! - projects_per_user_count = MASS_PROJECTS_COUNT_PER_USER.values.sum - visibility_per_user = ['private'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:private) + - ['internal'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:internal) + - ['public'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:public) - visibility_level_per_user = visibility_per_user.map { |visibility| Gitlab::VisibilityLevel.level_value(visibility) } - - visibility_per_user = visibility_per_user.join(',') - visibility_level_per_user = visibility_level_per_user.join(',') - - Gitlab::Seeder.with_mass_insert(User.count * projects_per_user_count, "Projects and relations") do - ActiveRecord::Base.connection.execute <<~SQL - INSERT INTO projects (name, path, creator_id, namespace_id, visibility_level, created_at, updated_at) - SELECT - 'Seed project ' || seq || ' ' || ('{#{visibility_per_user}}'::text[])[seq] AS project_name, - '#{Gitlab::Seeder::MASS_INSERT_PROJECT_START}' || ('{#{visibility_per_user}}'::text[])[seq] || '_' || seq AS project_path, - u.id AS user_id, - n.id AS namespace_id, - ('{#{visibility_level_per_user}}'::int[])[seq] AS visibility_level, - NOW() AS created_at, - NOW() AS updated_at - FROM users u - CROSS JOIN generate_series(1, #{projects_per_user_count}) AS seq - JOIN namespaces n ON n.owner_id=u.id - SQL - - ActiveRecord::Base.connection.execute <<~SQL - INSERT INTO project_features (project_id, merge_requests_access_level, issues_access_level, wiki_access_level, - pages_access_level) - SELECT - id, - #{ProjectFeature::ENABLED} AS merge_requests_access_level, - #{ProjectFeature::ENABLED} AS issues_access_level, - #{ProjectFeature::ENABLED} AS wiki_access_level, - #{ProjectFeature::ENABLED} AS pages_access_level - FROM projects ON CONFLICT (project_id) DO NOTHING; - SQL - - ActiveRecord::Base.connection.execute <<~SQL - INSERT INTO routes (source_id, source_type, name, path) - SELECT - p.id, - 'Project', - u.name || ' / ' || p.name, - u.username || '/' || p.path - FROM projects p JOIN users u ON u.id=p.creator_id - ON CONFLICT (source_type, source_id) DO NOTHING; - SQL - end + def self.projects_per_user_count + MASS_PROJECTS_COUNT_PER_USER.values.sum + end + + def self.visibility_per_user_array + ['private'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:private) + + ['internal'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:internal) + + ['public'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:public) + end + + def self.visibility_level_per_user_map + visibility_per_user_array.map { |visibility| Gitlab::VisibilityLevel.level_value(visibility) } + end + + def self.visibility_per_user + visibility_per_user_array.join(',') + end + + def self.visibility_level_per_user + visibility_level_per_user_map.join(',') end end |