ocean-dynamo 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.rdoc +28 -6
- data/lib/ocean-dynamo/associations/has_many.rb +1 -4
- data/lib/ocean-dynamo/queries.rb +84 -0
- data/lib/ocean-dynamo/schema.rb +2 -2
- data/lib/ocean-dynamo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3c55ae49ff1ad852246e6af0b6727f284a10acc
|
4
|
+
data.tar.gz: 17c013a3f22302b9a48a117a83e800e35297fb35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16351feeb2ff2d90ea76d87c9c352c752fc0d29eab5c77d8dc522d39779c69835ce90b88599823ffed8a638c01d26c1556807f91533c0a71337d0600bbc1a93a
|
7
|
+
data.tar.gz: b9cdc4ea2f37f4dabd048264e61bc96f79b504b4d9fc6f89e94519e6f9c5f66a6bd097f614f35a2698296ba72ff55b756395752dac95b3bed0c0823f2fe1edd7
|
data/README.rdoc
CHANGED
@@ -216,12 +216,10 @@ the possibility to define both local and secondary indices for Tables.
|
|
216
216
|
|
217
217
|
== Secondary Indices
|
218
218
|
|
219
|
-
We now have basic support for secondary indices.
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
secondary index is to be used explicitly in the options passed to +in_batches+,
|
224
|
-
+query+, and +scan+.
|
219
|
+
We now have basic support for secondary indices. High-level support for global secondary indices
|
220
|
+
is also available; we will add high-level support for local secondary indices very soon.
|
221
|
+
For now you will have to specify that a secondary index is to be used explicitly in the options
|
222
|
+
passed to +in_batches+, +query+, and +scan+.
|
225
223
|
* +query+: http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Table.html#query-instance_method
|
226
224
|
* +scan+: http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Table.html#scan-instance_method
|
227
225
|
* +in_batches+, +find_each+: lib/ocean-dynamo/queries.rb
|
@@ -277,6 +275,30 @@ Each +global_secondary_index+ clause takes the following arguments:
|
|
277
275
|
* +:read_capacity_units+ (defaults to the table's read capacity, normally 10)
|
278
276
|
* +:write_capacity_units+ (default to the table's write capacity, normally 5)
|
279
277
|
|
278
|
+
High-level support for global secondary indices is now available through
|
279
|
+
+find_global_each+ and +find_global+. They take the same arguments; the former
|
280
|
+
yields to a block for each item, the other returns all items in an array.
|
281
|
+
|
282
|
+
The following finds all Authentications whose +:token+ is "quux"
|
283
|
+
|
284
|
+
Authentication.find_global(:token, "quux")
|
285
|
+
|
286
|
+
This retrieves all Authentications belonging to the user with the ID "dfstw-ruyhdf-ewijf",
|
287
|
+
sorted in ascending order of the +:expires_at+ attribute:
|
288
|
+
|
289
|
+
Authentication.find_global(:api_user_id, "dfstw-ruyhdf-ewijf",
|
290
|
+
:expires_at, ">=", 0)
|
291
|
+
|
292
|
+
To get the highest +:expires_at+ record, execute the following:
|
293
|
+
|
294
|
+
Authentication.find_global(:api_user_id, "dfstw-ruyhdf-ewijf",
|
295
|
+
:expires_at, ">=", 0,
|
296
|
+
scan_index_forward: false, limit: 1)
|
297
|
+
|
298
|
+
The combination of hash and range key must have been explicitly declared using
|
299
|
+
+global_secondary_index+. For more information, see the documentation of
|
300
|
+
+find_global_each+ and +find_global+.
|
301
|
+
|
280
302
|
|
281
303
|
== Installation
|
282
304
|
|
@@ -113,10 +113,7 @@ module OceanDynamo
|
|
113
113
|
def condition_options(child_class)
|
114
114
|
hash_key = child_class.table_hash_key
|
115
115
|
range_key = child_class.table_range_key
|
116
|
-
|
117
|
-
key_condition_expression: "#H = :hashval AND #R >= :rangeval",
|
118
|
-
expression_attribute_values: { ":hashval" => id, ":rangeval" => "0" }
|
119
|
-
}
|
116
|
+
child_class.condition_builder(hash_key, id, range_key, ">=", "0", consistent: true)
|
120
117
|
end
|
121
118
|
|
122
119
|
|
data/lib/ocean-dynamo/queries.rb
CHANGED
@@ -111,5 +111,89 @@ module OceanDynamo
|
|
111
111
|
# def find_in_batches(start: nil, batch_size: 1000)
|
112
112
|
# []
|
113
113
|
# end
|
114
|
+
|
115
|
+
|
116
|
+
def condition_builder(hash_key, hash_value,
|
117
|
+
range_key=nil, comparator=nil, range_value=nil,
|
118
|
+
limit: nil, consistent: false, scan_index_forward: true)
|
119
|
+
if range_key
|
120
|
+
options = {
|
121
|
+
expression_attribute_names: { "#H" => hash_key, "#R" => range_key },
|
122
|
+
key_condition_expression: "#H = :hashval AND #R #{comparator} :rangeval",
|
123
|
+
expression_attribute_values: { ":hashval" => hash_value, ":rangeval" => range_value }
|
124
|
+
}
|
125
|
+
else
|
126
|
+
options = {
|
127
|
+
expression_attribute_names: { "#H" => hash_key },
|
128
|
+
key_condition_expression: "#H = :hashval",
|
129
|
+
expression_attribute_values: { ":hashval" => hash_value }
|
130
|
+
}
|
131
|
+
end
|
132
|
+
options[:limit] = limit if limit
|
133
|
+
options[:consistent_read] = consistent if consistent
|
134
|
+
options[:scan_index_forward] = scan_index_forward if !scan_index_forward
|
135
|
+
options
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
#
|
140
|
+
# This method finds each item of a global secondary index, sequentially yielding each item
|
141
|
+
# to the given block (required). The parameters are as follows:
|
142
|
+
#
|
143
|
+
# +hash_key+ The name of the hash key to use (required).
|
144
|
+
# +hash_value+ The value of the hash key to match (required).
|
145
|
+
# +range_key+ The name of the range key to use (optional).
|
146
|
+
# +comparator+ The comparator to use. "=", "<", ">", "<=", ">=". (optional).
|
147
|
+
# +range-value+ The value of the range key to match (optional).
|
148
|
+
#
|
149
|
+
# Note that +range_key+ is optional, but if it's present, then the +comparator+ and
|
150
|
+
# the +range_value+ must also be given. They must either all be present or absent.
|
151
|
+
#
|
152
|
+
# The following keyword arguments are accepted:
|
153
|
+
#
|
154
|
+
# +:limit+ The maximum number of items to read.
|
155
|
+
# +:scan_index_forward+ If false, items will be in reverse order.
|
156
|
+
#
|
157
|
+
# If the index contains all attributes, no extra read will be performed. If it doesn't,
|
158
|
+
# the entire item will be fetched using an extra read operation.
|
159
|
+
#
|
160
|
+
def find_global_each(hash_key, hash_value,
|
161
|
+
range_key=nil, comparator=nil, range_value=nil,
|
162
|
+
limit: nil, scan_index_forward: true,
|
163
|
+
&block)
|
164
|
+
hash_value = hash_value.to_i if hash_value.is_a?(Time)
|
165
|
+
range_value = range_value.to_i if range_value.is_a?(Time)
|
166
|
+
options = condition_builder(hash_key, hash_value, range_key, comparator, range_value,
|
167
|
+
limit: limit, scan_index_forward: scan_index_forward)
|
168
|
+
index_name = (range_key ? "#{hash_key}_#{range_key}" : hash_key.to_s) + "_global"
|
169
|
+
options[:index_name] = index_name
|
170
|
+
raise "Undefined global index: #{index_name}" unless global_secondary_indexes[index_name]
|
171
|
+
all_projected = global_secondary_indexes[index_name]["projection_type"] == "ALL"
|
172
|
+
in_batches :query, options do |attrs|
|
173
|
+
if limit
|
174
|
+
return if limit <= 0
|
175
|
+
limit = limit - 1
|
176
|
+
end
|
177
|
+
if all_projected
|
178
|
+
yield new._setup_from_dynamo(attrs)
|
179
|
+
else
|
180
|
+
yield find(attrs[table_hash_key.to_s], table_range_key && attrs[table_range_key.to_s])
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
#
|
187
|
+
# This method takes the same args as +find_global_each+ but returns all found items as
|
188
|
+
# an array.
|
189
|
+
#
|
190
|
+
def find_global(*args)
|
191
|
+
result = []
|
192
|
+
find_global_each(*args) do |item|
|
193
|
+
result << item
|
194
|
+
end
|
195
|
+
result
|
196
|
+
end
|
197
|
+
|
114
198
|
end
|
115
199
|
end
|
data/lib/ocean-dynamo/schema.rb
CHANGED
@@ -44,10 +44,10 @@ module OceanDynamo
|
|
44
44
|
read_capacity_units: table_read_capacity_units,
|
45
45
|
write_capacity_units: table_write_capacity_units)
|
46
46
|
if range_key
|
47
|
-
name = "#{hash_key}_#{range_key}"
|
47
|
+
name = "#{hash_key}_#{range_key}_global"
|
48
48
|
keys = [hash_key.to_s, range_key.to_s]
|
49
49
|
else
|
50
|
-
name = "#{hash_key}"
|
50
|
+
name = "#{hash_key}_global"
|
51
51
|
keys = [hash_key.to_s]
|
52
52
|
end
|
53
53
|
self.global_secondary_indexes[name] = {
|
data/lib/ocean-dynamo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocean-dynamo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Bengtson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|