diff --git a/commands.go b/commands.go index b259e3a..9954cab 100644 --- a/commands.go +++ b/commands.go @@ -206,6 +206,8 @@ type Cmdable interface { ZLexCount(key, min, max string) *IntCmd ZIncrBy(key string, increment float64, member string) *FloatCmd ZInterStore(destination string, store ZStore, keys ...string) *IntCmd + ZPopMax(key string, count ...int64) *ZSliceCmd + ZPopMin(key string, count ...int64) *ZSliceCmd ZRange(key string, start, stop int64) *StringSliceCmd ZRangeWithScores(key string, start, stop int64) *ZSliceCmd ZRangeByScore(key string, opt ZRangeBy) *StringSliceCmd @@ -1694,6 +1696,46 @@ func (c *cmdable) ZInterStore(destination string, store ZStore, keys ...string) return cmd } +func (c *cmdable) ZPopMax(key string, count ...int64) *ZSliceCmd { + args := []interface{}{ + "zpopmax", + key, + } + + switch len(count) { + case 0: + break + case 1: + args = append(args, count[0]) + default: + panic("too many arguments") + } + + cmd := NewZSliceCmd(args...) + c.process(cmd) + return cmd +} + +func (c *cmdable) ZPopMin(key string, count ...int64) *ZSliceCmd { + args := []interface{}{ + "zpopmin", + key, + } + + switch len(count) { + case 0: + break + case 1: + args = append(args, count[0]) + default: + panic("too many arguments") + } + + cmd := NewZSliceCmd(args...) + c.process(cmd) + return cmd +} + func (c *cmdable) zRange(key string, start, stop int64, withScores bool) *StringSliceCmd { args := []interface{}{ "zrange", diff --git a/commands_test.go b/commands_test.go index 955621d..d0c8e57 100644 --- a/commands_test.go +++ b/commands_test.go @@ -2518,6 +2518,135 @@ var _ = Describe("Commands", func() { }})) }) + It("should ZPopMax", func() { + err := client.ZAdd("zset", redis.Z{ + Score: 1, + Member: "one", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 2, + Member: "two", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 3, + Member: "three", + }).Err() + Expect(err).NotTo(HaveOccurred()) + + members, err := client.ZPopMax("zset").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 3, + Member: "three", + }})) + + // adding back 3 + err = client.ZAdd("zset", redis.Z{ + Score: 3, + Member: "three", + }).Err() + Expect(err).NotTo(HaveOccurred()) + members, err = client.ZPopMax("zset", 2).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 3, + Member: "three", + }, { + Score: 2, + Member: "two", + }})) + + // adding back 2 & 3 + err = client.ZAdd("zset", redis.Z{ + Score: 3, + Member: "three", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 2, + Member: "two", + }).Err() + Expect(err).NotTo(HaveOccurred()) + members, err = client.ZPopMax("zset", 10).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 3, + Member: "three", + }, { + Score: 2, + Member: "two", + }, { + Score: 1, + Member: "one", + }})) + }) + + It("should ZPopMin", func() { + err := client.ZAdd("zset", redis.Z{ + Score: 1, + Member: "one", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 2, + Member: "two", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 3, + Member: "three", + }).Err() + Expect(err).NotTo(HaveOccurred()) + + members, err := client.ZPopMin("zset").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 1, + Member: "one", + }})) + + // adding back 1 + err = client.ZAdd("zset", redis.Z{ + Score: 1, + Member: "one", + }).Err() + Expect(err).NotTo(HaveOccurred()) + members, err = client.ZPopMin("zset", 2).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 1, + Member: "one", + }, { + Score: 2, + Member: "two", + }})) + + // adding back 1 & 2 + err = client.ZAdd("zset", redis.Z{ + Score: 1, + Member: "one", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err = client.ZAdd("zset", redis.Z{ + Score: 2, + Member: "two", + }).Err() + members, err = client.ZPopMin("zset", 10).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(members).To(Equal([]redis.Z{{ + Score: 1, + Member: "one", + }, { + Score: 2, + Member: "two", + }, { + Score: 3, + Member: "three", + }})) + }) + It("should ZRange", func() { err := client.ZAdd("zset", redis.Z{Score: 1, Member: "one"}).Err() Expect(err).NotTo(HaveOccurred())