mirror of https://github.com/ledisdb/ledisdb.git
add zunionstorecommand & zinterstorecommand in server pkg
This commit is contained in:
parent
87fdc9125e
commit
cb908a859c
|
@ -315,7 +315,6 @@ func TestZUnionStore(t *testing.T) {
|
||||||
t.Fatal("invalid value ", v)
|
t.Fatal("invalid value ", v)
|
||||||
}
|
}
|
||||||
|
|
||||||
pairs, _ := db.ZRange(out, 0, -1)
|
|
||||||
n, err = db.ZCount(out, 0, 0XFFFE)
|
n, err = db.ZCount(out, 0, 0XFFFE)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -520,6 +520,120 @@ func zpersistCommand(req *requestContext) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func zparseZsetoptStore(args [][]byte) (destKey []byte, srcKeys [][]byte, weights []int64, aggregate byte, err error) {
|
||||||
|
destKey = args[0]
|
||||||
|
nKeys, err := strconv.Atoi(ledis.String(args[1]))
|
||||||
|
if err != nil {
|
||||||
|
err = ErrValue
|
||||||
|
return
|
||||||
|
}
|
||||||
|
args = args[2:]
|
||||||
|
if len(args) < nKeys {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
srcKeys = args[:nKeys]
|
||||||
|
|
||||||
|
args = args[nKeys:]
|
||||||
|
|
||||||
|
var weightsFlag = false
|
||||||
|
var aggregateFlag = false
|
||||||
|
|
||||||
|
for len(args) > 0 {
|
||||||
|
if strings.ToLower(ledis.String(args[0])) == "weights" {
|
||||||
|
if weightsFlag {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
args = args[1:]
|
||||||
|
if len(args) < nKeys {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
weights = make([]int64, nKeys)
|
||||||
|
for i, arg := range args[:nKeys] {
|
||||||
|
if weights[i], err = ledis.StrInt64(arg, nil); err != nil {
|
||||||
|
err = ErrValue
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args = args[nKeys:]
|
||||||
|
|
||||||
|
weightsFlag = true
|
||||||
|
|
||||||
|
} else if strings.ToLower(ledis.String(args[0])) == "aggregate" {
|
||||||
|
if aggregateFlag {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(args) < 2 {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.ToLower(ledis.String(args[1])) == "sum" {
|
||||||
|
aggregate = ledis.AggregateSum
|
||||||
|
} else if strings.ToLower(ledis.String(args[1])) == "min" {
|
||||||
|
aggregate = ledis.AggregateMin
|
||||||
|
} else if strings.ToLower(ledis.String(args[1])) == "max" {
|
||||||
|
aggregate = ledis.AggregateMax
|
||||||
|
} else {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
args = args[2:]
|
||||||
|
aggregateFlag = true
|
||||||
|
} else {
|
||||||
|
err = ErrSyntax
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !aggregateFlag {
|
||||||
|
aggregate = ledis.AggregateSum
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func zunionstoreCommand(req *requestContext) error {
|
||||||
|
args := req.args
|
||||||
|
if len(args) < 2 {
|
||||||
|
return ErrCmdParams
|
||||||
|
}
|
||||||
|
|
||||||
|
destKey, srcKeys, weights, aggregate, err := zparseZsetoptStore(args)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if n, err := req.db.ZUnionStore(destKey, srcKeys, weights, aggregate); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
req.resp.writeInteger(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func zinterstoreCommand(req *requestContext) error {
|
||||||
|
args := req.args
|
||||||
|
if len(args) < 2 {
|
||||||
|
return ErrCmdParams
|
||||||
|
}
|
||||||
|
|
||||||
|
destKey, srcKeys, weights, aggregate, err := zparseZsetoptStore(args)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if n, err := req.db.ZInterStore(destKey, srcKeys, weights, aggregate); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
req.resp.writeInteger(n)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
register("zadd", zaddCommand)
|
register("zadd", zaddCommand)
|
||||||
register("zcard", zcardCommand)
|
register("zcard", zcardCommand)
|
||||||
|
@ -536,6 +650,9 @@ func init() {
|
||||||
register("zrevrangebyscore", zrevrangebyscoreCommand)
|
register("zrevrangebyscore", zrevrangebyscoreCommand)
|
||||||
register("zscore", zscoreCommand)
|
register("zscore", zscoreCommand)
|
||||||
|
|
||||||
|
register("zunionstore", zunionstoreCommand)
|
||||||
|
register("zinterstore", zinterstoreCommand)
|
||||||
|
|
||||||
//ledisdb special command
|
//ledisdb special command
|
||||||
|
|
||||||
register("zclear", zclearCommand)
|
register("zclear", zclearCommand)
|
||||||
|
|
|
@ -599,3 +599,48 @@ func TestZsetErrorParams(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestZUnionStore(t *testing.T) {
|
||||||
|
c := getTestConn()
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
if _, err := c.Do("zadd", "k1", "1", "one"); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := c.Do("zadd", "k1", "2", "two"); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := c.Do("zadd", "k2", "1", "two"); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := c.Do("zadd", "k2", "2", "three"); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if n, err := ledis.Int64(c.Do("zunionstore", "out", "2", "k1", "k2", "weights", "1", "2")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else {
|
||||||
|
if n != 3 {
|
||||||
|
t.Fatal("invalid value ", n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n, err := ledis.Int64(c.Do("zunionstore", "out", "2", "k1", "k2", "weights", "1", "2", "aggregate", "min")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else {
|
||||||
|
if n != 3 {
|
||||||
|
t.Fatal("invalid value ", n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n, err := ledis.Int64(c.Do("zunionstore", "out", "2", "k1", "k2", "aggregate", "max")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else {
|
||||||
|
if n != 3 {
|
||||||
|
t.Fatal("invalid value ", n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue