blob: 38be2701aa4658f728c13dd9d1e87e62033b33f0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package commands
import (
"errors"
"redisClone/pkg/core"
"strconv"
)
func Lrem(args []string, getShard func(k string) *core.Shard) interface{} {
key := args[1]
count, err := strconv.Atoi(args[2])
toBeRemoved := args[3]
if err != nil {
return errors.New("value is not an integer")
}
s := getShard(key)
item, exists := s.Data[key]
if !exists {
return 0
}
list, ok := item.Value.([]string)
if !ok {
return errors.New("WRONGTYPE Operation against a key holding the wrong kind of value")
}
counter := 0
absCount := count
if count < 0 {
absCount = -count
}
var newList []string
if count == 0 {
newList = []string{}
for _, value := range list {
if value == toBeRemoved {
counter++
} else {
newList = append(newList, value)
}
}
} else if count > 0 {
newList = []string{}
for _, value := range list {
if value == toBeRemoved && counter < absCount {
counter++
} else {
newList = append(newList, value)
}
}
} else { // count < 0
reversedNewList := []string{}
for i := len(list) - 1; i >= 0; i-- {
value := list[i]
if value == toBeRemoved && counter < absCount {
counter++
} else {
reversedNewList = append(reversedNewList, value)
}
}
newList = make([]string, len(reversedNewList))
for i, v := range reversedNewList {
newList[len(reversedNewList)-1-i] = v
}
}
if len(newList) == 0 {
delete(s.Data, key)
} else {
item.Value = newList
s.Data[key] = item
}
return counter
}
|