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

#dfObject



73
74
75
# File 'lib/remi/data_source/salesforce.rb', line 73

def df
  @dataframe ||= to_dataframe
end

#extractObject



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

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

#field_symbolizerObject



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

def field_symbolizer
  Remi::FieldSymbolizers[:salesforce]
end

#restforce_clientObject



32
33
34
35
36
37
38
39
40
41
# File 'lib/remi/data_source/salesforce.rb', line 32

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



43
44
45
# File 'lib/remi/data_source/salesforce.rb', line 43

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

#to_dataframeObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/remi/data_source/salesforce.rb', line 47

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