redcord 0.1.0 → 0.1.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: 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