Class: Gitlab::BackgroundMigration::BatchingStrategies::BackfillProjectNamespacePerGroupBatchingStrategy
- Inherits:
-
PrimaryKeyBatchingStrategy
- Object
- BaseStrategy
- PrimaryKeyBatchingStrategy
- Gitlab::BackgroundMigration::BatchingStrategies::BackfillProjectNamespacePerGroupBatchingStrategy
- Defined in:
- lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb
Overview
Batching class to use for back-filling project namespaces for a single group. Batches over the projects table and id column combination, scoped to a given group returning the MIN() and MAX() values for the next batch as an array.
If no more batches exist in the table, returns nil.
Constant Summary
Constants included from Database::DynamicModelHelpers
Database::DynamicModelHelpers::BATCH_SIZE
Instance Method Summary collapse
-
#next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil) ⇒ Object
Finds and returns the next batch in the table.
Methods included from Database::DynamicModelHelpers
#define_batchable_model, #each_batch, #each_batch_range
Methods inherited from BaseStrategy
Constructor Details
This class inherits a constructor from Gitlab::BackgroundMigration::BatchingStrategies::BaseStrategy
Instance Method Details
#next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil) ⇒ Object
Finds and returns the next batch in the table.
table_name - The table to batch over column_name - The column to batch over batch_min_value - The minimum value which the next batch will start at batch_size - The size of the next batch job_arguments - The migration job arguments
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb', line 19 def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil) next_batch_bounds = nil model_class = ::Gitlab::BackgroundMigration::ProjectNamespaces::Models::Project quoted_column_name = model_class.connection.quote_column_name(column_name) projects_table = model_class.arel_table hierarchy_cte_sql = Arel::Nodes::SqlLiteral.new(::Gitlab::BackgroundMigration::ProjectNamespaces::BackfillProjectNamespaces.hierarchy_cte(job_arguments.first)) relation = model_class.where(projects_table[:namespace_id].in(hierarchy_cte_sql)).where("#{quoted_column_name} >= ?", batch_min_value) relation.each_batch(of: batch_size, column: column_name) do |batch| # rubocop:disable Lint/UnreachableLoop next_batch_bounds = batch.pick(Arel.sql("MIN(#{quoted_column_name}), MAX(#{quoted_column_name})")) break end next_batch_bounds end |