redcord 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: 16cb660da0ea843f300ff18cc090ccfed7883c9d1ca48ef0bc5ed8d4e805854c
4
- data.tar.gz: f53002cb43b3e5286ba1f914c41ffd6b8a9722d2d33d9764deb7bcba88d2659c
3
+ metadata.gz: 525c939f4cee5b8adbb11b0530a2b2f44f6a26a8bb1a55e4dc837d725b3f71fb
4
+ data.tar.gz: f7e1747cc025310b20ab5e8d675fefe6d951ec60c5c09056454e11c8c366008e
5
5
  SHA512:
6
- metadata.gz: db443ffbf21066c549b30daed2ad44f836aa4469065b7bd8b6d0c13f45597bd7bdbf6c7ef4202ddf8103a1c2fbcfca28ca60f9f59b90584d0ec718d380d0f908
7
- data.tar.gz: 40ded5853307f453fe7c5ab2962e29cc081c05ab7f0c2cfddb898259e207ae9c343dfee6a67967449ff43c227c88db6f7a7922c425d8e6df92466b5ed778c5c2
6
+ metadata.gz: 6e2ff5ff1008d0a9e59e02438010e78324ec86c3ce03c470f28175498c7b29fbd277f97509f59dead80e258609ed033c9d686119726553b206996c064d4c7827
7
+ data.tar.gz: bba7b07d1e6b222614667a271b25973f5d1693d2090cb533dcbbfaf092f6200cce75ce5a7cf76356277bc1d51ae5011405465caae64ad295b85faa63d016c191
@@ -18,24 +18,19 @@ class Redcord::Redis < Redis
18
18
  ).returns(String)
19
19
  end
20
20
  def create_hash_returning_id(key, args, ttl:, index_attrs:, range_index_attrs:, custom_index_attrs:, hash_tag: nil)
21
- Redcord::Base.trace(
22
- 'redcord_redis_create_hash_returning_id',
23
- model_name: key,
24
- ) do
25
- id = "#{SecureRandom.uuid}#{hash_tag}"
26
- custom_index_attrs_flat = custom_index_attrs.inject([]) do |result, (index_name, attrs)|
27
- result << index_name
28
- result << attrs.size
29
- result + attrs
30
- end
31
- run_script(
32
- :create_hash,
33
- keys: [id, hash_tag],
34
- argv: [key, ttl, index_attrs.size, range_index_attrs.size, custom_index_attrs_flat.size] +
35
- index_attrs + range_index_attrs + custom_index_attrs_flat + args.to_a.flatten,
36
- )
37
- id
21
+ id = "#{SecureRandom.uuid}#{hash_tag}"
22
+ custom_index_attrs_flat = custom_index_attrs.inject([]) do |result, (index_name, attrs)|
23
+ result << index_name
24
+ result << attrs.size
25
+ result + attrs
38
26
  end
27
+ run_script(
28
+ :create_hash,
29
+ keys: [id, hash_tag],
30
+ argv: [key, ttl, index_attrs.size, range_index_attrs.size, custom_index_attrs_flat.size] +
31
+ index_attrs + range_index_attrs + custom_index_attrs_flat + args.to_a.flatten,
32
+ )
33
+ id
39
34
  end
40
35
 
41
36
  sig do
@@ -51,26 +46,21 @@ class Redcord::Redis < Redis
51
46
  ).void
52
47
  end
53
48
  def update_hash(model, id, args, ttl:, index_attrs:, range_index_attrs:, custom_index_attrs:, hash_tag:)
54
- Redcord::Base.trace(
55
- 'redcord_redis_update_hash',
56
- model_name: model,
57
- ) do
58
- custom_index_attrs_flat = custom_index_attrs.inject([]) do |result, (index_name, attrs)|
59
- if !(args.keys.to_set & attrs.to_set).empty?
60
- result << index_name
61
- result << attrs.size
62
- result + attrs
63
- else
64
- result
65
- end
49
+ custom_index_attrs_flat = custom_index_attrs.inject([]) do |result, (index_name, attrs)|
50
+ if !(args.keys.to_set & attrs.to_set).empty?
51
+ result << index_name
52
+ result << attrs.size
53
+ result + attrs
54
+ else
55
+ result
66
56
  end
67
- run_script(
68
- :update_hash,
69
- keys: [id, hash_tag],
70
- argv: [model, ttl, index_attrs.size, range_index_attrs.size, custom_index_attrs_flat.size] +
71
- index_attrs + range_index_attrs + custom_index_attrs_flat + args.to_a.flatten,
72
- )
73
57
  end
58
+ run_script(
59
+ :update_hash,
60
+ keys: [id, hash_tag],
61
+ argv: [model, ttl, index_attrs.size, range_index_attrs.size, custom_index_attrs_flat.size] +
62
+ index_attrs + range_index_attrs + custom_index_attrs_flat + args.to_a.flatten,
63
+ )
74
64
  end
75
65
 
76
66
  sig do
@@ -83,17 +73,12 @@ class Redcord::Redis < Redis
83
73
  ).returns(Integer)
84
74
  end
85
75
  def delete_hash(model, id, index_attrs:, range_index_attrs:, custom_index_attrs:)
86
- Redcord::Base.trace(
87
- 'redcord_redis_delete_hash',
88
- model_name: model,
89
- ) do
90
- custom_index_names = custom_index_attrs.keys
91
- run_script(
92
- :delete_hash,
93
- keys: [id, id.match(/\{.*\}$/)&.send(:[], 0)],
94
- argv: [model, index_attrs.size, range_index_attrs.size] + index_attrs + range_index_attrs + custom_index_names,
95
- )
96
- end
76
+ custom_index_names = custom_index_attrs.keys
77
+ run_script(
78
+ :delete_hash,
79
+ keys: [id, id.match(/\{.*\}$/)&.send(:[], 0)],
80
+ argv: [model, index_attrs.size, range_index_attrs.size] + index_attrs + range_index_attrs + custom_index_names,
81
+ )
97
82
  end
98
83
 
99
84
  sig do
@@ -118,22 +103,17 @@ class Redcord::Redis < Redis
118
103
  hash_tag: nil,
119
104
  custom_index_name: nil
120
105
  )
121
- Redcord::Base.trace(
122
- 'redcord_redis_find_by_attr',
123
- model_name: model,
124
- ) do
125
- conditions = flatten_with_partial_sort(query_conditions.clone, custom_index_attrs)
126
- res = run_script(
127
- :find_by_attr,
128
- keys: [hash_tag],
129
- argv: [model, custom_index_name, index_attrs.size, range_index_attrs.size, custom_index_attrs.size, conditions.size] +
130
- index_attrs + range_index_attrs + custom_index_attrs + conditions + select_attrs.to_a.flatten
131
- )
132
- # The Lua script will return this as a flattened array.
133
- # Convert the result into a hash of {id -> model hash}
134
- res_hash = res.each_slice(2)
135
- res_hash.map { |key, val| [key, val.each_slice(2).to_h] }.to_h
136
- end
106
+ conditions = flatten_with_partial_sort(query_conditions.clone, custom_index_attrs)
107
+ res = run_script(
108
+ :find_by_attr,
109
+ keys: [hash_tag],
110
+ argv: [model, custom_index_name, index_attrs.size, range_index_attrs.size, custom_index_attrs.size, conditions.size] +
111
+ index_attrs + range_index_attrs + custom_index_attrs + conditions + select_attrs.to_a.flatten
112
+ )
113
+ # The Lua script will return this as a flattened array.
114
+ # Convert the result into a hash of {id -> model hash}
115
+ res_hash = res.each_slice(2)
116
+ res_hash.map { |key, val| [key, val.each_slice(2).to_h] }.to_h
137
117
  end
138
118
 
139
119
  sig do
@@ -156,33 +136,28 @@ class Redcord::Redis < Redis
156
136
  hash_tag: nil,
157
137
  custom_index_name: nil
158
138
  )
159
- Redcord::Base.trace(
160
- 'redcord_redis_find_by_attr_count',
161
- model_name: model,
162
- ) do
163
- conditions = flatten_with_partial_sort(query_conditions.clone, custom_index_attrs)
164
- run_script(
165
- :find_by_attr_count,
166
- keys: [hash_tag],
167
- argv: [model, custom_index_name, index_attrs.size, range_index_attrs.size, custom_index_attrs.size] +
168
- index_attrs + range_index_attrs + custom_index_attrs + conditions
169
- )
170
- end
139
+ conditions = flatten_with_partial_sort(query_conditions.clone, custom_index_attrs)
140
+ run_script(
141
+ :find_by_attr_count,
142
+ keys: [hash_tag],
143
+ argv: [model, custom_index_name, index_attrs.size, range_index_attrs.size, custom_index_attrs.size] +
144
+ index_attrs + range_index_attrs + custom_index_attrs + conditions
145
+ )
171
146
  end
172
147
 
173
- def scan_each_shard(key, &blk)
148
+ def scan_each_shard(key, count: 1000, &blk)
174
149
  clients = instance_variable_get(:@client)
175
150
  &.instance_variable_get(:@node)
176
151
  &.instance_variable_get(:@clients)
177
152
  &.values
178
153
 
179
154
  if clients.nil?
180
- scan_each(match: key, &blk)
155
+ scan_each(match: key, count: count, &blk)
181
156
  else
182
157
  clients.each do |client|
183
158
  cursor = 0
184
159
  loop do
185
- cursor, keys = client.call([:scan, cursor, 'match', key])
160
+ cursor, keys = client.call([:scan, cursor, 'match', key, 'count', count])
186
161
  keys.each(&blk)
187
162
  break if cursor == "0"
188
163
  end
@@ -88,16 +88,21 @@ class Redcord::Relation
88
88
 
89
89
  sig { returns(Integer) }
90
90
  def count
91
- model.validate_index_attributes(query_conditions.keys, custom_index_name: custom_index_name)
92
- redis.find_by_attr_count(
93
- model.model_key,
94
- extract_query_conditions!,
95
- index_attrs: model._script_arg_index_attrs,
96
- range_index_attrs: model._script_arg_range_index_attrs,
97
- custom_index_attrs: model._script_arg_custom_index_attrs[custom_index_name],
98
- hash_tag: extract_hash_tag!,
99
- custom_index_name: custom_index_name
100
- )
91
+ Redcord::Base.trace(
92
+ 'redcord_relation_count',
93
+ model_name: model.name,
94
+ ) do
95
+ model.validate_index_attributes(query_conditions.keys, custom_index_name: custom_index_name)
96
+ redis.find_by_attr_count(
97
+ model.model_key,
98
+ extract_query_conditions!,
99
+ index_attrs: model._script_arg_index_attrs,
100
+ range_index_attrs: model._script_arg_range_index_attrs,
101
+ custom_index_attrs: model._script_arg_custom_index_attrs[custom_index_name],
102
+ hash_tag: extract_hash_tag!,
103
+ custom_index_name: custom_index_name
104
+ )
105
+ end
101
106
  end
102
107
 
103
108
  sig { params(index_name: T.nilable(Symbol)).returns(Redcord::Relation) }
@@ -32,24 +32,27 @@ module Redcord::VacuumHelper
32
32
 
33
33
  sig { params(model: T.class_of(Redcord::Base), range_index_attr: Symbol).void }
34
34
  def self._vacuum_range_index_attribute(model, range_index_attr)
35
+ key_suffix = model.shard_by_attribute.nil? ? nil : '{*}'
35
36
  range_index_set_key = "#{model.model_key}:#{range_index_attr}"
36
37
  range_index_set_nil_key = "#{range_index_set_key}:"
37
38
 
38
39
  # Handle nil values for range index attributes, which are stored in a normal
39
40
  # set at Redcord:Model:range_index_attr:
40
- model.redis.scan_each_shard("#{range_index_set_nil_key}*") do |key|
41
+ model.redis.scan_each_shard("#{range_index_set_nil_key}#{key_suffix}") do |key|
41
42
  _remove_stale_ids_from_set(model, key)
42
43
  end
43
44
 
44
- model.redis.scan_each_shard("#{range_index_set_key}*") do |key|
45
+ model.redis.scan_each_shard("#{range_index_set_key}#{key_suffix}") do |key|
45
46
  _remove_stale_ids_from_sorted_set(model, key)
46
47
  end
47
48
  end
48
49
 
49
50
  sig { params(model: T.class_of(Redcord::Base), index_name: Symbol).void }
50
51
  def self._vacuum_custom_index(model, index_name)
52
+ key_suffix = model.shard_by_attribute.nil? ? nil : '{*}'
51
53
  custom_index_content_key = "#{model.model_key}:custom_index:#{index_name}_content"
52
- model.redis.scan_each_shard("#{custom_index_content_key}*") do |key|
54
+
55
+ model.redis.scan_each_shard("#{custom_index_content_key}#{key_suffix}") do |key|
53
56
  hash_tag = key.split(custom_index_content_key)[1] || ""
54
57
  _remove_stale_records_from_custom_index(model, hash_tag, index_name)
55
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redcord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chan Zuckerberg Initiative