Skip to content

Commit 1e577fa

Browse files
authored
Merge pull request #337 from sandyharvie/add-smismember-command
add SMISMEMBER command
2 parents 082add4 + e2d0a2a commit 1e577fa

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

cmd_set.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func commandsSet(m *Miniredis) {
2020
m.srv.Register("SINTERSTORE", m.cmdSinterstore)
2121
m.srv.Register("SISMEMBER", m.cmdSismember)
2222
m.srv.Register("SMEMBERS", m.cmdSmembers)
23+
m.srv.Register("SMISMEMBER", m.cmdSmismember)
2324
m.srv.Register("SMOVE", m.cmdSmove)
2425
m.srv.Register("SPOP", m.cmdSpop)
2526
m.srv.Register("SRANDMEMBER", m.cmdSrandmember)
@@ -293,6 +294,50 @@ func (m *Miniredis) cmdSmembers(c *server.Peer, cmd string, args []string) {
293294
})
294295
}
295296

297+
// SMISMEMBER
298+
func (m *Miniredis) cmdSmismember(c *server.Peer, cmd string, args []string) {
299+
if len(args) < 2 {
300+
setDirty(c)
301+
c.WriteError(errWrongNumber(cmd))
302+
return
303+
}
304+
if !m.handleAuth(c) {
305+
return
306+
}
307+
if m.checkPubsub(c, cmd) {
308+
return
309+
}
310+
311+
key, values := args[0], args[1:]
312+
313+
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
314+
db := m.db(ctx.selectedDB)
315+
316+
if !db.exists(key) {
317+
c.WriteLen(len(values))
318+
for range values {
319+
c.WriteInt(0)
320+
}
321+
return
322+
}
323+
324+
if db.t(key) != "set" {
325+
c.WriteError(ErrWrongType.Error())
326+
return
327+
}
328+
329+
c.WriteLen(len(values))
330+
for _, value := range values {
331+
if db.setIsMember(key, value) {
332+
c.WriteInt(1)
333+
} else {
334+
c.WriteInt(0)
335+
}
336+
}
337+
return
338+
})
339+
}
340+
296341
// SMOVE
297342
func (m *Miniredis) cmdSmove(c *server.Peer, cmd string, args []string) {
298343
if len(args) != 3 {

cmd_set_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,37 @@ func TestSismember(t *testing.T) {
148148
})
149149
}
150150

151+
// Test SMISMEMBER
152+
func TestSmismember(t *testing.T) {
153+
s, err := Run()
154+
ok(t, err)
155+
defer s.Close()
156+
c, err := proto.Dial(s.Addr())
157+
ok(t, err)
158+
defer c.Close()
159+
160+
s.SetAdd("s", "aap", "noot", "mies")
161+
162+
mustDo(t, c, "SMISMEMBER", "s", "aap", "nosuch", "mies", proto.Ints(1, 0, 1))
163+
mustDo(t, c, "SMISMEMBER", "q", "aap", "nosuch", "mies", proto.Ints(0, 0, 0))
164+
165+
t.Run("errors", func(t *testing.T) {
166+
mustOK(t, c, "SET", "str", "value")
167+
mustDo(t, c,
168+
"SMISMEMBER", "str", "foo",
169+
proto.Error(msgWrongType),
170+
)
171+
mustDo(t, c,
172+
"SMISMEMBER",
173+
proto.Error(errWrongNumber("smismember")),
174+
)
175+
mustDo(t, c,
176+
"SMISMEMBER", "set",
177+
proto.Error(errWrongNumber("smismember")),
178+
)
179+
})
180+
}
181+
151182
// Test SREM
152183
func TestSrem(t *testing.T) {
153184
s, err := Run()

integration/set_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ func TestSet(t *testing.T) {
1616
c.DoSorted("SMEMBERS", "nosuch")
1717
c.Do("SISMEMBER", "s", "aap")
1818
c.Do("SISMEMBER", "s", "nosuch")
19+
c.Do("SMISMEMBER", "s", "aap", "noot", "nosuch")
1920

2021
c.Do("SCARD", "nosuch")
2122
c.Do("SISMEMBER", "nosuch", "nosuch")
23+
c.Do("SMISMEMBER", "nosuch", "nosuch", "nosuch")
2224

2325
// failure cases
2426
c.Error("wrong number", "SADD")
@@ -30,11 +32,14 @@ func TestSet(t *testing.T) {
3032
c.Error("wrong number", "SISMEMBER")
3133
c.Error("wrong number", "SISMEMBER", "few")
3234
c.Error("wrong number", "SISMEMBER", "too", "many", "arguments")
35+
c.Error("wrong number", "SMISMEMBER")
36+
c.Error("wrong number", "SMISMEMBER", "few")
3337
// Wrong type
3438
c.Do("SET", "str", "I am a string")
3539
c.Error("wrong kind", "SADD", "str", "noot", "mies")
3640
c.Error("wrong kind", "SMEMBERS", "str")
3741
c.Error("wrong kind", "SISMEMBER", "str", "noot")
42+
c.Error("wrong kind", "SMISMEMBER", "str", "noot")
3843
c.Error("wrong kind", "SCARD", "str")
3944
})
4045

@@ -44,6 +49,7 @@ func TestSet(t *testing.T) {
4449
c.Do("SMEMBERS", "q")
4550
c.Do("SISMEMBER", "q", "aap")
4651
c.Do("SISMEMBER", "q", "noot")
52+
c.Do("SMISMEMBER", "q", "aap", "noot", "nosuch")
4753
})
4854
}
4955

0 commit comments

Comments
 (0)