Sha256: 5fa35009f3f6079937df9a6e8ee0d03a614cb887a29b76e660a16a78a0d5be71

Contents?: true

Size: 1.2 KB

Versions: 7

Compression:

Stored size: 1.2 KB

Contents

class Cranium::DimensionManager

  attr_reader :rows



  def self.for(table_name, key_fields)
    @instances ||= {}
    @instances[[table_name, key_fields]] ||= self.new table_name, key_fields
  end



  def initialize(table_name, key_fields)
    @table_name, @key_fields = table_name, key_fields
    @rows = []

    Cranium.application.after_import { flush }
  end



  def insert(target_key, row)
    raise ArgumentError, "Required attribute '#{target_key}' missing" unless row.has_key? target_key

    @rows << resolve_sequence_values(row)
    row[target_key]
  end



  def create_cache_for_field(value_field)
    fields = @key_fields + [value_field]
    to_multi_key_cache(db.select(*fields).group(*fields).map &:values)
  end



  def flush
    db.multi_insert(@rows, slice: INSERT_BATCH_SIZE) unless @rows.empty?
    @rows = []
  end



  private

  INSERT_BATCH_SIZE = 100_000.freeze



  def to_multi_key_cache(table_data)
    Hash[table_data.map { |row| [row[0..-2], row.last] }]
  end



  def resolve_sequence_values(row)
    row.each do |key, value|
      row[key] = value.next_value if value.is_a? Cranium::Transformation::Sequence
    end
  end



  def db
    Cranium::Database.connection[@table_name]
  end

end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
cranium-0.8.1 lib/cranium/dimension_manager.rb
cranium-0.8 lib/cranium/dimension_manager.rb
cranium-0.7 lib/cranium/dimension_manager.rb
cranium-0.6.1 lib/cranium/dimension_manager.rb
cranium-0.5 lib/cranium/dimension_manager.rb
cranium-0.4.3 lib/cranium/dimension_manager.rb
cranium-0.4.2 lib/cranium/dimension_manager.rb