class Mara::Persistence

@private

Perform calls to DynamoDB for saving/updating/deleting

@author Maddie Schipper @since 1.0.0

Constants

CreateRequest

@private

A wrapper for a create request.

@!attribute [rw] record

The record hash to be created.

@return [Hash]

@author Maddie Schipper @since 1.0.0

DestroyRequest

@private

A wrapper for a destroy request.

@!attribute [rw] record

The record hash to be destroyed.

@return [Hash]

@author Maddie Schipper @since 1.0.0

Response

@private The response for a save operation.

@!attribute [r] consumed_capacity

The total consumed capacity for the request.

@return [Float]

@!attribute [r] operation_count

The total number of API calls required to perform the operation.

@return [Integer]

@author Maddie Schipper @since 1.0.0

Public Class Methods

delete_model(item) click to toggle source

Delete an item.

@param item [Hash] The item to be deleted.

@return [true, false]

# File lib/mara/persistence.rb, line 135
def delete_model(item)
  delete = DestroyRequest.new(item)
  response = perform_requests(
     Mara::Client.shared,
     Mara.config.dynamodb.table_name,
    [delete]
  )
  !response.nil?
end
delete_model!(item) click to toggle source

Delete an item.

@see .delete_model

@param item [Hash] The item to be deleted.

@raise Error If the delete operation fails.

@return [void]

# File lib/mara/persistence.rb, line 155
def delete_model!(item)
  return if delete_model(item)

  raise Error, 'Failed to delete!'
end
perform_requests(client, table_name, requests, group_size = 10) click to toggle source

Perform a batch of save requests.

# File lib/mara/persistence.rb, line 163
def perform_requests(client, table_name, requests, group_size = 10)
  results =  Mara.instrument('save_batch_records', requests: requests, table_name: table_name) do
    requests.each_slice(group_size).map do |sub_requests|
      _perform_requests(client, table_name, sub_requests)
    end
  end
  Response.new(
    results.map(&:consumed_capacity).sum,
    results.map(&:operation_count).sum
  )
end
save_model(item) click to toggle source

Perform a save on a item.

@param item [Hash] The item to be saved.

@return [true, false]

# File lib/mara/persistence.rb, line 103
def save_model(item)
  create = CreateRequest.new(item)
  response = perform_requests(
     Mara::Client.shared,
     Mara.config.dynamodb.table_name,
    [create]
  )
  !response.nil?
end
save_model!(item) click to toggle source

Perform a save on the a item.

@see .save_model

@param item [Hash] The item to be saved.

@raise Error If the save operation fails.

@return [void]

# File lib/mara/persistence.rb, line 123
def save_model!(item)
  return if save_model(item)

  raise Error, 'Failed to save!'
end

Private Class Methods

_base_batch_write_item_params(table_name) { || ... } click to toggle source
# File lib/mara/persistence.rb, line 177
def _base_batch_write_item_params(table_name)
  params = {
    return_consumed_capacity: 'TOTAL',
    return_item_collection_metrics: 'SIZE',
    request_items: {}
  }
  if block_given?
    params[:request_items][table_name] = yield
  end
  params
end
_perform_requests(client, table_name, requests) click to toggle source
# File lib/mara/persistence.rb, line 189
def _perform_requests(client, table_name, requests)
  params = _base_batch_write_item_params(table_name) { requests.map(&:as_json) }
  response =  Mara.instrument('save_batch_record_operation', requests: requests, table_name: table_name) do
    client.batch_write_item(params)
  end

  cc = calculate_consumed_capacity(response.consumed_capacity, table_name)

  Response.new(
    cc,
    1
  )
end