Class: AWS::DynamoDB::BatchGet

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/aws/dynamo_db/batch_get.rb

Overview

A utility class for configuring a list of tables, attributes and items to request information for.

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ BatchGet

Returns a new instance of BatchGet.



29
30
31
32
# File 'lib/aws/dynamo_db/batch_get.rb', line 29

def initialize options = {}
  super(options)
  @request_items = {}
end

Instance Method Details

#each(&block) ⇒ nil

Returns:

  • (nil)


135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/aws/dynamo_db/batch_get.rb', line 135

def each &block

  options = { :request_items => @request_items }

  begin

    response = client.batch_get_item(options)

    response.data['Responses'].each_pair do |table_name,details|
      details['Items'].each do |hash_data|
        attributes = values_from_response_hash(hash_data)
        yield(table_name, attributes)
      end
    end

    options[:request_items] = convert_unprocessed_keys(response)

  end while options[:request_items]

  nil

end

#each_attributesObject

Yields only attribute hashes. This removes the outer hash that normally provides the :table_name and :attributes keys. This is useful when your batch get requested items from a single table.



161
162
163
164
165
# File 'lib/aws/dynamo_db/batch_get.rb', line 161

def each_attributes
  each do |table_name, attributes|
    yield(attributes)
  end
end

#items(attributes, *items) ⇒ Object

Specify a list of Item objects to batch fetch attributes for. The table name is retrieved from the items objects, this means the items do not need to belong to the same table.

Parameters:

  • attributes (Symbol, String, Array<String>)

    The list of attributes to fetch. If you want to load ALL attributes for the named items, then pass the symbol :all.

    # get all attributes
    batch_get.table('mytable', :all, items)
    
    # get one attribute for each item
    batch_get.table('mytable', ['name'], items)
    
    # get a list of attributes for each item
    batch_get.table('mytable', ['name', 'size'], items)
    
  • items (Item)

    One or more Item objects to fetch attributes for. These items may come from any number of different tables.



128
129
130
131
132
# File 'lib/aws/dynamo_db/batch_get.rb', line 128

def items attributes, *items
  [items].flatten.each do |item|
    self.table(item.table, attributes, [item])
  end
end

#table(table, attributes, items) ⇒ nil

Add a list of items to fetch in this batch.

Parameters:

  • table (Table, String)

    The name of the table to fetch attributes from.

  • attributes (Symbol, String, Array<String>)

    The list of attributes to fetch. If you want to load ALL attributes for the named items, then pass the symbol :all.

    # get all attributes
    batch_get.table('mytable', :all, items)
    
    # get one attribute for each item
    batch_get.table('mytable', ['name'], items)
    
    # get a list of attributes for each item
    batch_get.table('mytable', ['name', 'size'], items)
    
  • items (Array<Item,Array>)

    One or more items to fetch attributes for. Each attribute should be one of the following:

    • an Item object

    • a hash key value

    • a hash key value and a range key value

    You must provide both the hash key and range key values if the table schema has both.

    batch_get.table('mytable', :all, [%w(hk1 rk1), %w(hk1 rk2), ...])
    

Returns:

  • (nil)


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/aws/dynamo_db/batch_get.rb', line 66

def table table, attributes, items

  table = table.is_a?(Table) ? table.name : table.to_s

  attributes = attributes == :all ? nil : [attributes].flatten

  keys = items.collect do |item|
    case item
    when Item then item_key_hash(item)
    when Array 
      {
        :hash_key_element => format_attribute_value(item[0]),
        :range_key_element => format_attribute_value(item[1]),
      }
    else
      { :hash_key_element => format_attribute_value(item) }
    end
  end

  ## ensure we don't receive 2 different lists of attributes for
  ## the same table

  if 
    @request_items.has_key?(table) and 
    @request_items[table][:attributes_to_get] != attributes
  then
    msg = "When batch getting attributes, you may only provide " +
      "1 list of attributes per table, but the `#{table}` table " +
      "has received reqeusts for 2 different sets of attributes"
    raise ArgumentError, msg
  end

  ## merge attributes and items with the request items

  @request_items[table] ||= { :keys => [] } 
  @request_items[table][:attributes_to_get] = attributes if attributes
  @request_items[table][:keys] += keys

  nil

end