dynamoid_advanced_where 1.6.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a830c51235f4fec181d2c9b6a5308f55015c23aea40be329dfecaa023f561b37
4
- data.tar.gz: 95af2de8d86ad0de5ff9925591d5d161bdc3226c5b955544cfce32595c7297c6
3
+ metadata.gz: 1a85cd45266e1210f64c5d4bd1187416c2643aeb5de64d66c9f9ad9fbd4ba456
4
+ data.tar.gz: ab0281d70cdc10879af23d28e9fefac40679e3c28da55d19244b828718c30d5a
5
5
  SHA512:
6
- metadata.gz: 9f90439b8db774d0aae74bd08ee096b9a9fbd091b61e07e01d4b470b77f6f8de78fc52b296cf2625fd42c40b81be0b230402c378c46f1358459ffd6ddfe58036
7
- data.tar.gz: c6f26e04f8be1dab29bc4f909fe04ae0afeaf27abc2f60515102822c13ac7690708545d1d43f14f9487acc860b77162e4618da9542d86be8f4e0d7bee289e947
6
+ metadata.gz: 42dfd340ba7191b51b172615cfe7cef602906f88b30f5023e519bbea01e12e9ad2af7833607500cb9408a88b0f13144237dea0cbdfe36ed22bb3124f6e00ffe8
7
+ data.tar.gz: a3b3fb6011989832dc5ae91cca827a63e17fb4a920d897a5ab0c8d76bf56d5c1ca822552f112f77fe3c3b7b62db1c183988cbf63ff48a83ea1135fa1c388b497
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dynamoid_advanced_where (1.6.0)
4
+ dynamoid_advanced_where (1.7.1)
5
5
  dynamoid (>= 3.2, < 4)
6
6
 
7
7
  GEM
@@ -6,15 +6,16 @@ require_relative './batched_updater'
6
6
 
7
7
  module DynamoidAdvancedWhere
8
8
  class QueryBuilder
9
- attr_accessor :klass, :root_node, :start_hash, :record_limit
9
+ attr_accessor :klass, :root_node, :start_hash, :record_limit, :projected_fields
10
10
 
11
11
  delegate :all, :each_page, :each, to: :query_materializer
12
12
 
13
- def initialize(klass:, record_limit: nil, start_hash: nil, root_node: nil, &blk)
13
+ def initialize(klass:, projected_fields: [], record_limit: nil, start_hash: nil, root_node: nil, &blk)
14
14
  self.klass = klass
15
15
  self.root_node = root_node || Nodes::RootNode.new(klass: klass, &blk)
16
16
  self.start_hash = start_hash
17
17
  self.record_limit = record_limit
18
+ self.projected_fields = projected_fields
18
19
 
19
20
  freeze
20
21
  end
@@ -49,6 +50,10 @@ module DynamoidAdvancedWhere
49
50
  end
50
51
  alias and where
51
52
 
53
+ def project(*fields)
54
+ dup_with_changes(projected_fields: projected_fields + fields)
55
+ end
56
+
52
57
  def limit(value)
53
58
  dup_with_changes(record_limit: value)
54
59
  end
@@ -68,6 +73,7 @@ module DynamoidAdvancedWhere
68
73
  klass: klass,
69
74
  start_hash: start_hash,
70
75
  root_node: root_node,
76
+ projected_fields: projected_fields,
71
77
  }.merge(changes))
72
78
  end
73
79
  end
@@ -44,61 +44,58 @@ module DynamoidAdvancedWhere
44
44
  end
45
45
  end
46
46
 
47
- def each_page_via_query
48
- query = {
49
- table_name: table_name,
50
- index_name: selected_index_for_query,
51
- }.merge(filter_builder.to_query_filter)
47
+ def enumerate_results(starting_query)
48
+ query = starting_query.dup
49
+
50
+ unless query_builder.projected_fields.empty?
51
+ query[:select] = 'SPECIFIC_ATTRIBUTES'
52
+ query[:projection_expression] = query_builder.projected_fields.map(&:to_s).join(',')
53
+ end
52
54
 
53
55
  query[:limit] = query_builder.record_limit if query_builder.record_limit
54
56
 
55
- page_start = start_hash
57
+ query[:exclusive_start_key] = start_hash
56
58
 
57
59
  Enumerator.new do |yielder|
58
60
  loop do
59
- results = client.query(query.merge(exclusive_start_key: page_start))
61
+ results = yield(query)
60
62
 
61
- items = (results.items || []).map do |item|
62
- klass.from_database(item.symbolize_keys)
63
- end
64
-
65
- yielder.yield(items, results)
63
+ yielder.yield(construct_items(results.items), results)
66
64
 
67
65
  query[:limit] = query[:limit] - results.items.length if query[:limit]
68
66
 
69
67
  break if results.last_evaluated_key.nil? || query[:limit]&.zero?
70
68
 
71
- (page_start = results.last_evaluated_key)
69
+ query[:exclusive_start_key] = results.last_evaluated_key
72
70
  end
73
71
  end.lazy
74
72
  end
75
73
 
76
- def each_page_via_scan
74
+ def construct_items(items)
75
+ (items || []).map do |item|
76
+ klass.from_database(item)
77
+ end
78
+ end
79
+
80
+ def each_page_via_query
77
81
  query = {
78
82
  table_name: table_name,
79
- }.merge(filter_builder.to_scan_filter)
80
-
81
- query[:limit] = query_builder.record_limit if query_builder.record_limit
82
-
83
- page_start = start_hash
84
-
85
- Enumerator.new do |yielder|
86
- loop do
87
- results = client.scan(query.merge(exclusive_start_key: page_start))
88
-
89
- items = (results.items || []).map do |item|
90
- klass.from_database(item.symbolize_keys)
91
- end
92
-
93
- yielder.yield(items, results)
83
+ index_name: selected_index_for_query,
84
+ }.merge(filter_builder.to_query_filter)
94
85
 
95
- query[:limit] = query[:limit] - results.items.length if query[:limit]
86
+ enumerate_results(query) do |q|
87
+ client.query(q)
88
+ end
89
+ end
96
90
 
97
- break if results.last_evaluated_key.nil? || query[:limit]&.zero?
91
+ def each_page_via_scan
92
+ query = {
93
+ table_name: table_name,
94
+ }.merge(filter_builder.to_scan_filter)
98
95
 
99
- (page_start = results.last_evaluated_key)
100
- end
101
- end.lazy
96
+ enumerate_results(query) do |q|
97
+ client.scan(q)
98
+ end
102
99
  end
103
100
 
104
101
  def filter_builder
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DynamoidAdvancedWhere
4
- VERSION = '1.6.0'
4
+ VERSION = '1.7.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamoid_advanced_where
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Malinconico
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-07 00:00:00.000000000 Z
11
+ date: 2023-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dynamoid