Class: Gitlab::BackgroundMigration::BatchingStrategies::LooseIndexScanBatchingStrategy
- Inherits:
-
BaseStrategy
- Object
- BaseStrategy
- Gitlab::BackgroundMigration::BatchingStrategies::LooseIndexScanBatchingStrategy
- Includes:
- Database::DynamicModelHelpers
- Defined in:
- lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb
Overview
This strategy provides an efficient way to iterate over columns with non-distinct values. A common use case would be iterating over a foreign key columns, for example issues.project_id
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 job_class - The migration job class
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb', line 19 def next_batch(table_name, column_name, batch_min_value:, batch_size:, job_arguments:, job_class: nil) model_class = define_batchable_model(table_name, connection: connection) quoted_column_name = model_class.connection.quote_column_name(column_name) relation = model_class.where("#{quoted_column_name} >= ?", batch_min_value) next_batch_bounds = nil relation.distinct_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 |