1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
module AWS
module Record
class HashModel
class << self
# @param [String] id The id of the record to load.
# @param [Hash] options
# @option options [String] :shard Specifies what shard (i.e. table)
# should be searched.
# @raise [RecordNotFound] Raises a record not found exception if there
# was no data found for the given id.
# @return [Record::HashModel] Returns the record with the given id.
def find_by_id id, options = {}
table = dynamo_db_table(options[:shard])
data = table.items[id].attributes.to_h
raise RecordNotFound, "no data found for id: #{id}" if data.empty?
obj = self.new(:shard => table)
obj.send(:hydrate, id, data)
obj
end
alias_method :[], :find_by_id
# Finds records in Amazon DynamoDB and returns them as objects of
# the current class.
#
# Finding `:all` returns an enumerable scope object
#
# People.find(:all, :limit => 10).each do |person|
# puts person.name
# end
#
# Finding `:first` returns a single record (or nil)
#
# boss = People.find(:first)
#
# Find accepts a hash of find modifiers (`:shard` and `:limit`).
# You can also choose to omit these modifiers and
# chain them on the scope object returned. In the following
# example only one request is made to SimpleDB (when #each is
# called)
#
# people = People.find(:all, :limit => 10)
#
# people = people.limit(10).find(:all)
#
# @overload find(id)
# @param id The record to find, raises an exception if the record is
# not found.
#
# @overload find(mode, options = {})
# @param [:all,:first] mode (:all) When finding `:all` matching records
# and array is returned of records. When finding `:first` then
# `nil` or a single record will be returned.
# @param [Hash] options
# @option options [Integer] :shard The shard name of the Amazon
# DynamoDB table to search.
# @option options [Integer] :limit The max number of records to fetch.
def find *args
new_scope.find(*args)
end
# Returns a chainable scope object that restricts further scopes to a
# particular table.
#
# Book.shard('books-2').each do |book|
# # ...
# end
#
# @param [String] shard_name
# @return [Scope] Returns a scope for restricting the table searched.
def shard shard_name
new_scope.shard(shard_name)
end
alias_method :domain, :shard # backwards compat
# Returns an enumerable scope object represents all records.
#
# Book.all.each do |book|
# # ...
# end
#
# This method is equivalent to `find(:all)`, and therefore you can also
# pass aditional options.
#
# Book.all(:where => { :author' => 'me' }).each do |my_book|
# # ...
# end
#
# @return [Scope] Returns an enumerable scope object.
#
def all options = {}
new_scope.find(:all, options)
end
# Yields once for each record.
def each &block
all.each(&block)
end
# Counts records Amazon DynamoDB.
#
# class Product < AWS::Record::HashModel
# end
#
# # returns the count of records in the 'Product' table
# Product.count
#
# You can specify the table via #shard
#
# # returns the count of records in the 'products-1' table
# Product.shard('products-1').count
#
# You can also specify the shard as an option to #count.
#
# Product.count(:shard => 'table-name')
#
# Chaining #count with #limit has no effect on the count.
#
# Product.limit(10).count # same as Product.count, limit ignored
#
# @param [Hash] options
#
# @option [String] :shard Which shard to count records in.
#
# @return [Integer] The count of records in the table.
#
def count options = {}
new_scope.count(options)
end
alias_method :size, :count
# @return [Object,nil] Returns the first record found. If there were
# no records found, nil is returned.
def first options = {}
new_scope.first(options)
end
# The maximum number of records to return. By default, all records
# matching the where conditions will be returned from a find.
#
# People.limit(10).each {|person| ... }
#
# Limit can be chained with other scope modifiers:
#
# People.where(:age => 40).limit(10).each {|person| ... }
#
def limit limit
new_scope.limit(limit)
end
end
end
end
end
|