Module: AWS::Core::Collection
- Includes:
- Enumerable
- Defined in:
- lib/aws/core/collection.rb,
lib/aws/core/collection/simple.rb,
lib/aws/core/collection/limitable.rb
Overview
Different Collection Types in AWS
The Collection module acts as a namespace and base implementation for the primary collection types in AWS:
Each AWS service allows provides a method to enumerate resources.
Defined Under Namespace
Instance Method Summary collapse
-
#each(options = {}, &block) ⇒ nil_or_next_token
Yields once for every item in this collection.
-
#each_batch(options = {}, &block) ⇒ nil_or_next_token
Yields items from this collection in batches.
-
#enum(options = {}) ⇒ Enumerable::Enumerator
(also: #enumerator)
Use this method when you want to call a method provided by Enumerable, but you need to pass options:.
-
#first(options = {}) ⇒ item_or_nil
Returns the first item from this collection.
-
#in_groups_of(size, options = {}) {|group| ... } ⇒ nil_or_next_token
Yields items from this collection in groups of an exact size (except for perhaps the last group).
-
#page(options = {}) ⇒ Object
Returns a single page of results in a kind-of array (PageResult).
Instance Method Details
#each(options = {}, &block) ⇒ nil_or_next_token
63 64 65 66 67 |
# File 'lib/aws/core/collection.rb', line 63 def each = {}, &block each_batch() do |batch| batch.each(&block) end end |
#each_batch(options = {}, &block) ⇒ nil_or_next_token
If you require fixed size batches, see #in_groups_of.
Yields items from this collection in batches.
collection.each_batch do |batch|
batch.each do |item|
# ...
end
end
Variable Batch Sizes
Each AWS service has its own rules on how it returns results. Because of this batch size may very based on:
-
Service limits (e.g. S3 limits keys to 1000 per response)
-
The size of response objects (SimpleDB limits responses to 1MB)
-
Time to process the request
Because of these variables, batch sizes may not be consistent for a single collection. Each batch represents all of the items returned in a single resopnse.
100 101 102 |
# File 'lib/aws/core/collection.rb', line 100 def each_batch = {}, &block raise NotImplementedError end |
#enum(options = {}) ⇒ Enumerable::Enumerator Also known as: enumerator
Use this method when you want to call a method provided by Enumerable, but you need to pass options:
# raises an error because collect does not accept arguments
collection.collect(:limit => 10) {|i| i.name }
# not an issue with the enum method
collection.enum(:limit => 10).collect(&:name)
120 121 122 |
# File 'lib/aws/core/collection.rb', line 120 def enum = {} Enumerator.new(self, :each, ) end |
#first(options = {}) ⇒ item_or_nil
Returns the first item from this collection.
130 131 132 |
# File 'lib/aws/core/collection.rb', line 130 def first = {} enum(.merge(:limit => 1)).first end |
#in_groups_of(size, options = {}) {|group| ... } ⇒ nil_or_next_token
Yields items from this collection in groups of an exact size (except for perhaps the last group).
collection.in_groups_of (10, :limit => 30) do |group|
# each group should be exactly 10 items unless
# fewer than 30 items are returned by the service
group.each do |item|
#...
end
end
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/aws/core/collection.rb', line 152 def in_groups_of size, = {}, &block group = [] nil_or_next_token = each_batch() do |batch| batch.each do |item| group << item if group.size == size yield(group) group = [] end end end yield(group) unless group.empty? nil_or_next_token end |
#page(options = {}) ⇒ Object
This method does not accept a :page
option, which means you can only start at the begining of the collection and request the next page of results. You can not choose an offset or know how many pages of results there will be.
Returns a single page of results in a kind-of array (PageResult).
items = collection.page(:per_page => 10) # defaults to 10 items
items.is_a?(Array) # => true
items.size # => 8
items.per_page # => 10
items.last_page? # => true
If you need to display a “next page” link in a web view you can use the #more? method. Just make sure the generated link contains the next_token
.
<% if items.more? %>
<%= link_to('Next Page', params.merge(:next_token => items.next_token) %>
<% end %>
Then in your controller you can find the next page of results:
items = collection.page(:next_token => params[:next_token])
Given a PageResult you can also get more results directly:
more_items = items.next_page
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/aws/core/collection.rb', line 214 def page = {} each_opts = .dup per_page = each_opts.delete(:per_page) per_page = [nil,''].include?(per_page) ? 10 : per_page.to_i each_opts[:limit] = per_page items = [] next_token = each(each_opts) do |item| items << item end Core::PageResult.new(self, items, per_page, next_token) end |