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