-
Notifications
You must be signed in to change notification settings - Fork 13
/
link.go
83 lines (71 loc) · 1.43 KB
/
link.go
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
76
77
78
79
80
81
82
83
package model
import (
"encoding/json"
"github.com/ego008/youdb"
"sort"
)
type Link struct {
Id uint64 `json:"id"`
Name string `json:"name"`
Url string `json:"url"`
Score int `json:"score"`
}
func LinkGetById(db *youdb.DB, lid string) Link {
var item Link
rs := db.Hget("link", youdb.DS2b(lid))
if rs.State == "ok" {
json.Unmarshal(rs.Data[0], &item)
}
return item
}
func LinkSet(db *youdb.DB, obj Link) {
if obj.Id == 0 {
// add
newId, _ := db.HnextSequence("link")
obj.Id = newId
}
jb, _ := json.Marshal(obj)
db.Hset("link", youdb.I2b(obj.Id), jb)
}
func LinkList(db *youdb.DB, getAll bool) []Link {
var items []Link
itemMap := map[uint64]Link{}
startKey := []byte("")
for {
rs := db.Hscan("link", startKey, 20)
if rs.State == "ok" {
for i := 0; i < len(rs.Data)-1; i += 2 {
startKey = rs.Data[i]
item := Link{}
json.Unmarshal(rs.Data[i+1], &item)
if getAll {
// included score == 0
itemMap[youdb.B2i(rs.Data[i])] = item
} else {
if item.Score > 0 {
itemMap[youdb.B2i(rs.Data[i])] = item
}
}
}
} else {
break
}
}
if len(itemMap) > 0 {
type Kv struct {
Key uint64
Value int
}
var ss []Kv
for k, v := range itemMap {
ss = append(ss, Kv{k, v.Score})
}
sort.Slice(ss, func(i, j int) bool {
return ss[i].Value > ss[j].Value
})
for _, kv := range ss {
items = append(items, itemMap[kv.Key])
}
}
return items
}