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