redis 4.0.0.rc1 → 4.4.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.
Files changed (101) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +143 -3
  3. data/README.md +127 -18
  4. data/lib/redis/client.rb +150 -93
  5. data/lib/redis/cluster/command.rb +81 -0
  6. data/lib/redis/cluster/command_loader.rb +34 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +108 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +37 -0
  11. data/lib/redis/cluster/option.rb +93 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +49 -0
  14. data/lib/redis/cluster.rb +291 -0
  15. data/lib/redis/connection/command_helper.rb +3 -2
  16. data/lib/redis/connection/hiredis.rb +4 -3
  17. data/lib/redis/connection/registry.rb +2 -1
  18. data/lib/redis/connection/ruby.rb +123 -105
  19. data/lib/redis/connection/synchrony.rb +18 -5
  20. data/lib/redis/connection.rb +2 -0
  21. data/lib/redis/distributed.rb +955 -0
  22. data/lib/redis/errors.rb +48 -0
  23. data/lib/redis/hash_ring.rb +89 -0
  24. data/lib/redis/pipeline.rb +55 -9
  25. data/lib/redis/subscribe.rb +11 -12
  26. data/lib/redis/version.rb +3 -1
  27. data/lib/redis.rb +1242 -381
  28. metadata +34 -141
  29. data/.gitignore +0 -16
  30. data/.travis/Gemfile +0 -11
  31. data/.travis.yml +0 -71
  32. data/.yardopts +0 -3
  33. data/Gemfile +0 -3
  34. data/benchmarking/logging.rb +0 -71
  35. data/benchmarking/pipeline.rb +0 -51
  36. data/benchmarking/speed.rb +0 -21
  37. data/benchmarking/suite.rb +0 -24
  38. data/benchmarking/worker.rb +0 -71
  39. data/examples/basic.rb +0 -15
  40. data/examples/consistency.rb +0 -114
  41. data/examples/incr-decr.rb +0 -17
  42. data/examples/list.rb +0 -26
  43. data/examples/pubsub.rb +0 -37
  44. data/examples/sentinel/sentinel.conf +0 -9
  45. data/examples/sentinel/start +0 -49
  46. data/examples/sentinel.rb +0 -41
  47. data/examples/sets.rb +0 -36
  48. data/examples/unicorn/config.ru +0 -3
  49. data/examples/unicorn/unicorn.rb +0 -20
  50. data/makefile +0 -42
  51. data/redis.gemspec +0 -40
  52. data/test/bitpos_test.rb +0 -63
  53. data/test/blocking_commands_test.rb +0 -183
  54. data/test/client_test.rb +0 -59
  55. data/test/command_map_test.rb +0 -28
  56. data/test/commands_on_hashes_test.rb +0 -174
  57. data/test/commands_on_hyper_log_log_test.rb +0 -70
  58. data/test/commands_on_lists_test.rb +0 -154
  59. data/test/commands_on_sets_test.rb +0 -208
  60. data/test/commands_on_sorted_sets_test.rb +0 -444
  61. data/test/commands_on_strings_test.rb +0 -338
  62. data/test/commands_on_value_types_test.rb +0 -246
  63. data/test/connection_handling_test.rb +0 -275
  64. data/test/db/.gitkeep +0 -0
  65. data/test/encoding_test.rb +0 -14
  66. data/test/error_replies_test.rb +0 -57
  67. data/test/fork_safety_test.rb +0 -60
  68. data/test/helper.rb +0 -179
  69. data/test/helper_test.rb +0 -22
  70. data/test/internals_test.rb +0 -435
  71. data/test/persistence_control_commands_test.rb +0 -24
  72. data/test/pipelining_commands_test.rb +0 -238
  73. data/test/publish_subscribe_test.rb +0 -280
  74. data/test/remote_server_control_commands_test.rb +0 -175
  75. data/test/scanning_test.rb +0 -407
  76. data/test/scripting_test.rb +0 -76
  77. data/test/sentinel_command_test.rb +0 -78
  78. data/test/sentinel_test.rb +0 -253
  79. data/test/sorting_test.rb +0 -57
  80. data/test/ssl_test.rb +0 -69
  81. data/test/support/connection/hiredis.rb +0 -1
  82. data/test/support/connection/ruby.rb +0 -1
  83. data/test/support/connection/synchrony.rb +0 -17
  84. data/test/support/redis_mock.rb +0 -130
  85. data/test/support/ssl/gen_certs.sh +0 -31
  86. data/test/support/ssl/trusted-ca.crt +0 -25
  87. data/test/support/ssl/trusted-ca.key +0 -27
  88. data/test/support/ssl/trusted-cert.crt +0 -81
  89. data/test/support/ssl/trusted-cert.key +0 -28
  90. data/test/support/ssl/untrusted-ca.crt +0 -26
  91. data/test/support/ssl/untrusted-ca.key +0 -27
  92. data/test/support/ssl/untrusted-cert.crt +0 -82
  93. data/test/support/ssl/untrusted-cert.key +0 -28
  94. data/test/support/wire/synchrony.rb +0 -24
  95. data/test/support/wire/thread.rb +0 -5
  96. data/test/synchrony_driver.rb +0 -85
  97. data/test/test.conf.erb +0 -9
  98. data/test/thread_safety_test.rb +0 -60
  99. data/test/transactions_test.rb +0 -262
  100. data/test/unknown_commands_test.rb +0 -12
  101. data/test/url_param_test.rb +0 -136
@@ -1,444 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestCommandsOnSortedSets < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- Infinity = 1.0/0.0
8
-
9
- def test_zadd
10
- assert_equal 0, r.zcard("foo")
11
- assert_equal true, r.zadd("foo", 1, "s1")
12
- assert_equal false, r.zadd("foo", 1, "s1")
13
- assert_equal 1, r.zcard("foo")
14
- r.del "foo"
15
-
16
- target_version "3.0.2" do
17
- # XX option
18
- assert_equal 0, r.zcard("foo")
19
- assert_equal false, r.zadd("foo", 1, "s1", :xx => true)
20
- r.zadd("foo", 1, "s1")
21
- assert_equal false, r.zadd("foo", 2, "s1", :xx => true)
22
- assert_equal 2, r.zscore("foo", "s1")
23
- r.del "foo"
24
-
25
- # NX option
26
- assert_equal 0, r.zcard("foo")
27
- assert_equal true, r.zadd("foo", 1, "s1", :nx => true)
28
- assert_equal false, r.zadd("foo", 2, "s1", :nx => true)
29
- assert_equal 1, r.zscore("foo", "s1")
30
- assert_equal 1, r.zcard("foo")
31
- r.del "foo"
32
-
33
- # CH option
34
- assert_equal 0, r.zcard("foo")
35
- assert_equal true, r.zadd("foo", 1, "s1", :ch => true)
36
- assert_equal false, r.zadd("foo", 1, "s1", :ch => true)
37
- assert_equal true, r.zadd("foo", 2, "s1", :ch => true)
38
- assert_equal 1, r.zcard("foo")
39
- r.del "foo"
40
-
41
- # INCR option
42
- assert_equal 1.0, r.zadd("foo", 1, "s1", :incr => true)
43
- assert_equal 11.0, r.zadd("foo", 10, "s1", :incr => true)
44
- assert_equal(-Infinity, r.zadd("bar", "-inf", "s1", :incr => true))
45
- assert_equal(+Infinity, r.zadd("bar", "+inf", "s2", :incr => true))
46
- r.del "foo", "bar"
47
-
48
- # Incompatible options combination
49
- assert_raise(Redis::CommandError) { r.zadd("foo", 1, "s1", :xx => true, :nx => true) }
50
- end
51
- end
52
-
53
- def test_variadic_zadd
54
- target_version "2.3.9" do # 2.4-rc6
55
- # Non-nested array with pairs
56
- assert_equal 0, r.zcard("foo")
57
- assert_equal 2, r.zadd("foo", [1, "s1", 2, "s2"])
58
- assert_equal 1, r.zadd("foo", [4, "s1", 5, "s2", 6, "s3"])
59
- assert_equal 3, r.zcard("foo")
60
- r.del "foo"
61
-
62
- # Nested array with pairs
63
- assert_equal 0, r.zcard("foo")
64
- assert_equal 2, r.zadd("foo", [[1, "s1"], [2, "s2"]])
65
- assert_equal 1, r.zadd("foo", [[4, "s1"], [5, "s2"], [6, "s3"]])
66
- assert_equal 3, r.zcard("foo")
67
- r.del "foo"
68
-
69
- # Wrong number of arguments
70
- assert_raise(Redis::CommandError) { r.zadd("foo", ["bar"]) }
71
- assert_raise(Redis::CommandError) { r.zadd("foo", ["bar", "qux", "zap"]) }
72
- end
73
-
74
- target_version "3.0.2" do
75
- # XX option
76
- assert_equal 0, r.zcard("foo")
77
- assert_equal 0, r.zadd("foo", [1, "s1", 2, "s2"], :xx => true)
78
- r.zadd("foo", [1, "s1", 2, "s2"])
79
- assert_equal 0, r.zadd("foo", [2, "s1", 3, "s2", 4, "s3"], :xx => true)
80
- assert_equal 2, r.zscore("foo", "s1")
81
- assert_equal 3, r.zscore("foo", "s2")
82
- assert_equal nil, r.zscore("foo", "s3")
83
- assert_equal 2, r.zcard("foo")
84
- r.del "foo"
85
-
86
- # NX option
87
- assert_equal 0, r.zcard("foo")
88
- assert_equal 2, r.zadd("foo", [1, "s1", 2, "s2"], :nx => true)
89
- assert_equal 1, r.zadd("foo", [2, "s1", 3, "s2", 4, "s3"], :nx => true)
90
- assert_equal 1, r.zscore("foo", "s1")
91
- assert_equal 2, r.zscore("foo", "s2")
92
- assert_equal 4, r.zscore("foo", "s3")
93
- assert_equal 3, r.zcard("foo")
94
- r.del "foo"
95
-
96
- # CH option
97
- assert_equal 0, r.zcard("foo")
98
- assert_equal 2, r.zadd("foo", [1, "s1", 2, "s2"], :ch => true)
99
- assert_equal 2, r.zadd("foo", [1, "s1", 3, "s2", 4, "s3"], :ch => true)
100
- assert_equal 3, r.zcard("foo")
101
- r.del "foo"
102
-
103
- # INCR option
104
- assert_equal 1.0, r.zadd("foo", [1, "s1"], :incr => true)
105
- assert_equal 11.0, r.zadd("foo", [10, "s1"], :incr => true)
106
- assert_equal(-Infinity, r.zadd("bar", ["-inf", "s1"], :incr => true))
107
- assert_equal(+Infinity, r.zadd("bar", ["+inf", "s2"], :incr => true))
108
- assert_raise(Redis::CommandError) { r.zadd("foo", [1, "s1", 2, "s2"], :incr => true) }
109
- r.del "foo", "bar"
110
-
111
- # Incompatible options combination
112
- assert_raise(Redis::CommandError) { r.zadd("foo", [1, "s1"], :xx => true, :nx => true) }
113
- end
114
- end
115
-
116
- def test_zrem
117
- r.zadd("foo", 1, "s1")
118
- r.zadd("foo", 2, "s2")
119
-
120
- assert_equal 2, r.zcard("foo")
121
- assert_equal true, r.zrem("foo", "s1")
122
- assert_equal false, r.zrem("foo", "s1")
123
- assert_equal 1, r.zcard("foo")
124
- end
125
-
126
- def test_variadic_zrem
127
- target_version "2.3.9" do # 2.4-rc6
128
- r.zadd("foo", 1, "s1")
129
- r.zadd("foo", 2, "s2")
130
- r.zadd("foo", 3, "s3")
131
-
132
- assert_equal 3, r.zcard("foo")
133
- assert_equal 1, r.zrem("foo", ["s1", "aaa"])
134
- assert_equal 0, r.zrem("foo", ["bbb", "ccc" "ddd"])
135
- assert_equal 1, r.zrem("foo", ["eee", "s3"])
136
- assert_equal 1, r.zcard("foo")
137
- end
138
- end
139
-
140
- def test_zincrby
141
- rv = r.zincrby "foo", 1, "s1"
142
- assert_equal 1.0, rv
143
-
144
- rv = r.zincrby "foo", 10, "s1"
145
- assert_equal 11.0, rv
146
-
147
- rv = r.zincrby "bar", "-inf", "s1"
148
- assert_equal(-Infinity, rv)
149
-
150
- rv = r.zincrby "bar", "+inf", "s2"
151
- assert_equal(+Infinity, rv)
152
- end
153
-
154
- def test_zrank
155
- r.zadd "foo", 1, "s1"
156
- r.zadd "foo", 2, "s2"
157
- r.zadd "foo", 3, "s3"
158
-
159
- assert_equal 2, r.zrank("foo", "s3")
160
- end
161
-
162
- def test_zrevrank
163
- r.zadd "foo", 1, "s1"
164
- r.zadd "foo", 2, "s2"
165
- r.zadd "foo", 3, "s3"
166
-
167
- assert_equal 0, r.zrevrank("foo", "s3")
168
- end
169
-
170
- def test_zrange
171
- r.zadd "foo", 1, "s1"
172
- r.zadd "foo", 2, "s2"
173
- r.zadd "foo", 3, "s3"
174
-
175
- assert_equal ["s1", "s2"], r.zrange("foo", 0, 1)
176
- assert_equal [["s1", 1.0], ["s2", 2.0]], r.zrange("foo", 0, 1, :with_scores => true)
177
- assert_equal [["s1", 1.0], ["s2", 2.0]], r.zrange("foo", 0, 1, :withscores => true)
178
-
179
- r.zadd "bar", "-inf", "s1"
180
- r.zadd "bar", "+inf", "s2"
181
- assert_equal [["s1", -Infinity], ["s2", +Infinity]], r.zrange("bar", 0, 1, :with_scores => true)
182
- assert_equal [["s1", -Infinity], ["s2", +Infinity]], r.zrange("bar", 0, 1, :withscores => true)
183
- end
184
-
185
- def test_zrevrange
186
- r.zadd "foo", 1, "s1"
187
- r.zadd "foo", 2, "s2"
188
- r.zadd "foo", 3, "s3"
189
-
190
- assert_equal ["s3", "s2"], r.zrevrange("foo", 0, 1)
191
- assert_equal [["s3", 3.0], ["s2", 2.0]], r.zrevrange("foo", 0, 1, :with_scores => true)
192
- assert_equal [["s3", 3.0], ["s2", 2.0]], r.zrevrange("foo", 0, 1, :withscores => true)
193
-
194
- r.zadd "bar", "-inf", "s1"
195
- r.zadd "bar", "+inf", "s2"
196
- assert_equal [["s2", +Infinity], ["s1", -Infinity]], r.zrevrange("bar", 0, 1, :with_scores => true)
197
- assert_equal [["s2", +Infinity], ["s1", -Infinity]], r.zrevrange("bar", 0, 1, :withscores => true)
198
- end
199
-
200
- def test_zrangebyscore
201
- r.zadd "foo", 1, "s1"
202
- r.zadd "foo", 2, "s2"
203
- r.zadd "foo", 3, "s3"
204
-
205
- assert_equal ["s2", "s3"], r.zrangebyscore("foo", 2, 3)
206
- end
207
-
208
- def test_zrevrangebyscore
209
- r.zadd "foo", 1, "s1"
210
- r.zadd "foo", 2, "s2"
211
- r.zadd "foo", 3, "s3"
212
-
213
- assert_equal ["s3", "s2"], r.zrevrangebyscore("foo", 3, 2)
214
- end
215
-
216
- def test_zrangebyscore_with_limit
217
- r.zadd "foo", 1, "s1"
218
- r.zadd "foo", 2, "s2"
219
- r.zadd "foo", 3, "s3"
220
- r.zadd "foo", 4, "s4"
221
-
222
- assert_equal ["s2"], r.zrangebyscore("foo", 2, 4, :limit => [0, 1])
223
- assert_equal ["s3"], r.zrangebyscore("foo", 2, 4, :limit => [1, 1])
224
- assert_equal ["s3", "s4"], r.zrangebyscore("foo", 2, 4, :limit => [1, 2])
225
- end
226
-
227
- def test_zrevrangebyscore_with_limit
228
- r.zadd "foo", 1, "s1"
229
- r.zadd "foo", 2, "s2"
230
- r.zadd "foo", 3, "s3"
231
- r.zadd "foo", 4, "s4"
232
-
233
- assert_equal ["s4"], r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1])
234
- assert_equal ["s3"], r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1])
235
- assert_equal ["s3", "s2"], r.zrevrangebyscore("foo", 4, 2, :limit => [1, 2])
236
- end
237
-
238
- def test_zrangebyscore_with_withscores
239
- r.zadd "foo", 1, "s1"
240
- r.zadd "foo", 2, "s2"
241
- r.zadd "foo", 3, "s3"
242
- r.zadd "foo", 4, "s4"
243
-
244
- assert_equal [["s2", 2.0]], r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :with_scores => true)
245
- assert_equal [["s3", 3.0]], r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :with_scores => true)
246
- assert_equal [["s2", 2.0]], r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :withscores => true)
247
- assert_equal [["s3", 3.0]], r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :withscores => true)
248
-
249
- r.zadd "bar", "-inf", "s1"
250
- r.zadd "bar", "+inf", "s2"
251
- assert_equal [["s1", -Infinity]], r.zrangebyscore("bar", -Infinity, +Infinity, :limit => [0, 1], :with_scores => true)
252
- assert_equal [["s2", +Infinity]], r.zrangebyscore("bar", -Infinity, +Infinity, :limit => [1, 1], :with_scores => true)
253
- assert_equal [["s1", -Infinity]], r.zrangebyscore("bar", -Infinity, +Infinity, :limit => [0, 1], :withscores => true)
254
- assert_equal [["s2", +Infinity]], r.zrangebyscore("bar", -Infinity, +Infinity, :limit => [1, 1], :withscores => true)
255
- end
256
-
257
- def test_zrevrangebyscore_with_withscores
258
- r.zadd "foo", 1, "s1"
259
- r.zadd "foo", 2, "s2"
260
- r.zadd "foo", 3, "s3"
261
- r.zadd "foo", 4, "s4"
262
-
263
- assert_equal [["s4", 4.0]], r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :with_scores => true)
264
- assert_equal [["s3", 3.0]], r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :with_scores => true)
265
- assert_equal [["s4", 4.0]], r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :withscores => true)
266
- assert_equal [["s3", 3.0]], r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :withscores => true)
267
-
268
- r.zadd "bar", "-inf", "s1"
269
- r.zadd "bar", "+inf", "s2"
270
- assert_equal [["s2", +Infinity]], r.zrevrangebyscore("bar", +Infinity, -Infinity, :limit => [0, 1], :with_scores => true)
271
- assert_equal [["s1", -Infinity]], r.zrevrangebyscore("bar", +Infinity, -Infinity, :limit => [1, 1], :with_scores => true)
272
- assert_equal [["s2", +Infinity]], r.zrevrangebyscore("bar", +Infinity, -Infinity, :limit => [0, 1], :withscores => true)
273
- assert_equal [["s1", -Infinity]], r.zrevrangebyscore("bar", +Infinity, -Infinity, :limit => [1, 1], :withscores => true)
274
- end
275
-
276
- def test_zcard
277
- assert_equal 0, r.zcard("foo")
278
-
279
- r.zadd "foo", 1, "s1"
280
-
281
- assert_equal 1, r.zcard("foo")
282
- end
283
-
284
- def test_zscore
285
- r.zadd "foo", 1, "s1"
286
-
287
- assert_equal 1.0, r.zscore("foo", "s1")
288
-
289
- assert_equal nil, r.zscore("foo", "s2")
290
- assert_equal nil, r.zscore("bar", "s1")
291
-
292
- r.zadd "bar", "-inf", "s1"
293
- r.zadd "bar", "+inf", "s2"
294
- assert_equal(-Infinity, r.zscore("bar", "s1"))
295
- assert_equal(+Infinity, r.zscore("bar", "s2"))
296
- end
297
-
298
- def test_zremrangebyrank
299
- r.zadd "foo", 10, "s1"
300
- r.zadd "foo", 20, "s2"
301
- r.zadd "foo", 30, "s3"
302
- r.zadd "foo", 40, "s4"
303
-
304
- assert_equal 3, r.zremrangebyrank("foo", 1, 3)
305
- assert_equal ["s1"], r.zrange("foo", 0, -1)
306
- end
307
-
308
- def test_zremrangebyscore
309
- r.zadd "foo", 1, "s1"
310
- r.zadd "foo", 2, "s2"
311
- r.zadd "foo", 3, "s3"
312
- r.zadd "foo", 4, "s4"
313
-
314
- assert_equal 3, r.zremrangebyscore("foo", 2, 4)
315
- assert_equal ["s1"], r.zrange("foo", 0, -1)
316
- end
317
-
318
- def test_zrangebylex
319
- target_version "2.8.9" do
320
- r.zadd "foo", 0, "aaren"
321
- r.zadd "foo", 0, "abagael"
322
- r.zadd "foo", 0, "abby"
323
- r.zadd "foo", 0, "abbygail"
324
-
325
- assert_equal ["aaren", "abagael", "abby", "abbygail"], r.zrangebylex("foo", "[a", "[a\xff")
326
- assert_equal ["aaren", "abagael"], r.zrangebylex("foo", "[a", "[a\xff", :limit => [0, 2])
327
- assert_equal ["abby", "abbygail"], r.zrangebylex("foo", "(abb", "(abb\xff")
328
- assert_equal ["abbygail"], r.zrangebylex("foo", "(abby", "(abby\xff")
329
- end
330
- end
331
-
332
- def test_zrevrangebylex
333
- target_version "2.9.9" do
334
- r.zadd "foo", 0, "aaren"
335
- r.zadd "foo", 0, "abagael"
336
- r.zadd "foo", 0, "abby"
337
- r.zadd "foo", 0, "abbygail"
338
-
339
- assert_equal ["abbygail", "abby", "abagael", "aaren"], r.zrevrangebylex("foo", "[a\xff", "[a")
340
- assert_equal ["abbygail", "abby"], r.zrevrangebylex("foo", "[a\xff", "[a", :limit => [0, 2])
341
- assert_equal ["abbygail", "abby"], r.zrevrangebylex("foo", "(abb\xff", "(abb")
342
- assert_equal ["abbygail"], r.zrevrangebylex("foo", "(abby\xff", "(abby")
343
- end
344
- end
345
-
346
- def test_zcount
347
- r.zadd "foo", 1, "s1"
348
- r.zadd "foo", 2, "s2"
349
- r.zadd "foo", 3, "s3"
350
-
351
- assert_equal 2, r.zcount("foo", 2, 3)
352
- end
353
-
354
- def test_zunionstore
355
- r.zadd "foo", 1, "s1"
356
- r.zadd "bar", 2, "s2"
357
- r.zadd "foo", 3, "s3"
358
- r.zadd "bar", 4, "s4"
359
-
360
- assert_equal 4, r.zunionstore("foobar", ["foo", "bar"])
361
- assert_equal ["s1", "s2", "s3", "s4"], r.zrange("foobar", 0, -1)
362
- end
363
-
364
- def test_zunionstore_with_weights
365
- r.zadd "foo", 1, "s1"
366
- r.zadd "foo", 3, "s3"
367
- r.zadd "bar", 20, "s2"
368
- r.zadd "bar", 40, "s4"
369
-
370
- assert_equal 4, r.zunionstore("foobar", ["foo", "bar"])
371
- assert_equal ["s1", "s3", "s2", "s4"], r.zrange("foobar", 0, -1)
372
-
373
- assert_equal 4, r.zunionstore("foobar", ["foo", "bar"], :weights => [10, 1])
374
- assert_equal ["s1", "s2", "s3", "s4"], r.zrange("foobar", 0, -1)
375
- end
376
-
377
- def test_zunionstore_with_aggregate
378
- r.zadd "foo", 1, "s1"
379
- r.zadd "foo", 2, "s2"
380
- r.zadd "bar", 4, "s2"
381
- r.zadd "bar", 3, "s3"
382
-
383
- assert_equal 3, r.zunionstore("foobar", ["foo", "bar"])
384
- assert_equal ["s1", "s3", "s2"], r.zrange("foobar", 0, -1)
385
-
386
- assert_equal 3, r.zunionstore("foobar", ["foo", "bar"], :aggregate => :min)
387
- assert_equal ["s1", "s2", "s3"], r.zrange("foobar", 0, -1)
388
-
389
- assert_equal 3, r.zunionstore("foobar", ["foo", "bar"], :aggregate => :max)
390
- assert_equal ["s1", "s3", "s2"], r.zrange("foobar", 0, -1)
391
- end
392
-
393
- def test_zinterstore
394
- r.zadd "foo", 1, "s1"
395
- r.zadd "bar", 2, "s1"
396
- r.zadd "foo", 3, "s3"
397
- r.zadd "bar", 4, "s4"
398
-
399
- assert_equal 1, r.zinterstore("foobar", ["foo", "bar"])
400
- assert_equal ["s1"], r.zrange("foobar", 0, -1)
401
- end
402
-
403
- def test_zinterstore_with_weights
404
- r.zadd "foo", 1, "s1"
405
- r.zadd "foo", 2, "s2"
406
- r.zadd "foo", 3, "s3"
407
- r.zadd "bar", 20, "s2"
408
- r.zadd "bar", 30, "s3"
409
- r.zadd "bar", 40, "s4"
410
-
411
- assert_equal 2, r.zinterstore("foobar", ["foo", "bar"])
412
- assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
413
-
414
- assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :weights => [10, 1])
415
- assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
416
-
417
- assert_equal 40.0, r.zscore("foobar", "s2")
418
- assert_equal 60.0, r.zscore("foobar", "s3")
419
- end
420
-
421
- def test_zinterstore_with_aggregate
422
- r.zadd "foo", 1, "s1"
423
- r.zadd "foo", 2, "s2"
424
- r.zadd "foo", 3, "s3"
425
- r.zadd "bar", 20, "s2"
426
- r.zadd "bar", 30, "s3"
427
- r.zadd "bar", 40, "s4"
428
-
429
- assert_equal 2, r.zinterstore("foobar", ["foo", "bar"])
430
- assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
431
- assert_equal 22.0, r.zscore("foobar", "s2")
432
- assert_equal 33.0, r.zscore("foobar", "s3")
433
-
434
- assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :aggregate => :min)
435
- assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
436
- assert_equal 2.0, r.zscore("foobar", "s2")
437
- assert_equal 3.0, r.zscore("foobar", "s3")
438
-
439
- assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :aggregate => :max)
440
- assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
441
- assert_equal 20.0, r.zscore("foobar", "s2")
442
- assert_equal 30.0, r.zscore("foobar", "s3")
443
- end
444
- end