Class: Remi::DataSource::Salesforce

Inherits:
Object
  • Object
show all
Includes:
Remi::DataSource, DataStub
Defined in:
lib/remi/cucumber/data_source.rb,
lib/remi/data_source/salesforce.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Remi::DataSource

#feild_symbolizer

Methods included from Remi::DataSubject

#df=

Methods included from DataStub

#empty_stub_df, #stub_df, #stub_row_array, #stub_values

Constructor Details

#initialize(fields: {}, object:, query:, credentials:, api: :bulk, logger: Remi::Settings.logger) ⇒ Salesforce

Returns a new instance of Salesforce.



6
7
8
9
10
11
12
13
# File 'lib/remi/data_source/salesforce.rb', line 6

def initialize(fields: {}, object:, query:, credentials:, api: :bulk, logger: Remi::Settings.logger)
  @fields = fields
  @sfo = object
  @query = query
  @credentials = credentials
  @api = api
  @logger = logger
end

Instance Attribute Details

#fieldsObject

Returns the value of attribute fields.



15
16
17
# File 'lib/remi/data_source/salesforce.rb', line 15

def fields
  @fields
end

#raw_resultObject

Returns the value of attribute raw_result.



16
17
18
# File 'lib/remi/data_source/salesforce.rb', line 16

def raw_result
  @raw_result
end

Instance Method Details

#check_for_errors(sf_result) ⇒ Object



29
30
31
32
33
# File 'lib/remi/data_source/salesforce.rb', line 29

def check_for_errors(sf_result)
  sf_result['batches'].each do |batch|
    raise "Error with batch #{batch['id']} - #{batch['state']}: #{batch['stateMessage']}" unless batch['state'].first == 'Completed'
  end
end

#dfObject



82
83
84
# File 'lib/remi/data_source/salesforce.rb', line 82

def df
  @dataframe ||= to_dataframe
end

#extractObject



22
23
24
25
26
27
# File 'lib/remi/data_source/salesforce.rb', line 22

def extract
  @raw_result = sf_bulk.query(@sfo, @query, 10000)

  check_for_errors(@raw_result)
  @raw_result
end

#field_symbolizerObject



18
19
20
# File 'lib/remi/data_source/salesforce.rb', line 18

def field_symbolizer
  Remi::FieldSymbolizers[:salesforce]
end

#restforce_clientObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/remi/data_source/salesforce.rb', line 41

def restforce_client
  @restforce_client ||= begin
    client = Restforce.new(@credentials)

    #run a dummy query to initiate a connection. Workaround for Bulk API problem
    # https://github.com/yatish27/salesforce_bulk_api/issues/33
    client.query('SELECT Id FROM Contact LIMIT 1')
    client
  end
end

#sf_bulkObject



52
53
54
# File 'lib/remi/data_source/salesforce.rb', line 52

def sf_bulk
  @sf_bulk ||= SalesforceBulkApi::Api.new(restforce_client).tap { |o| o.connection.set_status_throttle(5) }
end

#to_dataframeObject



56
57
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/remi/data_source/salesforce.rb', line 56

def to_dataframe
  @logger.info "Converting salesforce query results to a dataframe"

  hash_array = {}
  raw_result['batches'].each do |batch|
    next unless batch['response']

    batch['response'].each do |record|
      record.each do |field, value|
        next if ['xsi:type','type'].include? field
        (hash_array[field.to_sym] ||= []) << case value.first
          when Hash
            value.first["xsi:nil"] == "true" ? nil : value.first
          else
            value.first
          end
      end
    end

    # delete raw result at end of processing to free memory
    batch['response'] = nil
  end

  Daru::DataFrame.new hash_array, order: hash_array.keys
end