You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.0 KiB
46 lines
1.0 KiB
# frozen_string_literal: true |
|
|
|
module ActiveRecord |
|
module Batches |
|
def pluck_each(*column_names) |
|
relation = self |
|
|
|
options = column_names.extract_options! |
|
|
|
flatten = column_names.size == 1 |
|
batch_limit = options[:batch_limit] || 1_000 |
|
order = options[:order] || :asc |
|
|
|
column_names.unshift(primary_key) |
|
|
|
cursor = Array(primary_key) |
|
|
|
relation = relation.reorder(build_batch_orders(cursor, order).to_h).limit(batch_limit) |
|
relation.skip_query_cache! |
|
|
|
batch_relation = relation |
|
|
|
loop do |
|
batch = batch_relation.pluck(*column_names) |
|
|
|
break if batch.empty? |
|
|
|
primary_key_offset = batch.last[0] |
|
|
|
batch.each do |record| |
|
if flatten |
|
yield record[1] |
|
else |
|
yield record[1..] |
|
end |
|
end |
|
|
|
break if batch.size < batch_limit |
|
|
|
batch_relation = relation.where( |
|
predicate_builder[primary_key, primary_key_offset, order == :desc ? :lt : :gt] |
|
) |
|
end |
|
end |
|
end |
|
end
|
|
|