class DbBlaster::Chunker
Chunk the records into sizes < Configuration.max_message_size_in_kilobytes
yielding the chunks inline to the provided block If the records' size is already less than Configuration.max_message_size_in_kilobytes
, all the records are yielded to the provided block
Attributes
block_on_chunk[R]
current_chunk[R]
current_chunk_size[R]
records[R]
source_table[R]
Public Class Methods
chunk(source_table, records, &block)
click to toggle source
# File lib/db_blaster/chunker.rb, line 19 def self.chunk(source_table, records, &block) new(source_table, records, &block).chunk end
new(source_table, records, &block_on_chunk)
click to toggle source
# File lib/db_blaster/chunker.rb, line 11 def initialize(source_table, records, &block_on_chunk) @source_table = source_table @records = records @block_on_chunk = block_on_chunk @current_chunk_size = 0 @current_chunk = [] end
Public Instance Methods
breakup_records()
click to toggle source
# File lib/db_blaster/chunker.rb, line 45 def breakup_records records.each(&method(:process_record)) block_on_chunk.call(current_chunk) if current_chunk.length.positive? end
chunk()
click to toggle source
# File lib/db_blaster/chunker.rb, line 23 def chunk return if yield_if_records_acceptable? breakup_records end
max_bytes()
click to toggle source
# File lib/db_blaster/chunker.rb, line 36 def max_bytes @max_bytes ||= 1000 * max_kilobytes end
max_kilobytes()
click to toggle source
# File lib/db_blaster/chunker.rb, line 40 def max_kilobytes DbBlaster.configuration.max_message_size_in_kilobytes || DbBlaster.configuration.class::DEFAULT_MAX_MESSAGE_SIZE_IN_KILOBYTES end
yield_if_records_acceptable?()
click to toggle source
# File lib/db_blaster/chunker.rb, line 29 def yield_if_records_acceptable? return if records.to_json.size >= max_bytes block_on_chunk.call(records) true end
Private Instance Methods
blow_up_one_record_too_large(record)
click to toggle source
# File lib/db_blaster/chunker.rb, line 70 def blow_up_one_record_too_large(record) block_on_chunk.call(current_chunk) if current_chunk.length.positive? raise OneRecordTooLargeError.new(source_table: source_table, record: record, max_kilobytes: max_kilobytes) end
process_record(record)
click to toggle source
# File lib/db_blaster/chunker.rb, line 52 def process_record(record) record_size = record.to_json.size @current_chunk_size += record_size if current_chunk_size < max_bytes current_chunk << record elsif record_size >= max_bytes blow_up_one_record_too_large(record) else yield_chunk(record, record_size) end end
yield_chunk(record, record_size)
click to toggle source
# File lib/db_blaster/chunker.rb, line 64 def yield_chunk(record, record_size) block_on_chunk.call(current_chunk) @current_chunk_size = record_size @current_chunk = [record] end