Skip to content

Commit 250f81b

Browse files
authored
Merge pull request #1685 from BenjaminPrieur/master
Add ZMScore cmd
2 parents 7633ade + abb58ff commit 250f81b

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

command.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,55 @@ func (cmd *FloatCmd) readReply(rd *proto.Reader) (err error) {
810810

811811
//------------------------------------------------------------------------------
812812

813+
type FloatSliceCmd struct {
814+
baseCmd
815+
816+
val []float64
817+
}
818+
819+
var _ Cmder = (*FloatSliceCmd)(nil)
820+
821+
func NewFloatSliceCmd(ctx context.Context, args ...interface{}) *FloatSliceCmd {
822+
return &FloatSliceCmd{
823+
baseCmd: baseCmd{
824+
ctx: ctx,
825+
args: args,
826+
},
827+
}
828+
}
829+
830+
func (cmd *FloatSliceCmd) Val() []float64 {
831+
return cmd.val
832+
}
833+
834+
func (cmd *FloatSliceCmd) Result() ([]float64, error) {
835+
return cmd.val, cmd.err
836+
}
837+
838+
func (cmd *FloatSliceCmd) String() string {
839+
return cmdString(cmd, cmd.val)
840+
}
841+
842+
func (cmd *FloatSliceCmd) readReply(rd *proto.Reader) error {
843+
_, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) {
844+
cmd.val = make([]float64, n)
845+
for i := 0; i < len(cmd.val); i++ {
846+
switch num, err := rd.ReadFloatReply(); {
847+
case err == Nil:
848+
cmd.val[i] = 0
849+
case err != nil:
850+
return nil, err
851+
default:
852+
cmd.val[i] = num
853+
}
854+
}
855+
return nil, nil
856+
})
857+
return err
858+
}
859+
860+
//------------------------------------------------------------------------------
861+
813862
type StringSliceCmd struct {
814863
baseCmd
815864

commands.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ type Cmdable interface {
242242
ZLexCount(ctx context.Context, key, min, max string) *IntCmd
243243
ZIncrBy(ctx context.Context, key string, increment float64, member string) *FloatCmd
244244
ZInterStore(ctx context.Context, destination string, store *ZStore) *IntCmd
245+
ZMScore(ctx context.Context, key string, members ...string) *FloatSliceCmd
245246
ZPopMax(ctx context.Context, key string, count ...int64) *ZSliceCmd
246247
ZPopMin(ctx context.Context, key string, count ...int64) *ZSliceCmd
247248
ZRange(ctx context.Context, key string, start, stop int64) *StringSliceCmd
@@ -2010,6 +2011,18 @@ func (c cmdable) ZInterStore(ctx context.Context, destination string, store *ZSt
20102011
return cmd
20112012
}
20122013

2014+
func (c cmdable) ZMScore(ctx context.Context, key string, members ...string) *FloatSliceCmd {
2015+
args := make([]interface{}, 2+len(members))
2016+
args[0] = "zmscore"
2017+
args[1] = key
2018+
for i, member := range members {
2019+
args[2+i] = member
2020+
}
2021+
cmd := NewFloatSliceCmd(ctx, args...)
2022+
_ = c(ctx, cmd)
2023+
return cmd
2024+
}
2025+
20132026
func (c cmdable) ZPopMax(ctx context.Context, key string, count ...int64) *ZSliceCmd {
20142027
args := []interface{}{
20152028
"zpopmax",

commands_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3151,6 +3151,33 @@ var _ = Describe("Commands", func() {
31513151
}}))
31523152
})
31533153

3154+
It("should ZMScore", func() {
3155+
zmScore := client.ZMScore(ctx, "zset", "one", "three")
3156+
Expect(zmScore.Err()).NotTo(HaveOccurred())
3157+
Expect(zmScore.Val()).To(HaveLen(2))
3158+
Expect(zmScore.Val()[0]).To(Equal(float64(0)))
3159+
3160+
err := client.ZAdd(ctx, "zset", &redis.Z{Score: 1, Member: "one"}).Err()
3161+
Expect(err).NotTo(HaveOccurred())
3162+
err = client.ZAdd(ctx, "zset", &redis.Z{Score: 2, Member: "two"}).Err()
3163+
Expect(err).NotTo(HaveOccurred())
3164+
err = client.ZAdd(ctx, "zset", &redis.Z{Score: 3, Member: "three"}).Err()
3165+
Expect(err).NotTo(HaveOccurred())
3166+
3167+
zmScore = client.ZMScore(ctx, "zset", "one", "three")
3168+
Expect(zmScore.Err()).NotTo(HaveOccurred())
3169+
Expect(zmScore.Val()).To(HaveLen(2))
3170+
Expect(zmScore.Val()[0]).To(Equal(float64(1)))
3171+
3172+
zmScore = client.ZMScore(ctx, "zset", "four")
3173+
Expect(zmScore.Err()).NotTo(HaveOccurred())
3174+
Expect(zmScore.Val()).To(HaveLen(1))
3175+
3176+
zmScore = client.ZMScore(ctx, "zset", "four", "one")
3177+
Expect(zmScore.Err()).NotTo(HaveOccurred())
3178+
Expect(zmScore.Val()).To(HaveLen(2))
3179+
})
3180+
31543181
It("should ZPopMax", func() {
31553182
err := client.ZAdd(ctx, "zset", &redis.Z{
31563183
Score: 1,

0 commit comments

Comments
 (0)