Class: Rimportor::ActiveRecord::Import

Inherits:
Object
  • Object
show all
Defined in:
lib/rimportor/active_record/import.rb

Instance Method Summary collapse

Constructor Details

#initialize(bulk, adapter, opts = {}) ⇒ Import

Returns a new instance of Import.



7
8
9
10
11
12
13
14
15
# File 'lib/rimportor/active_record/import.rb', line 7

def initialize(bulk, adapter, opts = {})
  @bulk = bulk
  @adapter = adapter
  @before_callbacks = !!opts[:before_callbacks]
  @after_callbacks = !!opts[:after_callbacks]
  @validate_bulk = !!opts[:validate_bulk]
  @batch_size = opts[:batch_size] ? opts[:batch_size] : 1000
  @threads = Rimportor.configuration.threads
end

Instance Method Details

#exec_statementObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rimportor/active_record/import.rb', line 53

def exec_statement
  begin
    run_validations if @validate_bulk
    run_before_callbacks if @before_callbacks
    @bulk.each_slice(@batch_size) do |batch|
      @adapter.exec_insert(import_statement(batch))
    end
    run_after_callbacks if @after_callbacks
    true
  rescue => e
    puts "Error importing the bulk. Reason #{e.message}"
    false
  end
end

#execute_callbacks(element, before_or_after) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/rimportor/active_record/import.rb', line 36

def execute_callbacks(element, before_or_after)
  case before_or_after
    when :before
      element.run_callbacks(:save) { false }
    when :after
      element.run_callbacks(:save) { true }
  end
end

#import_statement(batch) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/rimportor/active_record/import.rb', line 45

def import_statement(batch)
  insert_statement = SqlBuilder.new(batch.first).full_insert_statement
  result = ::Parallel.map(batch.drop(1), in_threads: @threads) do |element|
    @adapter.exec_in_pool { SqlBuilder.new(element).partial_insert_statement.gsub('VALUES', '') }
  end
  [insert_statement, result]
end

#run_after_callbacksObject



23
24
25
26
27
# File 'lib/rimportor/active_record/import.rb', line 23

def run_after_callbacks
  ::Parallel.map(@bulk, in_threads: @threads) do |element|
    execute_callbacks(element, :after)
  end
end

#run_before_callbacksObject



17
18
19
20
21
# File 'lib/rimportor/active_record/import.rb', line 17

def run_before_callbacks
  ::Parallel.map(@bulk, in_threads: @threads) do |element|
    execute_callbacks(element, :before)
  end
end

#run_validationsObject



29
30
31
32
33
34
# File 'lib/rimportor/active_record/import.rb', line 29

def run_validations
  validation_result = ::Parallel.map(@bulk, in_threads: @threads) do |element|
    element.valid?
  end.all?
  raise Rimportor::Error::BulkValidation.new("Your bulk is not valid") unless validation_result
end