Skip to content

Commit 787462e

Browse files
authored
Merge pull request #1130 from casperisfine/sadd-and-co-boolean
Make `sadd` and `srem` always return an Integer. Add `sadd?` and `srem?`
2 parents 9d49a83 + 4c34f86 commit 787462e

File tree

15 files changed

+188
-97
lines changed

15 files changed

+188
-97
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
# Unreleased 5.0.0
44

55
- Use `MD5` for hashing server nodes in `Redis::Distributed`. This should improve keys distribution among servers. See #1089.
6+
- Changed `sadd` and `srem` to now always return an Integer.
7+
- Added `sadd?` and `srem?` which always return a Boolean.
68
- Cluster support has been moved to a `redis_cluster` companion gem.
79
- `select` no longer record the current database. If the client has to reconnect after `select` was used, it will reconnect to the original database.
810
- Better support Float timeout in blocking commands. See #977.

lib/redis/commands.rb

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,7 @@ module Commands
4040
# where the method call will return nil. Propagate the nil instead of falsely
4141
# returning false.
4242
Boolify = lambda { |value|
43-
case value
44-
when 1
45-
true
46-
when 0
47-
false
48-
else
49-
value
50-
end
43+
value != 0 unless value.nil?
5144
}
5245

5346
BoolifySet = lambda { |value|

lib/redis/commands/bitmaps.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ def bitcount(key, start = 0, stop = -1)
3939
# @param [String, Array<String>] keys one or more source keys to perform `operation`
4040
# @return [Integer] the length of the string stored in `destkey`
4141
def bitop(operation, destkey, *keys)
42-
send_command([:bitop, operation, destkey, *keys])
42+
keys.flatten!(1)
43+
command = [:bitop, operation, destkey]
44+
command.concat(keys)
45+
send_command(command)
4346
end
4447

4548
# Return the position of the first bit set to 1 or 0 in a string.

lib/redis/commands/hashes.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ def hget(key, field)
8787
#
8888
# @see #mapped_hmget
8989
def hmget(key, *fields, &blk)
90-
send_command([:hmget, key] + fields, &blk)
90+
fields.flatten!(1)
91+
send_command([:hmget, key].concat(fields), &blk)
9192
end
9293

9394
# Get the values of all the given hash fields.
@@ -102,7 +103,8 @@ def hmget(key, *fields, &blk)
102103
#
103104
# @see #hmget
104105
def mapped_hmget(key, *fields)
105-
hmget(key, *fields) do |reply|
106+
fields.flatten!(1)
107+
hmget(key, fields) do |reply|
106108
if reply.is_a?(Array)
107109
Hash[fields.zip(reply)]
108110
else
@@ -152,7 +154,8 @@ def hrandfield(key, count = nil, withvalues: false, with_values: withvalues)
152154
# @param [String, Array<String>] field
153155
# @return [Integer] the number of fields that were removed from the hash
154156
def hdel(key, *fields)
155-
send_command([:hdel, key, *fields])
157+
fields.flatten!(1)
158+
send_command([:hdel, key].concat(fields))
156159
end
157160

158161
# Determine if a hash field exists.

lib/redis/commands/lists.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ def _bpop(cmd, args, &blk)
260260
raise ArgumentError, "timeout must be an Integer or Float, got: #{timeout.class}"
261261
end
262262

263-
command = [cmd]
264-
command.concat(args.flatten)
263+
args.flatten!(1)
264+
command = [cmd].concat(args)
265265
command << timeout
266266
send_blocking_command(command, timeout, &blk)
267267
end

lib/redis/commands/sets.rb

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,40 @@ def scard(key)
1515
#
1616
# @param [String] key
1717
# @param [String, Array<String>] member one member, or array of members
18-
# @return [Boolean, Integer] `Boolean` when a single member is specified,
19-
# holding whether or not adding the member succeeded, or `Integer` when an
20-
# array of members is specified, holding the number of members that were
21-
# successfully added
22-
def sadd(key, member)
23-
send_command([:sadd, key, member]) do |reply|
24-
if member.is_a? Array
25-
# Variadic: return integer
26-
reply
27-
else
28-
# Single argument: return boolean
29-
Boolify.call(reply)
30-
end
31-
end
18+
# @return [Integer] The number of members that were successfully added
19+
def sadd(key, *members)
20+
members.flatten!(1)
21+
send_command([:sadd, key].concat(members))
22+
end
23+
24+
# Add one or more members to a set.
25+
#
26+
# @param [String] key
27+
# @param [String, Array<String>] member one member, or array of members
28+
# @return [Boolean] Wether at least one member was successfully added.
29+
def sadd?(key, *members)
30+
members.flatten!(1)
31+
send_command([:sadd, key].concat(members), &Boolify)
3232
end
3333

3434
# Remove one or more members from a set.
3535
#
3636
# @param [String] key
3737
# @param [String, Array<String>] member one member, or array of members
38-
# @return [Boolean, Integer] `Boolean` when a single member is specified,
39-
# holding whether or not removing the member succeeded, or `Integer` when an
40-
# array of members is specified, holding the number of members that were
41-
# successfully removed
42-
def srem(key, member)
43-
send_command([:srem, key, member]) do |reply|
44-
if member.is_a? Array
45-
# Variadic: return integer
46-
reply
47-
else
48-
# Single argument: return boolean
49-
Boolify.call(reply)
50-
end
51-
end
38+
# @return [Integer] The number of members that were successfully removed
39+
def srem(key, *members)
40+
members.flatten!(1)
41+
send_command([:srem, key].concat(members))
42+
end
43+
44+
# Remove one or more members from a set.
45+
#
46+
# @param [String] key
47+
# @param [String, Array<String>] member one member, or array of members
48+
# @return [Boolean] Wether at least one member was successfully removed.
49+
def srem?(key, *members)
50+
members.flatten!(1)
51+
send_command([:srem, key].concat(members), &Boolify)
5252
end
5353

5454
# Remove and return one or more random member from a set.
@@ -102,7 +102,8 @@ def sismember(key, member)
102102
# @param [String, Array<String>] members
103103
# @return [Array<Boolean>]
104104
def smismember(key, *members)
105-
send_command([:smismember, key, *members]) do |reply|
105+
members.flatten!(1)
106+
send_command([:smismember, key].concat(members)) do |reply|
106107
reply.map(&Boolify)
107108
end
108109
end
@@ -120,7 +121,8 @@ def smembers(key)
120121
# @param [String, Array<String>] keys keys pointing to sets to subtract
121122
# @return [Array<String>] members in the difference
122123
def sdiff(*keys)
123-
send_command([:sdiff, *keys])
124+
keys.flatten!(1)
125+
send_command([:sdiff].concat(keys))
124126
end
125127

126128
# Subtract multiple sets and store the resulting set in a key.
@@ -129,15 +131,17 @@ def sdiff(*keys)
129131
# @param [String, Array<String>] keys keys pointing to sets to subtract
130132
# @return [Integer] number of elements in the resulting set
131133
def sdiffstore(destination, *keys)
132-
send_command([:sdiffstore, destination, *keys])
134+
keys.flatten!(1)
135+
send_command([:sdiffstore, destination].concat(keys))
133136
end
134137

135138
# Intersect multiple sets.
136139
#
137140
# @param [String, Array<String>] keys keys pointing to sets to intersect
138141
# @return [Array<String>] members in the intersection
139142
def sinter(*keys)
140-
send_command([:sinter, *keys])
143+
keys.flatten!(1)
144+
send_command([:sinter].concat(keys))
141145
end
142146

143147
# Intersect multiple sets and store the resulting set in a key.
@@ -146,15 +150,17 @@ def sinter(*keys)
146150
# @param [String, Array<String>] keys keys pointing to sets to intersect
147151
# @return [Integer] number of elements in the resulting set
148152
def sinterstore(destination, *keys)
149-
send_command([:sinterstore, destination, *keys])
153+
keys.flatten!(1)
154+
send_command([:sinterstore, destination].concat(keys))
150155
end
151156

152157
# Add multiple sets.
153158
#
154159
# @param [String, Array<String>] keys keys pointing to sets to unify
155160
# @return [Array<String>] members in the union
156161
def sunion(*keys)
157-
send_command([:sunion, *keys])
162+
keys.flatten!(1)
163+
send_command([:sunion].concat(keys))
158164
end
159165

160166
# Add multiple sets and store the resulting set in a key.
@@ -163,7 +169,8 @@ def sunion(*keys)
163169
# @param [String, Array<String>] keys keys pointing to sets to unify
164170
# @return [Integer] number of elements in the resulting set
165171
def sunionstore(destination, *keys)
166-
send_command([:sunionstore, destination, *keys])
172+
keys.flatten!(1)
173+
send_command([:sunionstore, destination].concat(keys))
167174
end
168175

169176
# Scan a set

lib/redis/commands/sorted_sets.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,8 @@ def zscan_each(key, **options, &block)
778778
private
779779

780780
def _zsets_operation(cmd, *keys, weights: nil, aggregate: nil, with_scores: false)
781-
command = [cmd, keys.size, *keys]
781+
keys.flatten!(1)
782+
command = [cmd, keys.size].concat(keys)
782783

783784
if weights
784785
command << "WEIGHTS"
@@ -796,7 +797,8 @@ def _zsets_operation(cmd, *keys, weights: nil, aggregate: nil, with_scores: fals
796797
end
797798

798799
def _zsets_operation_store(cmd, destination, keys, weights: nil, aggregate: nil)
799-
command = [cmd, destination, keys.size, *keys]
800+
keys.flatten!(1)
801+
command = [cmd, destination, keys.size].concat(keys)
800802

801803
if weights
802804
command << "WEIGHTS"

lib/redis/commands/strings.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def get(key)
202202
#
203203
# @see #mapped_mget
204204
def mget(*keys, &blk)
205+
keys.flatten!(1)
205206
send_command([:mget, *keys], &blk)
206207
end
207208

0 commit comments

Comments
 (0)