class Yasd::Dataloader

Constants

BATCH_SIZE

Attributes

client[RW]

Public Class Methods

new(config) click to toggle source
# File lib/yasd/dataloader.rb, line 15
def initialize(config)
  @client = Soapforce::Client.new
  @client.authenticate(username: config.username, password: config.password)
  @success_logger = Logger.new(config.success_log_path || "./results/#{Time.now.strftime("%Y-%m-%d")}_success.log")
  @error_logger = Logger.new(config.success_log_path || "./results/#{Time.now.strftime("%Y-%m-%d")}_error.log")
  @mapper = Mapper.new(config.mapping)
  @converter = Converter.new(config.convert)
  @batch_size = config.batch_size || BATCH_SIZE
end

Public Instance Methods

delete(object, filename) click to toggle source
# File lib/yasd/dataloader.rb, line 77
def delete(object, filename)
  delete_records = []
  total_record_size = 0

  CSV.foreach(filename, headers: true) do |data|
    total_record_size += 1
    delete_records << data[:Id]
    if delete_records.length == @batch_size
      delete_results = client.delete(object, delete_records)
      log(delete_results)
      delete_records = []
    end
  end
  if delete_records.length > 0
    delete_results = client.delete(object, delete_records)
    log(delete_results)
  end
end
export(query) click to toggle source
# File lib/yasd/dataloader.rb, line 25
def export(query)
  query_result = client.query(query)
  return if query_result.size == 0

  CSV do |csv_out|
    header = create_csv_header(query_result)
    csv_out << header

    query_result.each do |record|
      csv_out << header.map {|field| record[field] }
    end
  end
end
insert(object, filename) click to toggle source
# File lib/yasd/dataloader.rb, line 39
def insert(object, filename)
  insert_records = []
  total_record_size = 0

  CSV.foreach(filename, headers: true) do |data|
    total_record_size += 1
    insert_records << convert_and_mapping(data)
    if insert_records.length == @batch_size
      insert_results = client.create!(object, insert_records)
      log(insert_results)
      insert_records = []
    end
  end
  if insert_records.length > 0
    insert_results = client.create!(object, insert_records)
    log(insert_results)
  end
end
update(object, filename) click to toggle source
# File lib/yasd/dataloader.rb, line 58
def update(object, filename)
  update_records = []
  total_record_size = 0

  CSV.foreach(filename, headers: true) do |data|
    total_record_size += 1
    update_records << convert_and_mapping(data)
    if update_records.length == @batch_size
      update_results = client.update(object, update_records)
      log(update_results)
      update_records = []
    end
  end
  if update_records.length > 0
    update_results = client.update(object, update_records)
    log(update_results)
  end
end
upsert(object, upsert_key, filename) click to toggle source
# File lib/yasd/dataloader.rb, line 96
def upsert(object, upsert_key, filename)
  upsert_records = []
  total_record_size = 0

  CSV.foreach(filename, headers: true) do |data|
    total_record_size += 1
    upsert_records << convert_and_mapping(data)
    if upsert_records.length == @batch_size
      upsert_results = client.upsert(object, upsert_key, upsert_records)
      log(upsert_results)
      upsert_records = []
    end
  end
  if upsert_records.length > 0
    upsert_results = client.upsert(object, upsert_key, upsert_records)
    log(upsert_results)
  end
end

Private Instance Methods

convert_and_mapping(data) click to toggle source
# File lib/yasd/dataloader.rb, line 127
def convert_and_mapping(data)
  converted_data = @converter.call(data)
  @mapper.call(converted_data)
end
create_csv_header(query_result) click to toggle source
# File lib/yasd/dataloader.rb, line 132
def create_csv_header(query_result)
  query_result.first.to_h.reject {|k, _v| %i[type @xsi:type].include?(k) }.keys
end
log(results) click to toggle source
# File lib/yasd/dataloader.rb, line 117
def log(results)
  results.each do |result|
    if result[:success]
      @success_logger.info(result.values.join(','))
    else
      @error_logger.info(result.values.join(','))
    end
  end
end