Class: Gitlab::BackgroundMigration::BatchingStrategies::LooseIndexScanBatchingStrategy

Inherits:
BaseStrategy
  • Object
show all
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

Methods included from Database::DynamicModelHelpers

#define_batchable_model, #each_batch, #each_batch_range

Methods inherited from BaseStrategy

#initialize

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