class ActiveRecord::Import::ValueSetsBytesParser

Attributes

max_bytes[R]
reserved_bytes[R]
values[R]

Public Class Methods

new(values, options) click to toggle source
# File lib/activerecord-import/value_sets_parser.rb, line 22
def initialize(values, options)
  @values = values
  @reserved_bytes = options[:reserved_bytes] || 0
  @max_bytes = options.fetch(:max_bytes) { default_max_bytes }
end
parse(values, options) click to toggle source
# File lib/activerecord-import/value_sets_parser.rb, line 18
def self.parse(values, options)
  new(values, options).parse
end

Public Instance Methods

parse() click to toggle source
# File lib/activerecord-import/value_sets_parser.rb, line 28
def parse
  value_sets = []
  arr = []
  current_size = 0
  values.each_with_index do |val, i|
    comma_bytes = arr.size
    insert_size = reserved_bytes + val.bytesize

    if insert_size > max_bytes
      raise ValueSetTooLargeError.new("#{insert_size} bytes exceeds the max allowed for an insert [#{@max_bytes}]", insert_size)
    end

    bytes_thus_far = reserved_bytes + current_size + val.bytesize + comma_bytes
    if bytes_thus_far <= max_bytes
      current_size += val.bytesize
      arr << val
    else
      value_sets << arr
      arr = [val]
      current_size = val.bytesize
    end

    # if we're on the last iteration push whatever we have in arr to value_sets
    value_sets << arr if i == (values.size - 1)
  end

  value_sets
end

Private Instance Methods

default_max_bytes() click to toggle source
# File lib/activerecord-import/value_sets_parser.rb, line 59
def default_max_bytes
  values_in_bytes = values.sum(&:bytesize)
  comma_separated_bytes = values.size - 1
  reserved_bytes + values_in_bytes + comma_separated_bytes
end