class Dynamoid::AdapterPlugin::AwsSdkV3::Scan

Attributes

client[R]
conditions[R]
options[R]
table[R]

Public Class Methods

new(client, table, conditions = {}, options = {}) click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 14
def initialize(client, table, conditions = {}, options = {})
  @client = client
  @table = table
  @conditions = conditions
  @options = options
end

Public Instance Methods

call() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 21
def call
  request = build_request

  Enumerator.new do |yielder|
    api_call = lambda do |req|
      client.scan(req).tap do |response|
        yielder << response
      end
    end

    middlewares = Middleware::Backoff.new(
      Middleware::StartKey.new(
        Middleware::Limit.new(api_call, record_limit: record_limit, scan_limit: scan_limit)
      )
    )

    catch :stop_pagination do
      loop do
        middlewares.call(request)
      end
    end
  end
end

Private Instance Methods

attributes_to_get() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 88
def attributes_to_get
  return if options[:project].nil?

  options[:project].map(&:to_s)
end
build_request() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 47
def build_request
  request = options.slice(
    :consistent_read,
    :exclusive_start_key,
    :select,
    :index_name
  ).compact

  # Deal with various limits and batching
  batch_size = options[:batch_size]
  limit = [record_limit, scan_limit, batch_size].compact.min

  request[:limit]             = limit if limit
  request[:table_name]        = table.name
  request[:scan_filter]       = scan_filter
  request[:attributes_to_get] = attributes_to_get

  request
end
record_limit() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 67
def record_limit
  options[:record_limit]
end
scan_filter() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 75
def scan_filter
  conditions.reduce({}) do |result, (attr, cond)|
    condition = {
      comparison_operator: AwsSdkV3::FIELD_MAP[cond.keys[0]],
      attribute_value_list: AwsSdkV3.attribute_value_list(AwsSdkV3::FIELD_MAP[cond.keys[0]], cond.values[0].freeze)
    }
    # nil means operator doesn't require attribute value list
    conditions.delete(:attribute_value_list) if conditions[:attribute_value_list].nil?
    result[attr] = condition
    result
  end
end
scan_limit() click to toggle source
# File lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb, line 71
def scan_limit
  options[:scan_limit]
end