-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpaging.go
139 lines (120 loc) · 2.7 KB
/
paging.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package redistructs
import (
"context"
"reflect"
"time"
"github.com/go-redis/redis/v8"
"github.com/octo-5/redistructs/util"
)
type Paging struct {
redis redis.Cmdable
metaKey string
dataPrefix string
dataExpiry time.Duration
needRetention bool
maxRetentionEntry int64
retentionAfter time.Duration
logger Logger
reversed bool
}
func NewPaging(redis redis.Cmdable, metaKey ...string) *Paging {
paging := &Paging{
redis: redis,
dataExpiry: 5 * time.Minute,
maxRetentionEntry: 10000,
retentionAfter: 15 * time.Minute,
logger: DefaultLogger{},
}
if len(metaKey) > 0 {
paging.metaKey = metaKey[0]
paging.dataPrefix = metaKey[0]
}
return paging
}
func (p *Paging) Redis(cmdable redis.Cmdable) *Paging {
p.redis = cmdable
return p
}
func (p *Paging) MetaKey(key string) *Paging {
p.metaKey = key
p.dataPrefix = key
return p
}
func (p *Paging) Desc() *Paging {
p.reversed = true
return p
}
func (p *Paging) Retention(maxEntry int64, after time.Duration) *Paging {
if after > 0 {
p.needRetention = true
}
p.maxRetentionEntry = maxEntry
p.retentionAfter = after
return p
}
func (p *Paging) DataKeyPrefix(prefix string) *Paging {
p.dataPrefix = prefix
return p
}
func (p *Paging) DataExpiry(expiry time.Duration) *Paging {
p.dataExpiry = expiry
return p
}
func (p *Paging) Logger(logger Logger) *Paging {
p.logger = logger
return p
}
func (p *Paging) Clone() *Paging {
return &Paging{
metaKey: p.metaKey,
maxRetentionEntry: p.maxRetentionEntry,
retentionAfter: p.retentionAfter,
redis: p.redis,
dataPrefix: p.dataPrefix,
dataExpiry: p.dataExpiry,
logger: p.logger,
}
}
func (p *Paging) Delete(ids ...string) *PagingDeleter {
deleter := &PagingDeleter{
ctx: context.Background(),
paging: p,
ids: ids,
}
return deleter
}
func (p *Paging) Read() *PagingReader {
reader := &PagingReader{
ctx: context.Background(),
paging: p,
}
return reader
}
func (p *Paging) Write(values interface{}) *PagingWriter {
writer := &PagingWriter{
ctx: context.Background(),
paging: p,
}
if values == nil {
return writer
}
t := util.IndirectValue(values)
switch k := t.Type().Kind(); k {
case reflect.Array, reflect.Slice:
writer.datas = make([]*PagingData, t.Len())
for i := 0; i < t.Len(); i++ {
data, err := newPagingData(t.Index(i).Interface(), p.dataPrefix, p.dataExpiry)
if err != nil {
panic(err)
}
writer.datas[i] = data
}
default:
data, err := newPagingData(values, p.dataPrefix, p.dataExpiry)
if err != nil {
panic(err)
}
writer.datas = append(writer.datas, data)
}
return writer
}