Class: SalesforceBulk2::Batch

Inherits:
Object
  • Object
show all
Defined in:
lib/salesforce_bulk2/batch.rb

Constant Summary collapse

@@batch_size =
10000

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(job, data = nil) ⇒ Batch

Returns a new instance of Batch.



33
34
35
36
37
38
39
# File 'lib/salesforce_bulk2/batch.rb', line 33

def initialize job, data = nil
  @job = job
  @job_id = job.id
  @client = job.client

  update(data) if data
end

Instance Attribute Details

#apex_processing_timeObject (readonly)

Returns the value of attribute apex_processing_time.



6
7
8
# File 'lib/salesforce_bulk2/batch.rb', line 6

def apex_processing_time
  @apex_processing_time
end

#api_active_processing_timeObject (readonly)

Returns the value of attribute api_active_processing_time.



7
8
9
# File 'lib/salesforce_bulk2/batch.rb', line 7

def api_active_processing_time
  @api_active_processing_time
end

#batch_sizeObject

Returns the value of attribute batch_size.



4
5
6
# File 'lib/salesforce_bulk2/batch.rb', line 4

def batch_size
  @batch_size
end

#completed_atObject (readonly)

Returns the value of attribute completed_at.



8
9
10
# File 'lib/salesforce_bulk2/batch.rb', line 8

def completed_at
  @completed_at
end

#created_atObject (readonly)

Returns the value of attribute created_at.



9
10
11
# File 'lib/salesforce_bulk2/batch.rb', line 9

def created_at
  @created_at
end

#dataObject (readonly)

Returns the value of attribute data.



16
17
18
# File 'lib/salesforce_bulk2/batch.rb', line 16

def data
  @data
end

#failed_recordsObject (readonly)

Returns the value of attribute failed_records.



10
11
12
# File 'lib/salesforce_bulk2/batch.rb', line 10

def failed_records
  @failed_records
end

#idObject (readonly)

Returns the value of attribute id.



11
12
13
# File 'lib/salesforce_bulk2/batch.rb', line 11

def id
  @id
end

#job_idObject (readonly)

Returns the value of attribute job_id.



12
13
14
# File 'lib/salesforce_bulk2/batch.rb', line 12

def job_id
  @job_id
end

#processed_recordsObject (readonly)

Returns the value of attribute processed_records.



13
14
15
# File 'lib/salesforce_bulk2/batch.rb', line 13

def processed_records
  @processed_records
end

#session_idObject

Returns the value of attribute session_id.



3
4
5
# File 'lib/salesforce_bulk2/batch.rb', line 3

def session_id
  @session_id
end

#stateObject (readonly)

Returns the value of attribute state.



14
15
16
# File 'lib/salesforce_bulk2/batch.rb', line 14

def state
  @state
end

#total_processing_timeObject (readonly)

Returns the value of attribute total_processing_time.



15
16
17
# File 'lib/salesforce_bulk2/batch.rb', line 15

def total_processing_time
  @total_processing_time
end

Class Method Details

.batch_sizeObject



20
21
22
# File 'lib/salesforce_bulk2/batch.rb', line 20

def self.batch_size
  @@batch_size
end

.batch_size=(batch_size) ⇒ Object



24
25
26
# File 'lib/salesforce_bulk2/batch.rb', line 24

def self.batch_size= batch_size
  @@batch_size = batch_size
end

.create(job, data) ⇒ Object



41
42
43
44
# File 'lib/salesforce_bulk2/batch.rb', line 41

def self.create job, data
  batch = Batch.new(job)
  batch.execute(data)
end

.find(job, batch_id) ⇒ Object



46
47
48
49
50
51
# File 'lib/salesforce_bulk2/batch.rb', line 46

def self.find job, batch_id
  batch = Batch.new(job)
  batch.id = batch_id
  batch.refresh
  batch
end

Instance Method Details

#completed?Boolean

Returns:

  • (Boolean)


161
162
163
# File 'lib/salesforce_bulk2/batch.rb', line 161

def completed?
  state? 'Completed'
end

#errors?Boolean

Returns:

  • (Boolean)


177
178
179
# File 'lib/salesforce_bulk2/batch.rb', line 177

def errors?
  @number_records_failed > 0
end

#execute(data) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/salesforce_bulk2/batch.rb', line 58

def execute data
  raise Exception.new "Already executed" if @data

  @data = data
  body = data

  if data.is_a?(Array)
    raise ArgumentError, "Batch data set exceeds #{@@batch_size} record limit by #{data.length - @@batch_size}" if data.length > @@batch_size
    raise ArgumentError, "Batch data set is empty" if data.length < 1
    
    keys = data.first.keys
    body = keys.to_csv
    
    data.each do |item|
      item_values = keys.map { |key| item[key] }
      body += item_values.to_csv
    end
  end

  # Despite the content for a query operation batch being plain text we 
  # still have to specify CSV content type per API docs.
  @client.http_post_xml("job/#{@job_id}/batch", body, "Content-Type" => "text/csv; charset=UTF-8")
end

#failed?Boolean

Returns:

  • (Boolean)


165
166
167
# File 'lib/salesforce_bulk2/batch.rb', line 165

def failed?
  state? 'Failed'
end

#finished?Boolean

Returns:

  • (Boolean)


169
170
171
# File 'lib/salesforce_bulk2/batch.rb', line 169

def finished?
  completed? or finished?
end

#get_query_result(batch_id, result_id) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/salesforce_bulk2/batch.rb', line 120

def get_query_result(batch_id, result_id)
  headers = {"Content-Type" => "text/csv; charset=UTF-8"}
  response = @client.http_get("job/#{@job_id}/batch/#{batch_id}/result/#{result_id}", headers)
  
  lines = response.body.lines.to_a
  headers = CSV.parse_line(lines.shift).collect { |header| header.to_sym }
  
  result = []
  
  #CSV.parse(lines.join, :headers => headers, :converters => [:all, lambda{|s| s.to_b if s.kind_of? String }]) do |row|
  CSV.parse(lines.join, :headers => headers) do |row|
    result << Hash[row.headers.zip(row.fields)]
  end
  
  result
end

#get_requestObject



82
83
84
85
86
# File 'lib/salesforce_bulk2/batch.rb', line 82

def get_request
  response = @client.http_get("job/#{@job_id}/batch/#{@id}/request")

  CSV.parse(response.body, :headers => true)
end

#get_resultObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/salesforce_bulk2/batch.rb', line 88

def get_result
  response = @client.http_get("job/#{@job_id}/batch/#{@id}/result")

  #Query Result
  if response.body =~ /<.*?>/m
    result = XmlSimple.xml_in(response.body)
    
    if result['result'].present?
      results = get_query_result(@id, result['result'].first)
      
      collection = QueryResultCollection.new(self, @id, result['result'].first, result['result'])
      collection.replace(results)
    end

  #Batch Result
  else
    results = BatchResultCollection.new
    requests = get_request
    
    i = 0
    CSV.parse(response.body, :headers => true) do |row|
      result = BatchResult.new(row[0], row[1].to_b, row[2].to_b, row[3])
      result['request'] = requests[i]
      results << result

      i += 1
    end
    
    return results
  end
end

#in_progress?Boolean

State Information ###

Returns:

  • (Boolean)


153
154
155
# File 'lib/salesforce_bulk2/batch.rb', line 153

def in_progress?
  state? 'InProgress'
end

#queued?Boolean

Returns:

  • (Boolean)


157
158
159
# File 'lib/salesforce_bulk2/batch.rb', line 157

def queued?
  state? 'Queued'
end

#refreshObject



181
182
183
184
# File 'lib/salesforce_bulk2/batch.rb', line 181

def refresh
  xml_data = @client.http_get_xml("job/#{@job_id}/batch/#{@batch_id}")
  update(xml_data)
end

#state?(value) ⇒ Boolean

Returns:

  • (Boolean)


173
174
175
# File 'lib/salesforce_bulk2/batch.rb', line 173

def state?(value)
  self.state.present? && self.state.casecmp(value) == 0
end

#update(data) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/salesforce_bulk2/batch.rb', line 137

def update(data)
  @data = data

  @id = data['id']
  @job_id = data['jobId']
  @state = data['state']
  @created_at = DateTime.parse(data['createdDate']) rescue nil
  @completed_at = DateTime.parse(data['systemModstamp']) rescue nil
  @processed_records = data['numberRecordsProcessed'].to_i
  @failed_records = data['numberRecordsFailed'].to_i
  @total_processing_time = data['totalProcessingTime'].to_i
  @api_active_processing_time = data['apiActiveProcessingTime'].to_i
  @apex_processing_time = data['apex_processing_time'].to_i
end