toy-dynamo 0.0.15 → 0.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 26adbe6ed91bc6404764076fa4a8cf89261597e6
4
- data.tar.gz: 49628a7f3143baa115424d15018c2405fb08a350
3
+ metadata.gz: 379a504380d30c3c6b1c38c47661e7f366a3a6ae
4
+ data.tar.gz: d7b3c58d0d7a2f4bca65d234b542e295cc4b9c56
5
5
  SHA512:
6
- metadata.gz: a4b817bc3fd46858022e85473ee9fff66b8dbfc8437d2562c97aed3af4303ca548414f75fa25c577bdf976d309d4c42c3f779ee3c3f0b6ea3e18515d6f543d27
7
- data.tar.gz: 73182f130442e510ff3ad6e725b0d288584525c75cec34d3d631186fab0f74b53c49f5ed53072433e614b4187b6a258c7acba3a422aec35222d3dc05b89dacd5
6
+ metadata.gz: 27692d7df92daba4828fb3bb122ef684e50a378b307090341e9c2ac653e42c13a329b23c1f0ee2497fe351913e6a27674e09770328cd35bc767bfe4bd8c238fa
7
+ data.tar.gz: 4f8a7e8b64b3c16862fb83f02db97405c470bbbfe57464f926b94b13b17f3254ad63e963ed6b163979b577e7ac86b7203e7af382e4babd03564fa82edf414453
@@ -31,9 +31,25 @@ module Toy
31
31
  :ge => "GE",
32
32
  :gt => "GT",
33
33
  :begins_with => "BEGINS_WITH",
34
- :between => "BETWEEN"
34
+ :between => "BETWEEN",
35
+ # Scan only
36
+ :ne => "NE",
37
+ :not_null => "NOT_NULL",
38
+ :null => "NULL",
39
+ :contains => "CONTAINS",
40
+ :not_contains => "NOT_CONTAINS",
41
+ :in => "IN"
35
42
  }
36
43
 
44
+ COMPARISON_OPERATOR_SCAN_ONLY = [
45
+ :ne,
46
+ :not_null,
47
+ :null,
48
+ :contains,
49
+ :not_contains,
50
+ :in
51
+ ]
52
+
37
53
  def initialize(table_schema, client, options={})
38
54
  @table_schema = table_schema
39
55
  @client = client
@@ -139,7 +155,7 @@ module Toy
139
155
  if options[:range]
140
156
  raise ArgumentError, "Expected a 1 element Hash for :range (ex {:age.gt => 13})" unless options[:range].is_a?(Hash) && options[:range].keys.size == 1
141
157
  range_key_name, comparison_operator = options[:range].keys.first.split(".")
142
- raise ArgumentError, "Comparison operator must be one of (#{COMPARISON_OPERATOR.keys.join(", ")})" unless COMPARISON_OPERATOR.keys.include?(comparison_operator.to_sym)
158
+ raise ArgumentError, "Comparison operator must be one of (#{(COMPARISON_OPERATOR.keys - COMPARISON_OPERATOR_SCAN_ONLY).join(", ")})" unless COMPARISON_OPERATOR.keys.include?(comparison_operator.to_sym)
143
159
  range_key = @range_keys.find{|k| k[:attribute_name] == range_key_name}
144
160
  raise ArgumentError, ":range key must be a valid Range attribute" unless range_key
145
161
  raise ArgumentError, ":range key must be a Range if using the operator BETWEEN" if comparison_operator == "between" && !options[:range].values.first.is_a?(Range)
@@ -325,6 +341,70 @@ module Toy
325
341
  end
326
342
  end
327
343
 
344
+ # Perform a table scan
345
+ # http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
346
+ def scan(options={})
347
+ options[:return_consumed_capacity] ||= :none # "NONE" # || "TOTAL"
348
+ # Default if not already set
349
+ options[:select] ||= :all # :all, :projected, :count, []
350
+
351
+ scan_request = {
352
+ :table_name => options[:table_name] || self.table_name,
353
+ :return_consumed_capacity => RETURNED_CONSUMED_CAPACITY[options[:return_consumed_capacity]]
354
+ }
355
+
356
+ scan_request.merge!({ :limit => options[:limit].to_i }) if options.has_key?(:limit)
357
+ scan_request.merge!({ :exclusive_start_key => options[:exclusive_start_key] }) if options[:exclusive_start_key]
358
+
359
+ if options[:select].is_a?(Array)
360
+ attrs_to_select = [options[:select].map(&:to_s)].flatten
361
+ attrs_to_select << @hash_key[:attribute_name]
362
+ attrs_to_select << @range_keys.find{|k| k[:primary_range_key] }[:attribute_name] if @range_keys
363
+ scan_request.merge!({
364
+ :select => QUERY_SELECT[:specific],
365
+ :attributes_to_get => attrs_to_select.uniq
366
+ })
367
+ else
368
+ scan_request.merge!({ :select => QUERY_SELECT[options[:select]] })
369
+ end
370
+
371
+ # :scan_filter => { :name.begins_with => "a" }
372
+ scan_filter = {}
373
+ if options[:scan_filter].present?
374
+ options[:scan_filter].each_pair.each do |k,v|
375
+ # Hard to validate attribute types here, so infer by type sent and assume the user knows their own attrs
376
+ key_name, comparison_operator = k.split(".")
377
+ raise ArgumentError, "Comparison operator must be one of (#{COMPARISON_OPERATOR.keys.join(", ")})" unless COMPARISON_OPERATOR.keys.include?(comparison_operator.to_sym)
378
+ raise ArgumentError, "scan_filter value must be a Range if using the operator BETWEEN" if comparison_operator == "between" && !v.is_a?(Range)
379
+ raise ArgumentError, "scan_filter value must be a Array if using the operator IN" if comparison_operator == "in" && !v.is_a?(Array)
380
+
381
+ attribute_value_list = []
382
+ if comparison_operator == "in"
383
+ v.each do |in_v|
384
+ attribute_value_list << attr_with_type(key_name, in_v).values.last
385
+ end
386
+ elsif comparison_operator == "between"
387
+ attribute_value_list << attr_with_type(key_name, range_value.min).values.last
388
+ attribute_value_list << attr_with_type(key_name, range_value.max).values.last
389
+ else
390
+ attribute_value_list << attr_with_type(key_name, v).values.last
391
+ end
392
+ scan_filter.merge!({
393
+ key_name => {
394
+ :comparison_operator => COMPARISON_OPERATOR[comparison_operator.to_sym],
395
+ :attribute_value_list => attribute_value_list
396
+ }
397
+ })
398
+ end
399
+ scan_request.merge!(:scan_filter => scan_filter)
400
+ end
401
+
402
+ scan_request.merge!({ :segment => options[:segment] }) if options[:segment]
403
+ scan_request.merge!({ :total_segments => options[:total_segments].to_i }) if options[:total_segments]
404
+
405
+ @client.scan(scan_request)
406
+ end
407
+
328
408
  # Call proc or return string
329
409
  def table_name
330
410
  if @table_schema[:table_name].respond_to?(:call)
@@ -1,5 +1,5 @@
1
1
  module Toy
2
2
  module Dynamo
3
- VERSION = "0.0.15"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toy-dynamo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cary Dunn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-09 00:00:00.000000000 Z
11
+ date: 2013-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  version: '0'
136
136
  requirements: []
137
137
  rubyforge_project:
138
- rubygems_version: 2.0.0
138
+ rubygems_version: 2.0.2
139
139
  signing_key:
140
140
  specification_version: 4
141
141
  summary: ActiveModel based DynamoDB ORM - extension to toystore