oxblood 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +13 -0
- data/README.md +4 -11
- data/lib/oxblood/commands/hashes.rb +21 -0
- data/lib/oxblood/commands/hyper_log_log.rb +1 -1
- data/lib/oxblood/commands/keys.rb +21 -0
- data/lib/oxblood/commands/scan.rb +17 -0
- data/lib/oxblood/commands/sets.rb +21 -0
- data/lib/oxblood/commands/sorted_sets.rb +142 -1
- data/lib/oxblood/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 914d269f92807d5e874e813be77ad7a325fa6b86
|
4
|
+
data.tar.gz: e8ec8e0a92d5ccc93a48271b0b44545cdc38a365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a5584d343e12974e664c75b094662c72b0cc63c6c660c1c6f305d8a8d2cd7de2fe6c7361acf648fa1db7da158e532967be0fee053454e9a6ad785eaa63ecc52
|
7
|
+
data.tar.gz: 2d7ca78e83a921687b56de218a0b57a1bac2a262a66fb8c33c1fb630b623691e610e53ecd01063342e363927d02fb4e77d5d084f675faf7746ba49263ee09424
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,2 +1,15 @@
|
|
1
|
+
## 0.2.0 (2017-01-18)
|
2
|
+
* [#13](https://github.com/etehtsea/oxblood/issues/13):
|
3
|
+
Added support for ZRANGEBYLEX/ZREMRANGEBYLEX/ZREVRANGEBYLEX - [@etehtsea](https://github.com/etehtsea)
|
4
|
+
* [#14](https://github.com/etehtsea/oxblood/issues/14):
|
5
|
+
Added support for ZINTERSTORE/ZUNIONSTORE - [@etehtsea](https://github.com/etehtsea)
|
6
|
+
* [#12](https://github.com/etehtsea/oxblood/issues/12):
|
7
|
+
Added support for ZADD options - [@etehtsea](https://github.com/etehtsea)
|
8
|
+
* [#3](https://github.com/etehtsea/oxblood/issues/3),
|
9
|
+
[#8](https://github.com/etehtsea/oxblood/issues/8),
|
10
|
+
[#10](https://github.com/etehtsea/oxblood/issues/10),
|
11
|
+
[#15](https://github.com/etehtsea/oxblood/issues/15):
|
12
|
+
Implemented SCAN, HSCAN, SSCAN, ZSCAN commands - [@etehtsea](https://github.com/etehtsea)
|
13
|
+
|
1
14
|
## 0.1.0 (2017-01-18)
|
2
15
|
* Initial public release - [@etehtsea](https://github.com/etehtsea)
|
data/README.md
CHANGED
@@ -18,15 +18,15 @@ A straightforward Redis Ruby client.
|
|
18
18
|
- Cluster (0/20)
|
19
19
|
- [Connection](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Connection)
|
20
20
|
- Geo (0/6)
|
21
|
-
- [Hashes](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Hashes)
|
21
|
+
- [Hashes](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Hashes)
|
22
22
|
- [HyperLogLog](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/HyperLogLog)
|
23
|
-
- [Keys](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Keys) (
|
23
|
+
- [Keys](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Keys) (19/22) (See [#4], [#6], [#7])
|
24
24
|
- [Lists](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Lists)
|
25
25
|
- Pub/Sub (0/6)
|
26
26
|
- Scripting (0/7)
|
27
27
|
- [Server](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Server) (2/31)
|
28
|
-
- [Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Sets)
|
29
|
-
- [Sorted Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/SortedSets)
|
28
|
+
- [Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Sets)
|
29
|
+
- [Sorted Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/SortedSets)
|
30
30
|
- [Strings](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Strings) (23/24) (See [#16])
|
31
31
|
- [Transactions](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Transactions)
|
32
32
|
- [Pipeling](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pipeline)
|
@@ -48,15 +48,8 @@ Bug reports and pull requests are welcome on [GitHub](https://github.com/etehtse
|
|
48
48
|
## License
|
49
49
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
50
50
|
|
51
|
-
[#3]: https://github.com/etehtsea/oxblood/issues/3
|
52
51
|
[#4]: https://github.com/etehtsea/oxblood/issues/4
|
53
52
|
[#6]: https://github.com/etehtsea/oxblood/issues/6
|
54
53
|
[#7]: https://github.com/etehtsea/oxblood/issues/7
|
55
|
-
[#8]: https://github.com/etehtsea/oxblood/issues/8
|
56
|
-
[#10]: https://github.com/etehtsea/oxblood/issues/10
|
57
|
-
[#12]: https://github.com/etehtsea/oxblood/issues/12
|
58
|
-
[#13]: https://github.com/etehtsea/oxblood/issues/13
|
59
|
-
[#14]: https://github.com/etehtsea/oxblood/issues/14
|
60
|
-
[#15]: https://github.com/etehtsea/oxblood/issues/15
|
61
54
|
[#16]: https://github.com/etehtsea/oxblood/issues/16
|
62
55
|
[#19]: https://github.com/etehtsea/oxblood/issues/19
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'oxblood/commands/scan'
|
2
|
+
|
1
3
|
module Oxblood
|
2
4
|
module Commands
|
3
5
|
module Hashes
|
@@ -166,6 +168,25 @@ module Oxblood
|
|
166
168
|
def hvals(key)
|
167
169
|
run(:HVALS, key)
|
168
170
|
end
|
171
|
+
|
172
|
+
# Incrementally iterate hash fields and associated values
|
173
|
+
# @see https://redis.io/commands/hscan
|
174
|
+
#
|
175
|
+
# @param [Integer] cursor
|
176
|
+
# @param [Hash] opts
|
177
|
+
#
|
178
|
+
# @option opts [Integer] :count Amount of work that should be done at
|
179
|
+
# every call in order to retrieve elements from the collection.
|
180
|
+
# @option opts [String] :match
|
181
|
+
#
|
182
|
+
# @return [Array] two elements array, where the first element is String
|
183
|
+
# representing an unsigned 64 bit number (the cursor), and the second
|
184
|
+
# element is an Array of elements.
|
185
|
+
def hscan(key, cursor, opts = {})
|
186
|
+
args = [:HSCAN, key, cursor]
|
187
|
+
Scan.merge_opts!(args, opts)
|
188
|
+
run(*args)
|
189
|
+
end
|
169
190
|
end
|
170
191
|
end
|
171
192
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'oxblood/commands/scan'
|
2
|
+
|
1
3
|
module Oxblood
|
2
4
|
module Commands
|
3
5
|
module Keys
|
@@ -208,6 +210,25 @@ module Oxblood
|
|
208
210
|
def type(key)
|
209
211
|
run(:TYPE, key)
|
210
212
|
end
|
213
|
+
|
214
|
+
# Incrementally iterate the keys space
|
215
|
+
# @see https://redis.io/commands/scan
|
216
|
+
#
|
217
|
+
# @param [Integer] cursor
|
218
|
+
# @param [Hash] opts
|
219
|
+
#
|
220
|
+
# @option opts [Integer] :count Amount of work that should be done at
|
221
|
+
# every call in order to retrieve elements from the collection.
|
222
|
+
# @option opts [String] :match
|
223
|
+
#
|
224
|
+
# @return [Array] two elements array, where the first element is String
|
225
|
+
# representing an unsigned 64 bit number (the cursor), and the second
|
226
|
+
# element is an Array of elements.
|
227
|
+
def scan(cursor, opts = {})
|
228
|
+
args = [:SCAN, cursor]
|
229
|
+
Scan.merge_opts!(args, opts)
|
230
|
+
run(*args)
|
231
|
+
end
|
211
232
|
end
|
212
233
|
end
|
213
234
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Oxblood
|
2
|
+
module Commands
|
3
|
+
# @api private
|
4
|
+
module Scan
|
5
|
+
# @note Mutates args argument!
|
6
|
+
def self.merge_opts!(args, opts)
|
7
|
+
if v = opts[:count]
|
8
|
+
args.push(:COUNT, v)
|
9
|
+
end
|
10
|
+
|
11
|
+
if v = opts[:match]
|
12
|
+
args.push(:MATCH, v)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'oxblood/commands/scan'
|
2
|
+
|
1
3
|
module Oxblood
|
2
4
|
module Commands
|
3
5
|
module Sets
|
@@ -167,6 +169,25 @@ module Oxblood
|
|
167
169
|
def sunionstore(destination, *keys)
|
168
170
|
run(*keys.unshift(:SUNIONSTORE, destination))
|
169
171
|
end
|
172
|
+
|
173
|
+
# Incrementally iterate Set elements
|
174
|
+
# @see https://redis.io/commands/sscan
|
175
|
+
#
|
176
|
+
# @param [Integer] cursor
|
177
|
+
# @param [Hash] opts
|
178
|
+
#
|
179
|
+
# @option opts [Integer] :count Amount of work that should be done at
|
180
|
+
# every call in order to retrieve elements from the collection.
|
181
|
+
# @option opts [String] :match
|
182
|
+
#
|
183
|
+
# @return [Array] two elements array, where the first element is String
|
184
|
+
# representing an unsigned 64 bit number (the cursor), and the second
|
185
|
+
# element is an Array of elements.
|
186
|
+
def sscan(key, cursor, opts = {})
|
187
|
+
args = [:SSCAN, key, cursor]
|
188
|
+
Scan.merge_opts!(args, opts)
|
189
|
+
run(*args)
|
190
|
+
end
|
170
191
|
end
|
171
192
|
end
|
172
193
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'oxblood/commands/scan'
|
2
|
+
|
1
3
|
module Oxblood
|
2
4
|
module Commands
|
3
5
|
module SortedSets
|
@@ -10,10 +12,25 @@ module Oxblood
|
|
10
12
|
#
|
11
13
|
# @param [String] key under which store set
|
12
14
|
# @param [[Float, String], Array<[Float, String]>] args scores and members
|
15
|
+
# @param [Hash] opts
|
16
|
+
#
|
17
|
+
# @option opts [Boolean] :xx Only update elements that already exist.
|
18
|
+
# Never add elements.
|
19
|
+
# @option opts [Boolean] :nx Don't update already existing elements.
|
20
|
+
# Always add new elements.
|
21
|
+
# @option opts [Boolean] :ch Modify the return value from the number of
|
22
|
+
# new elements added, to the total number of elements changed.
|
23
|
+
# @option opts [Boolean] :incr When this option is specified ZADD acts
|
24
|
+
# like ZINCRBY. Only one score-element pair can be specified in this mode.
|
13
25
|
#
|
14
26
|
# @return [Integer] The number of elements added to the sorted sets, not
|
15
27
|
# including elements already existing for which the score was updated
|
16
|
-
def zadd(key, *args)
|
28
|
+
def zadd(key, *args, **opts)
|
29
|
+
args.unshift(:XX) if opts[:xx]
|
30
|
+
args.unshift(:NX) if opts[:nx]
|
31
|
+
args.unshift(:CH) if opts[:ch]
|
32
|
+
args.unshift(:INCR) if opts[:incr]
|
33
|
+
|
17
34
|
run(*args.unshift(:ZADD, key))
|
18
35
|
end
|
19
36
|
|
@@ -53,6 +70,51 @@ module Oxblood
|
|
53
70
|
run(:ZINCRBY, key, increment, member)
|
54
71
|
end
|
55
72
|
|
73
|
+
# Return a range of members in a sorted set, by lexicographical range.
|
74
|
+
# @see https://redis.io/commands/zrangebylex
|
75
|
+
#
|
76
|
+
# @param [String] key
|
77
|
+
# @param [String] min
|
78
|
+
# @param [String] max
|
79
|
+
# @param [Hash] opts
|
80
|
+
#
|
81
|
+
# @option opts [Array<Integer, Integer>] :limit Get a range of the matching
|
82
|
+
# elements (similar to SELECT LIMIT offset, count in SQL)
|
83
|
+
#
|
84
|
+
# @return [Array<String>] list of elements in the specified score range.
|
85
|
+
def zrangebylex(key, min, max, opts = {})
|
86
|
+
common_rangebylex(:ZRANGEBYLEX, key, min, max, opts)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Remove all members in a sorted set between the given lexicographical range.
|
90
|
+
# @see https://redis.io/commands/zremrangebylex
|
91
|
+
#
|
92
|
+
# @param [String] key
|
93
|
+
# @param [String] min
|
94
|
+
# @param [String] max
|
95
|
+
#
|
96
|
+
# @return [Integer] the number of elements removed.
|
97
|
+
def zremrangebylex(key, min, max)
|
98
|
+
run(:ZREMRANGEBYLEX, key, min, max)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Return a range of members in a sorted set, by lexicographical range, ordered
|
102
|
+
# from higher to lower strings.
|
103
|
+
# @see https://redis.io/commands/zrevrangebylex
|
104
|
+
#
|
105
|
+
# @param [String] key
|
106
|
+
# @param [String] min
|
107
|
+
# @param [String] max
|
108
|
+
# @param [Hash] opts
|
109
|
+
#
|
110
|
+
# @option opts [Array<Integer, Integer>] :limit Get a range of the matching
|
111
|
+
# elements (similar to SELECT LIMIT offset, count in SQL)
|
112
|
+
#
|
113
|
+
# @return [Array<String>] list of elements in the specified score range.
|
114
|
+
def zrevrangebylex(key, min, max, opts = {})
|
115
|
+
common_rangebylex(:ZREVRANGEBYLEX, key, min, max, opts)
|
116
|
+
end
|
117
|
+
|
56
118
|
# Count the number of members in a sorted set between a given
|
57
119
|
# lexicographical range
|
58
120
|
# @see http://redis.io/commands/zlexcount
|
@@ -256,6 +318,64 @@ module Oxblood
|
|
256
318
|
run(:ZSCORE, key, member)
|
257
319
|
end
|
258
320
|
|
321
|
+
# Incrementally iterate sorted sets elements and associated scores
|
322
|
+
# @see https://redis.io/commands/zscan
|
323
|
+
#
|
324
|
+
# @param [Integer] cursor
|
325
|
+
# @param [Hash] opts
|
326
|
+
#
|
327
|
+
# @option opts [Integer] :count Amount of work that should be done at
|
328
|
+
# every call in order to retrieve elements from the collection.
|
329
|
+
# @option opts [String] :match
|
330
|
+
#
|
331
|
+
# @return [Array] two elements array, where the first element is String
|
332
|
+
# representing an unsigned 64 bit number (the cursor), and the second
|
333
|
+
# element is an Array of elements.
|
334
|
+
def zscan(key, cursor, opts = {})
|
335
|
+
args = [:ZSCAN, key, cursor]
|
336
|
+
Scan.merge_opts!(args, opts)
|
337
|
+
run(*args)
|
338
|
+
end
|
339
|
+
|
340
|
+
# Add multiple sorted sets and store the resulting sorted set in a new key
|
341
|
+
# @see https://redis.io/commands/zunionstore
|
342
|
+
#
|
343
|
+
# @param [String] destination key
|
344
|
+
# @param [Integer] numkeys number of sorted sets
|
345
|
+
# @param [String, Array<String>] keys
|
346
|
+
# @param [Hash] opts
|
347
|
+
#
|
348
|
+
# @option opts [Array<Float>] :weights multiplication factor for each
|
349
|
+
# input sorted set.
|
350
|
+
# @option opts [Symbol] :aggregate how the results of the union
|
351
|
+
# are aggregated.
|
352
|
+
#
|
353
|
+
# @return [Integer] the number of elements in the resulting sorted set
|
354
|
+
# at destination.
|
355
|
+
def zunionstore(destination, numkeys, *keys, **opts)
|
356
|
+
common_store(:ZUNIONSTORE, destination, numkeys, keys, opts)
|
357
|
+
end
|
358
|
+
|
359
|
+
# Intersect multiple sorted sets and store the resulting sorted set in
|
360
|
+
# a new key.
|
361
|
+
# @see https://redis.io/commands/zinterstore
|
362
|
+
#
|
363
|
+
# @param [String] destination key
|
364
|
+
# @param [Integer] numkeys number of sorted sets
|
365
|
+
# @param [String, Array<String>] keys
|
366
|
+
# @param [Hash] opts
|
367
|
+
#
|
368
|
+
# @option opts [Array<Float>] :weights multiplication factor for each
|
369
|
+
# input sorted set.
|
370
|
+
# @option opts [Symbol] :aggregate how the results of the union
|
371
|
+
# are aggregated.
|
372
|
+
#
|
373
|
+
# @return [Integer] the number of elements in the resulting sorted set
|
374
|
+
# at destination.
|
375
|
+
def zinterstore(destination, numkeys, *keys, **opts)
|
376
|
+
common_store(:ZINTERSTORE, destination, numkeys, keys, opts)
|
377
|
+
end
|
378
|
+
|
259
379
|
private
|
260
380
|
|
261
381
|
def common_rangebyscore(command_name, key, min, max, opts)
|
@@ -271,6 +391,27 @@ module Oxblood
|
|
271
391
|
args << :WITHSCORES if opts[:withscores]
|
272
392
|
run(*args)
|
273
393
|
end
|
394
|
+
|
395
|
+
def common_store(command_name, destination, numkeys, *keys, **opts)
|
396
|
+
args = keys.unshift(command_name, destination, numkeys)
|
397
|
+
|
398
|
+
if v = opts[:weights]
|
399
|
+
args.push(:WEIGHTS).concat(v)
|
400
|
+
end
|
401
|
+
|
402
|
+
if v = opts[:aggregate]
|
403
|
+
args.push(:AGGREGATE, v)
|
404
|
+
end
|
405
|
+
|
406
|
+
run(*args)
|
407
|
+
end
|
408
|
+
|
409
|
+
def common_rangebylex(command_name, key, min, max, opts)
|
410
|
+
args = [command_name, key, min, max]
|
411
|
+
args.push(:LIMIT).concat(opts[:limit]) if opts[:limit].is_a?(Array)
|
412
|
+
|
413
|
+
run(*args)
|
414
|
+
end
|
274
415
|
end
|
275
416
|
end
|
276
417
|
end
|
data/lib/oxblood/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxblood
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Shabanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/oxblood/commands/hyper_log_log.rb
|
123
123
|
- lib/oxblood/commands/keys.rb
|
124
124
|
- lib/oxblood/commands/lists.rb
|
125
|
+
- lib/oxblood/commands/scan.rb
|
125
126
|
- lib/oxblood/commands/server.rb
|
126
127
|
- lib/oxblood/commands/sets.rb
|
127
128
|
- lib/oxblood/commands/sorted_sets.rb
|